Я знаю, что 3D-ротация хорошо документирована на SO и многих других сайтах, но, несмотря на чтение бесчисленных объяснений, я до сих пор не понял, где я ошибаюсь. Мой опыт в искусстве и дизайне, а не в математике и программировании, и я никогда не уверен, что мой угол атаки (не каламбур) является правильным. Вместо того, чтобы вставлять пэдворк моего мрачного кода, я включаю изображение, описывающее мою проблему. Мне бы очень хотелось, это поэтапное разбиение на то, как его решить. Псевдокод полезен, но я узнаю больше, если кто-то просто нацелит меня в правильном направлении или укажет на общие подводные камни.
Красный = ось X, зеленый = ось Y, синий = ось Z
Пурпурные векторы = начало → некоторые X, Y, Z точка
Magenta cube = среднее значение конечных точек двух пурпурных векторов (есть ли лучшее название для этого?)
Белый вектор = перекрестное произведение двух пурпурных векторов (расширенное для отображения, фактический вектор нормализуется)
Объект Cyan cube = сбой вращения
Ранее я использовал 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
Спасибо заранее,
Кейси
Изменить: запуск баунти
Возможно, я не понимаю, как это должно работать. Вот еще одно изображение:
Я неправильно понял, что этот пурпурный вектор является осью, а оранжевые стрелки показывают вращение вокруг этой оси на основе угла? Так или иначе, я хочу сориентировать голубой куб на основе какого-то направленного вектора и открутить его. Что я делаю неправильно??