代码之家  ›  专栏  ›  技术社区  ›  APO

直接使用modelViewmatrix和使用normalMatrix有什么不同?

  •  0
  • APO  · 技术社区  · 3 年前

    我正在处理一些着色器,我需要变换法线。

    我在一些教程中读到了变换法线的方法 将它们与modelview矩阵的逆矩阵相乘 .但我找不到解释为什么会这样,以及背后的逻辑是什么?

    0 回复  |  直到 3 年前
        1
  •  51
  •   Tommy    12 年前

    它来源于法线的定义。

    假设你有正常的, N ,和一个向量, V ,与法线位于对象上相同位置的切线向量。那么根据定义 N·V = 0 .

    切线向量与对象曲面的运行方向相同。因此,如果曲面是平面的,那么切线就是对象上两个可识别点之间的差。所以如果 V = Q - R 哪里 Q R 如果通过以下方式变换对象,曲面上是否有点 B :

    V' = BQ - BR
       = B(Q - R)
       = BV
    

    通过考虑极限,同样的逻辑也适用于非平面表面。

    在这种情况下,假设您打算通过矩阵变换模型 B 所以 B 将应用于几何体。然后,为了弄清楚如何处理矩阵的法线, A

    (AN)·(BV) = 0
    

    将其转化为行对列,以消除显式点积:

    [tranpose(AN)](BV) = 0
    

    把转置器拉到外面,去掉支架:

    transpose(N)*transpose(A)*B*V = 0
    

    这就是“法线的转置”[product with]“已知变换矩阵的转置”[product with]“我们正在求解的变换”[product with]“模型表面上的向量”=0

    但我们先说 transpose(N)*V = 0 因为这和说 N·V=0 .所以为了满足我们的约束,我们需要表达式的中间部分 transpose(A)*B 走开。

    因此,我们可以得出结论:

     transpose(A)*B = identity
     => transpose(A) = identity*inverse(B)
     => transpose(A) = inverse(B)
     => A = transpose(inverse(B))
    
        2
  •  40
  •   wcochran    7 年前

    下面是我最喜欢的证明,其中N是法线,V是切向量。因为它们是垂直的,所以它们的点积为零。M是任意3x3可逆变换(M -1 *M=I)。N'和V'是由M变换的向量。

    enter image description here

    为了得到一些直觉,考虑下面的剪切变换。

    enter image description here

    请注意,确实如此 应用于切线向量。

        3
  •  36
  •   Community CDub    7 年前

    请看本教程:

    https://paroj.github.io/gltut/Illumination/Tut09%20Normal%20Transformation.html

    可以想象,当球体的曲面拉伸(因此球体沿一个轴或类似轴缩放)时,该曲面的法线将彼此“弯曲”。事实证明,要实现这一点,需要反转应用于法线的比例。这与使用 逆转置矩阵 .上面的链接显示了如何从中导出逆转置矩阵。

    还要注意的是,当比例均匀时,可以简单地将原始矩阵作为法线矩阵传递。假设同一个球体沿所有轴均匀缩放,曲面将不会拉伸或弯曲,法线也不会拉伸或弯曲。

        4
  •  3
  •   eric    7 年前

    如果模型矩阵由平移、旋转和缩放组成,则不需要进行逆转置来计算法线矩阵。只需将法线除以平方标度,再乘以模型矩阵,我们就完成了。你可以将其扩展到任何具有垂直轴的矩阵,只需为你正在使用的矩阵的每个轴计算平方比例即可。

    我在我的博客上写下了细节: https://lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html

        5
  •  -2
  •   Cyber176    11 年前

    我不明白为什么在与模型矩阵相乘之前,不将方向向量的第四个元素归零。不需要反转或转置。将方向向量视为两点之间的差。将两个点与模型的其余部分一起移动——它们仍然处于与模型相同的相对位置。取两点之差得到新的方向,第四个元素抵消为零。便宜多了。