变换曲面法线向量和切向量

时间:2015-05-26 17:54:32

标签: opengl math 3d

根据一本书基于物理的渲染:从理论到实现。作者:Matt Pharr,Greg Humphreys(link,p.86-87),
表面切向量使用变换矩阵 M 转换为公共向量,但是 使用enter image description here转换表面法向量

我想知道为什么缩放确实会导致正常错误,但是没有触及切线矢量?为什么法线如此特别?

参见书中的图。 enter image description here

我已经读过,为了保持法线和切线的正交性,需要对法线进行这种变换。但我想得到一些直观的解释。

2 个答案:

答案 0 :(得分:2)

对我来说,直觉就是旋转(通常所有可以用正交矩阵描述的变换)满足 formula。这意味着enter image description here,因此对于那些类型的转换,处理并不是特别的。

使用非正交对称矩阵的一个简单示例,说明使用enter image description here转换法线是不够的

enter image description here

这里看到你需要使用enter image description here转换法线,它在对称的情况下等于enter image description here

请注意,这已经包含了很多转换。就个人而言,我发现非正交且不对称的变换本身并不十分直观,因此我采用数学解释来保持正交性。由于这是表面法线的定义属性,我发现这个论点非常合理。也许把它写出来会让事情变得更清晰:

enter image description here

因此,本书中转换规则的优点在于它为您提供了所有可以想到的转换的正常范围。

希望这有帮助。

答案 1 :(得分:1)

理论上法线不是真正的向量,它们确实是最好的bivectors,它恰好在3D中,矢量和bivector都有三个组件,所以通常将它们识别为两个。如果我们生活在四维世界中,我们就不会有这种混乱。矢量将有4个组件和bivectors 6个组件。

bivectors和pseudovectors /轴向矢量之间存在细微差别。如果 i j k 是向量的基本元素,那么bivectors的基础 j ^ k ^ k ^ 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 )

我们选择哪一对切向量并不重要,我们仍然会得到相同的结果。上述计算有点长,并且涉及找到一对合适的切向量。只使用逆矩阵的转置更简单。