Я знаю, что 3D-ротация хорошо документирована на SO и многих других сайтах, но, несмотря на чтение бесчисленных объяснений, я до сих пор не понял, где я ошибаюсь.Я занимаюсь искусством и дизайном, а не математикой и программированием, и я никогда не уверен, правильный ли у меня угол атаки (без каламбура).Вместо того, чтобы вставлять лоскутное одеяло из моего мрачного кода, я включаю изображение, описывающее мою проблему.Что мне действительно нравится, так это пошаговая формулировка того, как ее решить.Псевдокод полезен, но я узнаю больше, если кто-то просто нацелит меня в правильном направлении или укажет на распространенные ошибки.
Красный = ось X,Зеленый = Ось Y, Синий = Ось Z
Пурпурные векторы = начало координат -> некоторая точка X, Y, Z
Пурпурный куб = среднее из конечных точек двух пурпурных векторов (есть ли лучшее имя для этого?)
Белый вектор = перекрестное произведение двух пурпурных векторов (расширенный для отображения, фактический вектор нормализован)
Объект голубого куба = ошибка поворота
Ранее я использовал Away3D и Papervision;в этих библиотеках, применяя углы Эйлера к свойствам rotX, RotationY или RotationZ объекта, будет поворачивать объект локально, как если бы он находился в начале координат независимо от его фактического положения.С Three.js это не так.Изменение свойств объекта direction.x и вращение объекта производит странный эффект, где объект очевидно немного наклоняется на оси 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
Заранее спасибо,
Кейси
Редактировать: Начинается вознаграждение
Может быть, я неправильно понимаю, как это должно работать.Вот еще одно изображение:
Неправильно ли я считаю, что этот пурпурный вектор является осью, а оранжевые стрелки указывают поворот вокруг этой оси на основе угла?Так или иначе, я хочу ориентировать голубой куб на некоторый вектор направления и вращать его.Что я делаю не так!?