Я работаю над интерпретатором L-системы и использую кватернион в качестве внутреннего представления вращения. Мне нужно экспортировать результат в ThreeJs JavaScript scene, и я нашел json scene как лучший способ, как это сделать.
Я нашел один пример сцены на https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js, но там нет ничего о кватернионных вращениях.
Поэтому я воспользовался помощью на http://threejs.org/io/s/quaternion и обнаружил, что THREE. Object3D имеет свойства quaternion и useQuaternion, но они, похоже, не работают, загрузчик сцены выдает ошибку (возможно, из-за отсутствия атрибута "rotation", см. EDIT в конце):
"obj": {
...
"quaternion": [0.38268343236509,0,0,0.923879532511287],
"useQuaternion": true
}
Я также пытался преобразовать кватернион в углы Эйлера, но у меня это не работает, возможно, из-за другого порядка применения углов (я предполагаю порядок Y, Z, X). В приведенном выше примере кватернион представляет поворот вокруг оси Z (тангаж) на 135 градусов, который преобразуется в углы Эйлера [pi,pi,pi/4], но в сцене он отображается неправильно.
На следующем рисунке показаны блоки, каждый из которых повернут на 11 градусов больше другого по оси Z. Оси - X (красная), Y (зеленая) и Z (синяя). Верхняя половина повернута неправильно из-за неправильного преобразования кватерниона в Евклид (для реализации я использовал эту страницу: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/ ).
EDIT: После дальнейшего изучения ошибка, выдаваемая загрузчиком сцены, связана с отсутствием атрибута "rotation" у объекта. Следующий вывод не выдает ошибку и сцена загружается, но неправильно (так же, как показано на рисунке), потому что кватернионные вращения игнорируются.
"obj": {
...
"rotation": [3.14159265358979,3.14159265358979,0.785398163397449],
"quaternion": [0.38268343236509,0,0,0.923879532511287],
"useQuaternion": true
}