Вычисление «вектора роста» из матрицы преобразования в 3D - PullRequest
2 голосов
/ 13 июля 2009

Я только что натолкнулся на странную проблему с моим проектом в 3D. Всем известен алгоритм вычисления вектора LookAt, но вычислить вектор «вверх» из матрицы преобразования не так просто (или, по крайней мере, я просто что-то пропустил).

Проблема заключается в следующем:

Вектор «вверх» равен (0, 1, 0) для единичной матрицы вращения и вращается вместе с матрицей, но не масштабируется и не переводится. Если у вас простая матрица вращения, процедура проста (умножьте вектор и матрицу). НО, если матрица содержит также перемещение и вращение (например, она была получена умножением нескольких других матриц), это не сработает, поскольку вектор будет преобразован и масштабирован.

Мой вопрос заключается в том, как получить этот «восходящий» вектор из одной матрицы преобразования, предполагая, что вектор (0, 1, 0) соответствует единичной матрице вращения.

Ответы [ 5 ]

6 голосов
/ 14 июля 2009

Перевод действительно влияет на это. Скажем, в примере матрица преобразования не делала масштабирования или вращения, но перевела ее на 2 единицы в направлении Z. Затем, когда вы преобразуете (0,1,0), вы получите (0,1,2), а затем нормализует его (0,1 / sqrt (5), 2 / sqrt (5)).

То, что вы хотите сделать, это взять разницу между преобразованием (0,1,0) и преобразованием (0,0,0), а затем нормализовать полученный вектор. В приведенном выше примере вы бы взяли (0,1,2) минус (0,0,2) (0,0,2 - преобразование нулевого вектора), чтобы получить (0,1,0) по желанию.

4 голосов
/ 14 июля 2009

Примените вашу матрицу к обеим конечным точкам восходящего вектора - (0, 0, 0) и (0, 1, 0). Вычислите вектор между этими двумя точками, а затем масштабируйте его, чтобы получить единичный вектор. Это должно решить проблему перевода.

2 голосов
/ 14 июля 2009

Просто умножьте вектор повышения (0,1,0) на преобразование и нормализуйте. Таким образом вы получите новый вычисленный вектор.

0 голосов
/ 16 февраля 2016

Я знаю, что это СТАРЫЙ поток, но посчитал необходимым указать на это кому-то еще, кто наткнулся на этот вопрос.

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

Базисные векторы любой матрицы (векторы, которые описывают основные направления) могут быть непосредственно считаны из соответствующего столбца матрицы. Проще говоря, ваш первый столбец - это ваш вектор "x ++", второй - вектор "y ++", третий - вектор "z ++". Если вы работаете с матрицами 4x4 в 3d, последние элементы этих столбцов и последний столбец относятся к переводу происхождения. В этом случае последний элемент каждого из этих векторов и последний столбец любой такой матрицы могут быть проигнорированы ради простоты.

Пример. Рассмотрим матрицу, представляющую поворот на 90 градусов вокруг оси y.
[0, 0, -1]
[0, 1, 0]
[1, 0, 0]

Вектор вверх может быть просто извлечен из третьего столбца как (-1, 0, 0), потому что матрица применяет поворот на 90 градусов вокруг оси y, теперь вектор вверх указывает вниз по оси x (как вектор говорит), Вы можете приобрести базисные векторы, чтобы получить положительные кардинальные направления, и отрицание их даст вам их противоположные аналоги.

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

0 голосов
/ 13 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...