2012-02-21 2 views
7

L 시스템 인터프리터에서 작업 중이며 회전의 내부 표현으로 쿼터니언을 사용합니다. 결과를 ThreeJs JavaScript 장면으로 내보내고 싶습니다. 어떻게해야하는지 json 장면을 가장 좋은 방법으로 생각했습니다.Three.js json scene에서 quaternion rotation을 사용하는 방법

장면의 한 예가 https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js에 있지만 쿼터니언 교체에 관한 내용은 없습니다.

그래서 나는 http://threejs.org/io/s/quaternion에 도움을 사용 는 "회전을사원 수useQuaternion 특성을 가지고 있지만 그것은 오류가 아마가 없기 때문에의 (장면 로더가 발생, 작동하지 않는 것 같다 THREE.Object3D 것을 발견 나는 순서 Y 가정 (나는 또한 오일러 각에 쿼터니언으로 변환하려고했습니다

"obj": { 
    ... 
    "quaternion": [0.38268343236509,0,0,0.923879532511287], 
    "useQuaternion": true 
} 

하지만 그것은 습관 때문에 아마 각도의 적용의 다른 순서로, 나를 위해 작동 : "속성은) 마지막에 편집을 참조 Z, X). 위의 예에서 쿼터니온은 Z 축 (피치)을 기준으로 135도 회전을 나타내며 오일러 각 [pi, pi, pi/4]으로 변환되지만 장면에서는 정확하지 않습니다.

다음 그림은 Z 축에 의해 다른 것보다 11 °만큼 회전 된 블록을 보여줍니다. 축은 X (빨강), Y (녹색) 및 Z (파랑)입니다. 유클리드로의 잘못된 변환 쿼터니언 때문에 상반부가 잘못 회전합니다 (구현을 위해이 페이지를 사용했습니다 : http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/).

ilustration of the problem
편집 : 더 검사 후 현장 로더에 의해 제기 된 오류 때문에 개체에없는 "회전"속성이다. 다음 출력에서는 오류가 발생하지 않고 장면이로드되지만 쿼터니언 순환이 무시되므로 잘못 표시됩니다 (표시된 이미지와 같은 방식으로).

"obj": { 
    ... 
    "rotation": [3.14159265358979,3.14159265358979,0.785398163397449], 
    "quaternion": [0.38268343236509,0,0,0.923879532511287], 
    "useQuaternion": true 
} 
+0

장면 로더가 제기 한 오류 메시지에 더 많은 것이 있습니까? 특히 쿼터니언 사용에 대해 마음에 들지 않는 점이 무엇입니까? –

+0

좋아, "회전"속성이 누락되어 오류가 발생합니다. 장면 로더는 아마도 쿼터니언 회전을 전혀로드하지 않습니다. – NightElfik

답변

4

나는 내 문제를 해결했다고 생각합니다. 이것은 내 질문에 대한 직접적인 대답이 아니며, 어떻게 해결할 수있는 방법 일뿐입니다.

문제는 장면 로더에 있으며 쿼터니언 교체에서는 작동하지 않습니다. JS에서 장면을 직접 생성하기 위해 장면 생성 스크립트를 다시 작성했습니다.

var mesh = new THREE.Mesh(geometry, material); 
... set position & scale ... 
mesh.rotation.x = 3.141; 
mesh.rotation.y = 3.141; 
mesh.rotation.z = 0.785; 
mesh.updateMatrix(); 
scene.add(mesh); 

는 그럼 난 내 사원 수 - 오일러 변환을 위해 설계되었습니다, 내 문제 (문제의 첨부 이미지)를 일으키는 기본에 'XYZ'로 설정되어을 THREE.Object3D 에 eulerOrder 마법 재산 발견 'YZX'그래서 나는 그것을 바꿨다.

mesh.eulerOrder = 'YZX'; 

그 것이다. 장면 로더를 실험 할 시간이 없지만 내 질문의 두 번째 부분에 대한 해결 방법보다 장면 로더로 eulerOrder 속성을 설정할 수있는 경우.

장면 정의에 쿼터니언을 직접 설정하는 것이 가장 좋지만 장면 로드러 자체에서 변경해야 할 수도 있습니다.