转换表面法向量和切向量

Tem*_*mak 5 opengl math 3d

根据《基于物理的渲染:从理论到实现》一书由Matt Pharr的,格雷格堪(链路,第86-87),
表面切向量被转换为通用矢量,使用变换矩阵中号,但
表面的法向矢量是使用转化在此处输入图片说明.

我想知道为什么缩放确实会使法线不正确,但不会触及切线向量?为什么法线如此特别?

看书上的图。 在此处输入图片说明

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

Sal*_*lba 1

理论上法线并不是真正的向量,它们实际上最好作为双向量,碰巧在 3D 中向量和双向量都具有三个分量,因此通常可以识别它们两个。如果我们生活在一个四维世界,我们就不会有这种困惑。向量有 4 个分量,双向量有 6 个分量。

双向量和伪向量/轴向量之间存在细微差别。如果ijk是向量的基本元素,则双向量具有基础j ^ ki ^ ki ^ j,Hodge Dual 将一组映射到另一组并将双向量发送到伪向量。双向量可以被认为始终是其他两个向量的叉积。

如果您认为法线始终是某对切向量的叉积,您可以通过首先变换两个切向量然后取它们的叉积来了解法线如何变换。

让我们将问题中的图表视为圆柱体的切片。在第一张图片中,当圆的横截面有两个切向量时(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    )
Run Code Online (Sandbox Code Playgroud)

正常的。现在应用挤压 (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        )
Run Code Online (Sandbox Code Playgroud)

并归一化给予( 1/sqrt(5), -2/sqrt(5), 0 )

无论我们选择哪一对切向量,我们仍然会得到相同的结果。上面的计算有点冗长,需要找到一对合适的切向量。仅使用逆矩阵的转置更简单。