Обратите внимание, что приведенный пример представляет собой левую матрицу мажорных строк .
Итак, операция такова: сначала переведите в начало координат (переместитесь на - eye ), затем поверните так, чтобы вектор от eye до At выровнялся с + z:
По сути, вы получаете тот же результат, если предварительно умножить матрицу вращения на перевод - eye :
[ 1 0 0 0 ] [ xaxis.x yaxis.x zaxis.x 0 ]
[ 0 1 0 0 ] * [ xaxis.y yaxis.y zaxis.y 0 ]
[ 0 0 1 0 ] [ xaxis.z yaxis.z zaxis.z 0 ]
[ -eye.x -eye.y -eye.z 1 ] [ 0 0 0 1 ]
[ xaxis.x yaxis.x zaxis.x 0 ]
= [ xaxis.y yaxis.y zaxis.y 0 ]
[ xaxis.z yaxis.z zaxis.z 0 ]
[ dot(xaxis,-eye) dot(yaxis,-eye) dot(zaxis,-eye) 1 ]
Дополнительные примечания:
Обратите внимание, что трансформация просмотра (преднамеренно) инвертирована : вы умножаете каждую вершину на эту матрицу, чтобы "переместить мир", чтобы часть, которую вы хотите увидеть, оказалась в объеме канонического представления.
Также обратите внимание, что компонент матрицы вращения (назовите ее R ) матрицы LookAt представляет собой инвертированное изменение базиса матрицы, где строки R новые базисные векторы в терминах старых базисных векторов (следовательно, имена переменных xaxis.x, .. xaxis - это ось new x после изменения базиса). Однако из-за инверсии строки и столбцы транспонируются.