[英]three.js serverside collision detection error
服務器端對three.js的沖突檢測的使用與客戶端的使用有區別的原因嗎? 我們在同一場景中使用相同的設置客戶端和服務器端。
我們正在嘗試做的事情是在服務器端確定是否與世界發生沖突。 為簡單起見,我們僅使用2個盒子作為我們的世界。 使用的代碼摘自Lee Stemkoski碰撞檢測示例(為此,我們感謝他-它非常清楚)。
客戶端代碼運行流暢且沒有問題,但是以完全相同的方式啟動的服務器端代碼不會檢測到沖突。 在我們的演示中,玩家使用他的箭頭移動。 此動作被發送到服務器,該服務器與客戶端具有完全相同的場景。 然后應用轉換(旋轉,位置更改等),然后將這些新位置發送回去。 服務器和客戶端已同步到此處。 但是,客戶端使用我們的對象(2個框)檢測到點擊,而服務器未檢測到。
客戶端:
socket.on("update", function(data){
var delta = clock.getDelta(); // seconds.
var moveDistance = 200 * delta; // 200 pixels per second
var rotateAngle = Math.PI / 2 * delta; // pi/2 radians (90 degrees) per second
if( data.type == "rot" ){
MovingCube.rotation.x = data.x;
MovingCube.rotation.y = data.y;
MovingCube.rotation.z = data.z;
}
if( data.type == "pos" ){
MovingCube.position.x = data.x;
MovingCube.position.y = data.y;
MovingCube.position.z = data.z;
}
var originPoint = MovingCube.position.clone();
for (var vertexIndex = 0; vertexIndex < MovingCube.geometry.vertices.length; vertexIndex++){
var localVertex = MovingCube.geometry.vertices[vertexIndex].clone();
var globalVertex = localVertex.applyMatrix4( MovingCube.matrix );
var directionVector = globalVertex.sub( MovingCube.position );
var ray = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
var collisionResults = ray.intersectObjects( collidableMeshList );
if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length() )
console.log(" Hit ");
}
})
服務器端代碼
socket.on("update", function(data){
console.log("updating location");
var delta = 0.1 ;//clock.getDelta(); // seconds.
var moveDistance = 200 * delta; // 200 pixels per second
var rotateAngle = Math.PI / 2 * delta; // pi/2 radians (90 degrees) per second
if( data == "A" ){
MovingCube.rotation.y += rotateAngle;
socket.emit("update",{"type":"rot","x":MovingCube.rotation.x,"y":MovingCube.rotation.y,"z":MovingCube.rotation.z});
}
if( data == "D" ){
MovingCube.rotation.y -= rotateAngle;
socket.emit("update",{"type":"rot","x":MovingCube.rotation.x,"y":MovingCube.rotation.y,"z":MovingCube.rotation.z});
}
if ( data == "left" ){
MovingCube.position.x -= moveDistance;
socket.emit("update",{"type":"pos","x":MovingCube.position.x,"y":MovingCube.position.y,"z":MovingCube.position.z});
}
if ( data == "right" ){
MovingCube.position.x += moveDistance;
socket.emit("update",{"type":"pos","x":MovingCube.position.x,"y":MovingCube.position.y,"z":MovingCube.position.z});
}
if ( data == "up" ){
MovingCube.position.z -= moveDistance;
socket.emit("update",{"type":"pos","x":MovingCube.position.x,"y":MovingCube.position.y,"z":MovingCube.position.z});
}
if ( data == "down" ){
MovingCube.position.z += moveDistance;
socket.emit("update",{"type":"pos","x":MovingCube.position.x,"y":MovingCube.position.y,"z":MovingCube.position.z});
}
var originPoint = MovingCube.position.clone();
for (var vertexIndex = 0; vertexIndex < MovingCube.geometry.vertices.length; vertexIndex++){
var localVertex = MovingCube.geometry.vertices[vertexIndex].clone();
var globalVertex = localVertex.applyMatrix4( MovingCube.matrix );
var directionVector = globalVertex.sub( MovingCube.position );
var ray = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
var collisionResults = ray.intersectObjects( collidableMeshList );
if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length() )
console.log(" Hit ");
}
})
任何幫助都會很棒。 現在這已經占用了我兩個星期的時間,沒有錯誤消息,而且我無法弄清楚這是怎么回事。
實際上,這里的真正問題是您的服務器端代碼可能未從threejs調用渲染循環(這當然會中斷)
但是,渲染循環會為您做一些額外的工作,它會在每個對象上調用方法updateMatrixWorld()-
因此,在服務器端,在進行raytrace(使用世界矩陣而不是實際位置)之前-請務必調用
your_objects_you_want_to_raytrace.updateMatrixWorld();
在進行實際的光線跟蹤之前。
在您的情況下,MovingCube.updateMatrixWorld();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.