2014-12-26 5 views
0

짧은 시간 동안이 라이브러리를 사용하고 있으며, 저를 죽이는 문제가 있습니다.physijs에서 회전 문제

필자는 phisy.js가있는 큐브 2 개와 three.js가있는 큐브 2 개를 가지고 있으며 카메라의 회전에 따라 A, S, D 또는 W 키를 누르면 회전 할 수있는 기능이 있습니다. 내 코드는 다음과 같다 다음 three.js를 큐브에

var v = new THREE.Vector3(0, 0, 0); 
    if (keys.forward === 1) 
     v.x = -1; 
    if (keys.right === 1) 
     v.z = 1; 
    if (keys.backward === 1) 
     v.x = 1; 
    if (keys.left === 1) 
     v.z = -1; 

    //get the searched angle 
    var angle = camera.rotation.y + Math.atan2(v.x, v.z); 
    var rot = normalMesh.rotation.y; 
    var diff = angle - rot; 

    if (Math.abs(diff) > Math.PI) { 
     //find the shortest way to rotate 
     if (diff > 0) 
      rot += 2 * Math.PI; 
     else 
      rot -= 2 * Math.PI; 
     diff = angle - rot; 
    } 
    //get the /2 for a smooth rotation, i really need this 
    if (diff !== 0) 
     rot += diff/2; 
    normalMesh.rotation.set(0, rot, 0); 

잘 작동하지만, physi.js 큐브에 난 작동하지 않습니다.

내가

http://demo.cristobaldiaz.cl/test/

도 내가 zip 파일 ---에 소스 코드를 왼쪽 (웹 근로자가 있기 때문에 내가 jsfiddle에 그것을 만들 할수 없어) 이것에 대한 데모를 생성하고> http://demo.cristobaldiaz.cl/test/issue.zip

당신은 당신이 마우스로 카메라를 회전하는 경우, 당신은 당신이에 큐브를 회전 할 때 문제가 발생하는 것을 확인할 수 있습니다, 95

어쨌든 http://demo.cristobaldiaz.cl/test/src/app.js 줄에 이동 기능을 확인하실 수 있습니다 빨간색 메쉬의 방향.

+2

cannon.js (다른 물리 엔진)에서 비슷한 문제가 생겼습니다. 회전이 아니라 쿼터니언을 설정해야했습니다. –

+0

감사합니다. 케빈, 저는 쿼터니온으로 시도했지만 여전히 실패했습니다. – drtobal

+0

또한'actor.physiMesh.matrix.makeRotationFromQuaternion ((새로운 THREE.Quaternion())으로 행렬 회전을 시도했습니다. setFromEuler (새 THREE.Euler (0, 썩음, 0, 'XYZ'))), ' 하지만 아무것도 : – drtobal

답변

1

당신은 애니메이션 루프에서 당신에게 회전 업데이트를 제거하고 물리적 루프로 이동할 수 있습니다 :

scene.addEventListener('update', function(){ 
    actor.onRender(); 
}) 

항상 동기화 될 것입니다이 방법을.

자세한 내용은이 페이지 https://github.com/chandlerprall/Physijs/wiki/Callbacks-&-Events을 참조하십시오.