Как использовать вращение кватернионов в json-сцене Three.js

Я работаю над интерпретатором 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
}

person NightElfik    schedule 21.02.2012    source источник
comment
Есть ли что-то еще в сообщении об ошибке, вызванном загрузчиком сцены, где конкретно говорится о том, что ему не нравится в использовании кватернионов?   -  person Ben P    schedule 01.03.2012
comment
Хорошо, ошибка вызвана отсутствием атрибута вращения. Загрузчик сцены, вероятно, вообще не загружает вращения кватернионов.   -  person NightElfik    schedule 06.03.2012


Ответы (1)


Думаю, я решил свою проблему. Это не прямой ответ на мой вопрос, но как мне это обойти.

Проблема в загрузчике сцены, который не работает с поворотами кватернионов. Я переписал скрипт генерации сцены, чтобы сгенерировать сцену прямо в 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);

Затем я обнаружил волшебное свойство eulerOrder на THREE.Object3D, которое по умолчанию установлено на «XYZ», которое вызывало мои проблемы (прилагаемое изображение), мое преобразование кватерниона в эйлер был разработан для "YZX", поэтому я изменил это.

mesh.eulerOrder = 'YZX';

Вот и все. У меня нет времени экспериментировать с загрузчиком сцены, но ЕСЛИ можно установить свойство eulerOrder с загрузчиком сцены, это будет решением второй части моего вопроса.

Лучше всего было бы установить кватернион непосредственно в определении сцены, но это, вероятно, потребует изменений в самом загрузчике сцены.

person NightElfik    schedule 28.03.2012