Как рассчитать матрицу вращения 3х3 из 2 векторов направления?

10

У меня есть 2 вектора направления для оси X и оси Y объекта. Как рассчитать матрицу вращения объекта с помощью этих?

Вспышка
источник

Ответы:

17

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

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Обратите внимание, что приведенное выше не делает предположений о векторах X и Y (за исключением того, что они не идентичны), и выполняет много дополнительных математических операций, которые могут не потребоваться в вашей ситуации.

Например, в этом коде я делаю второй перекрестный продукт, чтобы убедиться, что наша матрица получает ортогональную ось Y, вместо того, чтобы слепо полагать, что входные оси X и Y разнесены точно на 90 градусов. Если в вашей ситуации вы уверены, что ваши входные оси действительно ортогональны друг другу, то вы можете пропустить второе перекрестное произведение и просто назначить входной вектор Y напрямую, а не пересчитывать его.

Обратите внимание, что я предполагаю, что ваше матричное представление имеет доступные векторные члены 'X, Y, Z'. Некоторые реализации просто предоставляют вместо этого массив из девяти чисел с плавающей точкой, и в этом случае вектор 'X' будет представлять собой либо элементы 0, 1 и 2, либо 0, 3 и 6, в зависимости от того, является ли матрица главной строкой или столбцом- крупный. В этой (раздражающей) ситуации я обычно нахожу, что проще просто попробовать оба способа и посмотреть, какой из них работает, чем искать документацию, чтобы попытаться выяснить, какой порядок использует ваша конкретная матричная реализация. :)

Наконец, обратите внимание, что в зависимости от руки вашей трехмерной системы координат вам может понадобиться умножить MZ на отрицательную, чтобы сгенерировать допустимую матрицу вращения для вашего трехмерного движка.

Тревор Пауэлл
источник
Большое спасибо! Я сделаю это и сообщу вам мои результаты.
TheFlash
Спасибо за очень полезный ответ! Мне, однако, любопытно: разве X-вектор не всегда элементы 0, 1 и 2, независимо от того, является ли матрица мажорной строкой или столбцом? 0, 3 и 6 означают доступ к первому столбцу матрицы строк или наоборот.
fbrereto
1
+1, по крайней мере, для утверждения (), что два вектора не равны, но я думаю, вам также следует потребовать, чтобы они не были нулевыми векторами.
hans_meine
1
Обратите внимание, что это не учитывает случай, когда Xесть -Y.
Rafał Cieślak