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