Матрица вида модели выглядит так:
( X-axis.x, X-axis.y, X-axis.z, 0 )
( Y-axis.x, Y-axis.y, Y-axis.z, 0 )
( Z-axis.x, Z-axis.y, Z-axis.z, 0 )
( trans.x, trans.y, trans.z, 1 )
Верхняя буква 3 * 3 содержит ориентацию и масштаб. 4-я строка содержит перевод.
В то время как для преобразования точки должна учитываться полная матрица, для преобразования вектора направления представляет интерес только ориентация.
Как правило, нормальная матрица представляет собой mat3
и inverse
, transposed
в верхнем левом 3 * 3 матрицы вида модели. См
mat3 norm_matrix;
vec3 = normalize(norm_matrix * vertNormal);
Нормальная матрица может быть вычислена из матрицы вида модели:
mat4 mv_matrix;
mat3 norm_matrix = transpose(inverse(mat3(mv_matrix));
vec3 N = normalize(norm_matrix * vertNormal);
Если матрица вида модели представляет собой Ортогональную матрицу , то inverse
, transpose
можно пропустить, поскольку обратная матрица равна транспонированной матрице.
См. . В каких случаях обратная матрица равна транспонированию?
vec3 N = normalize(mat3(mv_matrix)* vertNormal);
Если вы хотите выполнить вычисления в пространстве вида, то вам необходимо преобразовать координату вершины из пространства модели в пространство просмотра:
vec4 P = mv_matrix * vec4(vertPos,1.0);
и для просмотра пространства необходимо преобразовать направление пространства модели векторной формы:
vec3 N = normalize(norm_matrix * vertNormal);