2013-12-09 47 views
0

由于制作了一些简单的多人游戏,我选择了THREE.js在浏览器端实现图形。在浏览器中一切正常。node.js环境中的THREE.js

转念一想: 服务器必须检查用户最行动。所以我需要在服务器上进行全局复制,与用户进行交互,然后将其状态返回给用户。

那么,作为良好的代码已经针对客户端写 - 我做到了Node.js的兼容,并继续前行。 (良好的碰撞检测,这可以用object.geometry - 正是我想要的那么糟糕)

结果,碰撞检测代码停止工作。在服务器端Raycaster退出上 串

} else if (object instanceof THREE.Mesh) { 

     var geometry = object.geometry; 

     // Checking boundingSphere distance to ray 

     if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); 

     sphere.copy(geometry.boundingSphere); 
     sphere.applyMatrix4(object.matrixWorld); 

     if (raycaster.ray.isIntersectionSphere(sphere) === false) { 
      return intersects; // _HERE_ 

     } 

而且这种情况发生,因为object.matrixWorld身份矩阵。 但是进行对象初始化。 mesh.positionmesh.rotation在服务器和客户端是相同的(在浏览器中,raycaster作为魅力);

我的思考,说,object.matrixWorld会在某处renderer.render(self.three_scene, self.camera);更新。但当然,这不是我想在服务器端做的。

所以现在的问题是:如何使object.matrixWorld更新在服务器端每个仿真时间?

或者,也许建议,如果有一些其他的方式来获得我想要的东西。

回答

1

Okey。

这很简单。

renderer.render更新整个场景的矩阵递归。递归的入口是Object3D实例的功能updateMatrixWorld()

因此,在我们使用服务器端的Raycaster之前,我们应该为可碰撞网格列表中的每个网格调用此方法。

+0

正在为此挣扎两个小时“为什么我的raycaster在本地工作,但不在服务器端?”非常感谢,这使得它现在在服务器端工作:) – Starwave