变换表面法向量和切向量
Transforming surface normal vectors and tangent vectors
根据一本书 基于物理的渲染:从理论到实现。 作者:Matt Pharr,Greg Humphreys(link,第 86-87 页),
表面切向量被变换为公共向量,使用变换矩阵M,但是
表面 法向量 使用 .
进行变换
我想知道为什么缩放会使法线不正确,但不会触及切线向量?为什么法线如此特别?
见书上的图。
我读到需要这样的法线变换来保持法线和切线的正交性。但我想得到一些直观的解释。
对我来说,直觉是旋转(通常所有可以用正交矩阵描述的变换)满足
。这意味着 ,因此对于这些类型的转换,处理方式并不特殊。
一个非正交对称矩阵的简单示例说明使用 来变换法线是不够的
这里看到需要用对法线进行变换,在对称的情况下等于.
请注意,这已经涵盖了很多转换。就我个人而言,我发现非正交和非对称的变换本身不是很直观,因此我求助于数学解释,即需要保持正交性。因为这是表面法线的定义 属性,所以我觉得这个论点很合理。也许把它写出来会让事情更清楚一点:
所以书中的变换规则的优势在于,它为您提供了所有您能想到的变换的正确法线。
希望对您有所帮助。
理论上法线并不是真正的向量,它们确实是最好的 bivectors,恰好在 3D 中向量和双向量都具有三个分量,因此通常将它们识别为两个。如果我们生活在一个四维世界中,我们就不会有这种困惑。向量将有 4 个分量,而双向量有 6 个分量。
双矢量和 pseudovectors/轴向矢量之间存在细微差别。如果 i、j、k 是向量的基础元素,那么双向量有基础 j^k, i^k and i ^j,Hodge Dual 将一组映射到另一组并将双向量发送到伪向量。 Bivectors 可以被认为总是两个其他向量的叉积。
如果您认为法线始终是某对切向量的叉积,您可以通过首先变换两个切向量然后取它们的叉积来了解法线如何变换。
让我们把问题中的图表想象成圆柱体的切片。在第一张图中,当横截面为圆时,两个切向量为 (1/rt2, 1/rt2, 0)
和 (0,0,1)
,其中 rt2 = sqrt(2)。取叉积得到
( 1/rt2 ) ( 0 ) ( 1/rt2 )
( 1/rt2 ) X ( 0 ) = ( -1/rt2 )
( 0 ) ( 1 ) ( 0 )
正常。现在应用挤压 (x,y,z) -> (x, y/2, z),切线向量变换为 (1/rt2, 1/(2 rt2), 0)
和 (0,0,1)
。取叉积
( 1/rt2 ) ( 0 ) ( 1/(2 rt2) )
( 1/(2 rt2) ) X ( 0 ) = ( -1/rt2 )
( 0 ) ( 1 ) ( 0 )
并归一化为 ( 1/sqrt(5), -2/sqrt(5), 0 )
。
无论我们选择哪一对切向量,我们仍然会得到相同的结果。上面的计算有点冗长,涉及找到一对合适的切向量。只用逆矩阵的转置更简单
根据一本书 基于物理的渲染:从理论到实现。 作者:Matt Pharr,Greg Humphreys(link,第 86-87 页),
表面切向量被变换为公共向量,使用变换矩阵M,但是
表面 法向量 使用
我想知道为什么缩放会使法线不正确,但不会触及切线向量?为什么法线如此特别?
见书上的图。
我读到需要这样的法线变换来保持法线和切线的正交性。但我想得到一些直观的解释。
对我来说,直觉是旋转(通常所有可以用正交矩阵描述的变换)满足
一个非正交对称矩阵的简单示例说明使用
这里看到需要用
请注意,这已经涵盖了很多转换。就我个人而言,我发现非正交和非对称的变换本身不是很直观,因此我求助于数学解释,即需要保持正交性。因为这是表面法线的定义 属性,所以我觉得这个论点很合理。也许把它写出来会让事情更清楚一点:
所以书中的变换规则的优势在于,它为您提供了所有您能想到的变换的正确法线。
希望对您有所帮助。
理论上法线并不是真正的向量,它们确实是最好的 bivectors,恰好在 3D 中向量和双向量都具有三个分量,因此通常将它们识别为两个。如果我们生活在一个四维世界中,我们就不会有这种困惑。向量将有 4 个分量,而双向量有 6 个分量。
双矢量和 pseudovectors/轴向矢量之间存在细微差别。如果 i、j、k 是向量的基础元素,那么双向量有基础 j^k, i^k and i ^j,Hodge Dual 将一组映射到另一组并将双向量发送到伪向量。 Bivectors 可以被认为总是两个其他向量的叉积。
如果您认为法线始终是某对切向量的叉积,您可以通过首先变换两个切向量然后取它们的叉积来了解法线如何变换。
让我们把问题中的图表想象成圆柱体的切片。在第一张图中,当横截面为圆时,两个切向量为 (1/rt2, 1/rt2, 0)
和 (0,0,1)
,其中 rt2 = sqrt(2)。取叉积得到
( 1/rt2 ) ( 0 ) ( 1/rt2 )
( 1/rt2 ) X ( 0 ) = ( -1/rt2 )
( 0 ) ( 1 ) ( 0 )
正常。现在应用挤压 (x,y,z) -> (x, y/2, z),切线向量变换为 (1/rt2, 1/(2 rt2), 0)
和 (0,0,1)
。取叉积
( 1/rt2 ) ( 0 ) ( 1/(2 rt2) )
( 1/(2 rt2) ) X ( 0 ) = ( -1/rt2 )
( 0 ) ( 1 ) ( 0 )
并归一化为 ( 1/sqrt(5), -2/sqrt(5), 0 )
。
无论我们选择哪一对切向量,我们仍然会得到相同的结果。上面的计算有点冗长,涉及找到一对合适的切向量。只用逆矩阵的转置更简单