Трехмерная геометрия: преобразование одной пары точек для параллельного выравнивания - PullRequest
1 голос
/ 31 октября 2008

У меня есть линия (на самом деле куб), идущая от (x1, y1, z1) к (x2, y2, z2). Я хотел бы повернуть его так, чтобы он выровнялся вдоль другой линии, идущей от (x3, y3, z3) к (x4, y4, z4). В настоящее время я использую Math::Atan2 вместе с Matrix::RotateYawPitchRoll. Есть ли лучшие способы сделать это?

Редактировать: Я думаю, что я написал этот пост очень плохо. Что я на самом деле ищу, так это матрицу вращения из двух векторов.

Ответы [ 2 ]

4 голосов
/ 31 октября 2008

Да, вы можете сделать это, не думая об углах вообще.

Поскольку у вас есть куб, предположим, что вы выбрали один угол, а затем задали 3 ребра, выходящие из него, как векторы f0, f1, f2 (это векторы направления относительно выбранного вами угла). Нормализуйте их и запишите их в виде столбцов в матрице F

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)

Теперь сделайте то же самое для векторов t0, t1, t2 куба, в который вы хотите повернуть, и назовите его матрицей T.

Теперь матрица R = T * Обратная (F) - это матрица, которая поворачивается от ориентации первого куба к ориентации второго (поскольку обратная F отображает, например, f0 в (1 0 0) ', а затем T карты (1 0 0) 'в t0).

Если вы хотите знать, почему это работает, подумайте с точки зрения базисных векторов системы координат: если вы хотите повернуть оси XY и Z в новую систему координат, то столбцы матрицы вращения - это просто нужные вам векторы (1 0 0) ', (0 1 0)' & (0 0 1) 'для сопоставления. T * Inverse (F) эффективно поворачивает ваш куб от его первоначальной ориентации к выровненной оси, а затем к желаемой ориентации.

(Извините, выше для векторов столбцов и преобразований слева, в стиле OpenGL. Кажется, я помню, что Direct3D - это векторы строк и преобразований справа, но должно быть очевидно, как его переключать).

Это также одинаково применимо к матрицам 4x4 с компонентом перевода.

0 голосов
/ 11 ноября 2008

Возможно, вы захотите добавить, как на самом деле интерполировать матрицы. Матрицы источника и назначения хороши в вашем ответе, но вычислять обратное бессмысленно. Кватернионы дадут вам кратчайший путь вращения, поэтому возьмите матрицы вращения 3х3 на обеих матрицах, преобразуйте их в кватернионы и переберите их. Сделайте отдельный перевод для перевода и поменяйте состав. Google для кватернионов - матричные и обратные преобразования и кватернионные lerp.

Редактировать: матрица вращения от вектора вперед и вверх тривиальна. Отсутствующий столбец является перекрестным произведением двух других векторов. (не забудьте нормализовать столбцы).

...