У меня есть 2 вектора направления для оси X и оси Y объекта. Как рассчитать матрицу вращения объекта с помощью этих?
Основная идея состоит в том, чтобы использовать перекрестное произведение для генерации дополнительных ортогональных осей матрицы вращения на основе уже имеющихся осей.
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 на отрицательную, чтобы сгенерировать допустимую матрицу вращения для вашего трехмерного движка.
X
есть-Y
.