簡體   English   中英

three.js服務器端沖突檢測錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM