javascript - 三.js服务器端碰撞检测错误

标签 javascript node.js three.js collision-detection

服务器端对 Three.js 碰撞检测的使用是否应该与客户端使用不同?我们使用具有相同设置客户端和服务器端的相同场景。

我们正在尝试做的事情是在服务器端确定是否与世界发生冲突。为了简单起见,我们的世界只使用了 2 个盒子。使用的代码取自 Lee Stemkoski 碰撞检测示例(我们感谢他 - 它非常出色且清晰)。

客户端代码运行顺利,没有任何问题,但以完全相同的方式启动的服务器端代码不会检测到冲突。 在我们的演示中,玩家使用箭头来移动。这个 Action 被发送到服务器,服务器的场景与客户端完全相同。然后应用变换(旋转、位置变化等),然后将这些新位置发送回。到目前为止,服务器和客户端是同步的。然而,客户端检测到我们在世界中的对象(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 ");                
  }
})

任何帮助都会很棒。这已经占用了我两周的时间,没有错误消息,我不知道出了什么问题。

最佳答案

浮点计算在不同的机器上会产生不同的结果,让我尝试为您找到一篇好文章。

给你,Floating point determinism

希望对你有帮助

关于javascript - 三.js服务器端碰撞检测错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20105396/

相关文章:

javascript - Node.js:调用纯 Javascript 函数

node.js - 当数据库中不存在行时,Sequelize 总是超时

javascript - 如何使用单选按钮更改对象的 Material ?

javascript - JS和three.js,浏览器中的参数测试

javascript - 创建基于表单选择的 Javascript 确认框 - PHP

方法中的 JavaScript

javascript - 返回了预期的输出但仍然错误?

javascript - 为 couchdb 更新 nodejs 的 nano 模块中的文档字段

three.js - 如何动态更改 GLTF 模型的纹理?

javascript - 如何在 Javascript 中制作与 Python 3 中相同的 SHA256 编码字符串?