Я работаю над интерпретатором L-системы и использую кватернион как внутреннее представление вращения.Мне нужно экспортировать результат в JavaScript-сцену ThreeJs, и я нашел 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 , но, похоже,чтобы не работать, ошибка вызывается загрузчиком сцены (вероятно, из-за отсутствия атрибута «поворот», см. «РЕДАКТИРОВАТЬ» в конце):
"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/).
РЕДАКТИРОВАТЬ: После дальнейшего изучения ошибка, вызванная загрузчиком сцены из-за отсутствия атрибута «вращения» на объекте.Следующий вывод не выдает ошибку, и сцена загружается, но это неправильно (так же, как показано на рисунке), потому что кватернионные вращения игнорируются.
"obj": {
...
"rotation": [3.14159265358979,3.14159265358979,0.785398163397449],
"quaternion": [0.38268343236509,0,0,0.923879532511287],
"useQuaternion": true
}