2012-02-21 14 views
7

Pracuję na interprerze L-systemu i używam kwaternionu jako wewnętrznej reprezentacji rotacji. Muszę wyeksportować wynik do sceny JavaScript w ThreeJs i znalazłem scenę json jako najlepszy sposób na zrobienie tego.Jak używać rotacji kwaternionowej w jsonie Three.js

Znalazłem jeden przykład sceny na https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js, ale nie ma nic o rotacjach kwaternionów.

Więc użyłem pomoc w http://threejs.org/io/s/quaternion i stwierdził, że THREE.Object3D ma właściwości quaternion i useQuaternion ale wydaje się nie działa, błąd jest podniesiona przez loader sceny (prawdopodobnie ze względu na brak „obrót "atrybut, zobacz EDIT na końcu):

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

próbowałem również przekonwertować kwaternion do kątów Eulera, ale to przyzwyczajenie praca dla mnie, prawdopodobnie z powodu drugiej kolejności stosowania kątów (zakładam zamówienia Y, Z, X). W powyższym przykładzie kwaternion reprezentuje obrót wokół osi Z (pitch) o 135 stopni, który jest konwertowany na kąty Eulera [pi, pi, pi/4], ale jest wyświetlany niepoprawnie w scenie.

Poniższy rysunek przedstawia bloki, z których każdy jest obrócony o 11 stopni więcej niż w przypadku osi Z. Osie to X (czerwony), Y (zielony) i Z (niebieski). Górna połowa jest nieprawidłowo obracana z powodu niewłaściwego przekształcenia kwaternionu na Euclid (użyłem tej strony do wdrożenia: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/).

ilustration of the problem
EDIT: Po kolejnym badaniu błąd podniesiony przez loader sceny z powodu braku „rotacji” atrybutu obiektu. Następujące dane wyjściowe nie powodują błędu i scena jest załadowana, ale jest błędna (w taki sam sposób, jak przedstawiony obraz), ponieważ obroty kwaternionów są ignorowane.

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

Czy jest więcej do komunikatu o błędzie podniesionego przez program ładujący sceny, coś, co dokładnie mówi, co nie podoba się w przypadku korzystania z kwaternionów? –

+0

OK, przyczyną błędu jest brakujący atrybut "rotacja". Program ładujący sceny prawdopodobnie w ogóle nie ładuje kwaternionów. – NightElfik

Odpowiedz

4

Myślę, że rozwiązałem mój problem. To nie jest bezpośrednia odpowiedź na moje pytanie, tylko jak to obejść.

Problem dotyczy programu ładującego sceny, który nie działa z obrotami kwaternionów. Przepisałem skrypt generujący sceny, aby wygenerować scenę bezpośrednio w 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); 

Potem znalazłem magiczną właściwość eulerOrder na THREE.Object3D który jest ustawiony na „XYZ” zalega który powodując moje problemy (w załączeniu obraz w pytaniu), moja przemiana quaternion-Euler został zaprojektowany dla "YZX", więc to zmieniłem.

mesh.eulerOrder = 'YZX'; 

To wszystko. Nie mam czasu na eksperymentowanie z programem ładującym sceny, ale JEŚLI możliwe jest ustawienie właściwości eulerOrder za pomocą programu ładującego sceny, niż rozwiązanie drugiej części mojego pytania.

Najlepsze byłoby ustawienie kwaternionu bezpośrednio w definicji sceny, ale prawdopodobnie będzie to wymagało zmian w samym programie ładującym sceny.