2012-02-21 16 views
7

Estoy trabajando en el intérprete del sistema L y utilizo el cuaternión como representación interna de la rotación. Necesito exportar el resultado a la escena de JavaScript de ThreeJs y encontré la escena json como la mejor manera de hacerlo.Cómo usar la rotación del cuaternión en la escena Three.js json

Encontré un ejemplo de escena en https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js pero no hay nada acerca de las rotaciones del cuaternión.

por lo que utiliza ayuda a http://threejs.org/io/s/quaternion y se encontró, que THREE.Object3D tiene propiedades cuaternión y useQuaternion pero parece que no funcionan, el error se incrementa en escena cargador (probablemente debido a la falta de "rotación "atributo, consulte Editar al final):

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

también he intentado convertir cuaternión a ángulos de Euler, pero no lo puedo trabajar para mí, probablemente a causa de otra orden de aplicación de los ángulos (supongo que para Y, Z, X). En el ejemplo anterior, el cuaternión representa la rotación alrededor del eje Z (altura tonal) en 135 grados, que se convierte en ángulos de Euler [pi, pi, pi/4] pero no se muestra correctamente en la escena.

La siguiente imagen muestra los bloques rotados por 11 grados más que otros por el eje Z. Los ejes son X (rojo), Y (verde) y Z (azul). La mitad superior se rotó incorrectamente debido a la conversión incorrecta de quaternion a Euclid (utilicé esta página para la implementación: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/).

ilustration of the problem
EDIT: Después de un examen más detenido del error generado por la escena del cargador es debido a la falta de "rotación" atributo de objeto. Siguiendo la salida, no arroje error y la escena se carga, pero está equivocada (de la misma manera que la imagen mostrada) porque se ignoran las rotaciones del cuaternión.

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

¿Hay algo más en el mensaje de error planteado por el gestor de escena, algo que indica específicamente lo que no le gusta del uso de cuaterniones? –

+0

Bien, el error se debe a la falta del atributo "rotación". El cargador de escena probablemente no cargue las rotaciones del cuaternión. – NightElfik

Respuesta

4

Creo que he resuelto mi problema. Esta no es una respuesta directa a mi pregunta, solo cómo lo solucioné.

El problema está en el cargador de escenas, que no funciona con las rotaciones del cuaternión. Reescribí el script de generación de escena para generar escena directamente en 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); 

Entonces me encontré con la propiedad mágica eulerOrder en THREE.Object3D que se establece en 'XYZ' en su defecto, que estaba causando mis problemas (imagen adjunta en cuestión), mi conversión cuaternión-Euler fue diseñado para 'YZX' así que cambié eso.

mesh.eulerOrder = 'YZX'; 

Eso es todo. No tengo tiempo para experimentar con el cargador de escenas, pero SI es posible establecer la propiedad eulerOrder con el gestor de escenas de lo que será la solución a la segunda parte de mi pregunta.

Lo mejor sería establecer el cuaternión directamente en la definición de la escena, pero probablemente requerirá cambios en el cargador de escenas.

Cuestiones relacionadas