Трехмерная геометрия: преобразование одной пары точек для выравнивания параллельно другой
У меня есть линия (на самом деле куб), идущая от (x1,y1,z1) к (x2,y2,z2). Я хотел бы повернуть его так, чтобы он выровнялся вдоль другой линии, идущей от (x3,y3,z3) к (x4,y4,z4). В настоящее время я использую Math::Atan2
вместе с Matrix::RotateYawPitchRoll
, Есть ли лучшие способы сделать это?
Редактировать: я думаю, что я написал этот пост очень плохо. То, что я на самом деле ищу, это матрица вращения из двух векторов.
2 ответа
Да, вы можете сделать это, не думая об углах вообще.
Поскольку у вас есть куб, предположим, что вы выбрали один угол, а затем определяете 3 ребра, выходящие из него, как векторы f0, f1, f2 (это векторы направления относительно выбранного вами угла). Нормализуйте их и запишите их как столбцы в матрице F
(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)
Теперь сделайте то же самое для векторов t0, t1, t2 куба, в который вы хотите повернуть, и назовите его матрицей T.
Теперь матрица R = T * Inverse(F) - это матрица, которая вращается от ориентации первого куба к ориентации второго (потому что обратная F отображает, например, f0 в (1 0 0)', а затем T отображает (1 0 0) 'до t0).
Если вы хотите знать, почему это работает, подумайте с точки зрения базисных векторов системы координат: если вы хотите повернуть оси X Y и Z в новую систему координат, то столбцы матрицы вращения - это просто нужные вам векторы (1 0 0)', (0 1 0)' & (0 0 1)'для сопоставления. T*Inverse(F) эффективно поворачивает ваш куб от его первоначальной ориентации к выровненной оси, а затем к желаемой ориентации.
(Извините, выше для векторов столбцов и преобразования слева, стиль OpenGL. Кажется, я помню, что Direct3D - векторы строк и преобразования справа, но должно быть очевидно, как его переключать).
Это также одинаково хорошо подходит для матриц 4х4 с компонентом перевода.
Возможно, вы захотите добавить, как на самом деле интерполировать матрицы. Матрицы источника и назначения хороши в вашем ответе, но вычислять обратное бессмысленно. Кватернионы дадут вам кратчайший путь вращения, поэтому возьмите матрицы вращения 3х3 на обеих матрицах, преобразуйте их в кватернионы и прокачайте их. Сделайте отдельный перевод для перевода и перекомпоновайте. Google для кватернионов - матричные и обратные преобразования и кватернионные lerp.
Редактировать: матрица вращения от вектора вперед и вверх тривиальна. Отсутствующий столбец является перекрестным произведением двух других векторов. (не забудьте нормализовать столбцы).