Расчет нормальной матрицы в OpenGL

Следующий сайт говорит использовать матрицу model_view при вычислении нормальной матрицы (при условии, что мы не используем встроенную gl_NormalMatrix): (site)Светлый дом. У меня есть следующий алгоритм в моей программе:

//Calculate Normal matrix

// 1. Multiply the model matrix by the view matrix and then grab the upper left
// corner 3 x 3 matrix.
mat3x3 mv_orientation = glext::orientation_matrix<float, glext::column>(
glext::model_view<float, glext::column>(glext_model_, glext_view_));

// 2. Because openGL matrices use homogeneous coordinate an affine inversion
// should work???
mv_orientation.affine_invert();

// 3. The normal matrix is defined as the transpose of the inverse of the upper
// left 3 X 3 matrix
mv_orientation.transpose();

// 4. Place this into the shader
basic_shader_.set_uniform_3d_matrix("normal_matrix", mv_orientation.to_gl_matrix());

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

1

Решение

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

3

Другие решения

Не включаете ли вы матрицу проекции в вычисление нормальной матрицы?

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

Если нет, то почему матрица проекции не влияет на нормали, как на точки?

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

2

По вопросам рекламы [email protected]