2013-12-09 2 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.matrixWorldrenderer.render(self.three_scene, self.camera);의 어딘가에서 업데이트됩니다. 물론 그것은 서버 측에서하고 싶은 것이 아닙니다.

그래서 질문은 : object.matrixWorld을 서버 측의 각 시뮬레이션 틱에서 업데이트하는 방법은 무엇입니까?

내가 원한 것을 시뮬레이트하는 다른 방법이 있다면 조언을 해줄 수도 있습니다.

답변

1

Okey.

간단했습니다.

renderer.render은 전체 장면의 매트릭스를 재귀 적으로 업데이트합니다. 재귀의 입구는 Object3D 인스턴스의 updateMatrixWorld() 함수입니다.

그래서 서버 측에서 Raycaster를 사용하기 전에 collidable mesh 목록의 각 메쉬에 대해이 메서드를 호출해야합니다.

+0

좋은 2 시간 동안 "왜 내 레이 캐스터가 로컬에서 작동하지만 서버 측에서 작동하지 않습니까?" 큰 감사합니다, 이것도 서버 측에서 작동합니다 :) – Starwave