Трехмерное вращение с помощью Axis & Угол

Я знаю, что трехмерное вращение хорошо задокументировано на SO и многих других сайтах, но, несмотря на чтение бесчисленных объяснений, я все еще не понял, где я ошибаюсь. Я занимаюсь искусством и дизайном, а не математикой и программированием, и я никогда не уверен, что мой угол атаки (без каламбура) правильный. Вместо того, чтобы вставлять лоскутное одеяло из моего унылого кода, я включаю изображение, описывающее мою проблему. Что мне действительно нужно, так это подробное описание того, как решить эту проблему. Псевдокод полезен, но я узнаю больше, если кто-то просто направит меня в правильном направлении или укажет на распространенные ошибки.


alt text

Красный = ось X, зеленый = ось Y, Синий = ось Z

Пурпурные векторы = исходная точка -> некоторые точки X, Y, Z

Пурпурный куб = среднее значение двух конечных точек пурпурные векторы (есть ли лучшее название для этого?)

Белый вектор = произведение двух пурпурных векторов (расширено для отображения, фактический вектор нормализован)

Голубой кубический объект = сбой вращения


Я ранее использовались Away3D и Papervision; в этих библиотеках применение углов Эйлера к свойствам объекта rotationX, rotationY или rotationZ поворачивает объект локально, как если бы он находился в начале координат, независимо от его фактического положения. С Three.js дело обстоит иначе. Изменение свойств объекта rotation.x и rotation.y производит странный эффект, когда объект, по-видимому, немного наклоняется по оси Z. Еще больше сбивает с толку то, что это происходит, когда объект находится в начале координат. Я думал, что, возможно, использование функций Quaternion -> Matrix или Axis / Angle -> Matrix решит мою проблему, но без кубиков. Кажется, я не понимаю ключевую концепцию.

В любом случае, я бы хотел сориентировать куб по вектору перекрестного произведения (белый) так, чтобы вершина куба была обращена в его направлении. вектор. Затем я хочу повернуть куб по той же оси. Изображение, которое я прикрепил, показывает результат большего количества часов, чем я хотел бы признать, пытаясь достичь этого результата. Мой код в общих чертах выглядит так:

axis = Vector3.cross(a, b)
axis.normalize()
angle = 45 * TO_RADIANS;
quat = AxisAngle2Quaternion(axis, angle)
rot = Quaternion2Matrix(quat)
cube.matrix = rot

Заранее спасибо,

Кейси


Редактировать: Запуск награды

Возможно, я неправильно понимаю, как это должно работать. Вот еще одно изображение:

alt text

Я ошибаюсь, думая, что этот пурпурный вектор является осью, а оранжевые стрелки указывают вращение вокруг этой оси на угол? Так или иначе, я хочу ориентировать голубой куб на основе какого-то вектора направления и вращать его. Что я делаю не так!?

14
задан Casey 30 September 2010 в 05:44
поделиться