2015-06-25 3 views
1

Я пытался понять, как построена матрица вида с учетом положения камеры, точки, на которую нужно смотреть, и вектора вверх.В чем разница между этими двумя способами вычисления матрицы LookAt?

Я нашел два учебника, here и here, которые объясняют это. Однако они отличаются тем, как построена матрица представлений. В первом они создают перевод и поворот, а затем умножают их на получение матрицы вида. В последнем, однако, они просто помещают перевод в последнюю строку (столбец, в зависимости от строки соглашения/col-major).

Так что мой вопрос: почему эти два пути? Разве матрица lookAt не уникальна? Насколько я понимаю и после долгого чтения и много размышлений, мне кажется, что первый блог имеет правильный путь. Я что-то упускаю?

ответ

1

(предполагая, что строка-мажорных заказ, потому что это то, что я обычно использую)

Подумайте об этом таким образом: во-первых, у вас есть неизменяемую мир, с камерой в некотором положении с некоторым вращением. Вы знаете, что для того, чтобы попасть из этого мира в трансформированный мир, где камера находится в начале координат и указывая на + z или -z или что-то-вы, вам нужно сделать какой-то перевод (потому что камера isn 't в центре) и какой-то поворот (потому что камера может указывать в любом направлении).

Поскольку проще всего выполнить поворот, когда точка, по которой вы вращаетесь (камера), находится в начале координат, вы сначала хотите перевести камеру так, чтобы она находилась в начале координат. Вот как выглядела бы матрица:

1 0 0 -camera_x 
0 1 0 -camera_y 
0 0 1 -camera_z 
0 0 0  1 

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

a b c 0 
d e f 0 
g h i 0 
0 0 0 1 

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

view = rotation * translation 

потому что вы переводите сначала, а затем поворачиваете на второй.

Чтобы ответить на ваш вопрос: если вы вращались первым, и перевод второго, как это:

view = translation * rotation 

тогда view будет равен этому:

a b c -camera_x 
d e f -camera_y 
g h i -camera_z 
0 0 0  1 

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

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

+0

Хорошо.Я хочу сказать, хотя у меня есть некоторые наблюдения. Не является ли порядок строк большим числом, предполагаемым переводом в последней строке? Я также читал [здесь] (http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/row-major-vs-column-major-vector), который в ряду основных умножение выполняется слева направо. – BRabbit27

+0

Наконец, я понимаю разницу между обоими результатами, т. Е. 'View = translation * rotation' и' view = rotation * translation'. Однако, какой метод дал бы мне представление, как в реальной жизни, к моему пониманию, сначала перевести, а затем повернуть, даст результат, как это можно увидеть в действительности. Я что-то не понимаю? – BRabbit27

+0

О порядке умножения: в то время как матричное умножение не является коммутативным (вы не можете переключать порядок своих матриц), он * является * ассоциативным (если у вас есть матрицы A, B и C, 'A * B * C '=' (A * B) * C' = 'A * (B * C)'). Что касается вашего другого вопроса: цель матрицы просмотра состоит в том, что когда вы используете ее для преобразования мира, результат всегда будет иметь камеру в той же точке (источник) с той же ориентацией. Любая матрица, которая достигает этого эффекта, будет работать, но, как я сказал, самый простой способ сделать это в этом случае - сначала перевести, а затем повернуть. –