2013-12-09 82 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