Как использовать кватернионное вращение в сцене Three.js json - PullRequest
7 голосов
/ 21 февраля 2012

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

ilustration of the problemРЕДАКТИРОВАТЬ: После дальнейшего изучения ошибка, вызванная загрузчиком сцены из-за отсутствия атрибута «вращения» на объекте.Следующий вывод не выдает ошибку, и сцена загружается, но это неправильно (так же, как показано на рисунке), потому что кватернионные вращения игнорируются.

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

1 Ответ

4 голосов
/ 28 марта 2012

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

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

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

...