困惑我的代码建议正常matrix相当于ModelViewmatrix

我正在学习OpenGL中的环境映射。

在他的顶点着色器中,作者使用以下代码计算眼睛空间中的顶点法线

nEye = vec3(viewMatrix * modelMatrix * vec4(vertexNormal, 0.0)); 

这是有效的,但我已经愚弄了,并对着色器代码进行了修改,以便使用此代码计算顶点法线:

 nEye = vec3(normalMatrix * vec4(vertexNormal, 0.0)); 

normalMatrix是一个统一的4×4matrix我计算着色器之外:

 objectNormalMatrix = viewMatrix * modelMatrix; objectNormalMatrix.invert(); objectNormalMatrix.transpose(); 

(我从这个问题读到,上面是你应该如何计算正常matrix)。

对于计算我使用的顶点法线的任何一种方法, 我都会得到相同的(工作)graphics结果 ,这就是让我困惑的东西。

我的问题是,为什么(viewMatrix * modelMatrix)显然等价于normalMatrix ? 在计算正常matrix时,我倒置和转置,但是当乘以(viewMatrix * modelMatrix)时我什么都不做。

以下是一些可能相关的额外信息:

  • 我在我的应用程序中使用的matrix库是列主要顺序(与OpenGL相同)。
  • 当我把我的matrix传递给glUniformMatrix GLSL时,我将其transposefalse
  • GLSL中的视图matrix和模型matrix是应用程序中的统一,它们是我在计算正常matrix时使用的完全相同的视图matrix和模型matrixmatrix。

当一个matrix是正交的时候 ,逆matrix和转置matrix是等价的,使得逆matrix的转置等于原matrix。 所以如果你的模型视图matrix是正交的,那么正常matrix就等于它。

正如user41442指出的,在大多数情况下,模型视图matrix实际上是正交的,所以这可能有点简短。 还有一些情况是不正确的,所以知道什么时候可以避开它是很好的。

旋转matrix总是正交的。 翻译不会影响法线(假设您的法线为零)。 均匀尺度不是正交的,但是它们是方向保持的,所以在均匀尺度之后重新归一化会给你相同的法线。 因此,如果你只使用统一的尺度,旋转和平移(并重新规范你的法线),你可以把它们看作是等价的。

如果你使用不均匀的尺度或剪切,另一方面你需要明确地计算一个适当的标准matrix。 如果您不完全控制使用的转换,也是如此。