Matrix 将法线和切线从对象空间变换到世界空间?

Matrix 将法线和切线从对象空间变换到世界空间?,matrix,shader,game-engine,hlsl,cg,Matrix,Shader,Game Engine,Hlsl,Cg,为了正确地将法线(即方向而非位置)从对象空间转换到世界空间,我们将其与模型矩阵/u world2对象矩阵的逆(单位)相乘 那么,为什么切线(与法线相切,也是方向-它不是位置)与模型矩阵/u Object2World(单位)相乘以将其转换为世界空间 eg代码:在着色器中读取切线空间法线的代码: o.normalWorld = normalize( mul(v.normal, _World2Object) ); o.tangentWorld = normalize( mul(_Object2Worl

为了正确地将法线(即方向而非位置)从对象空间转换到世界空间,我们将其与模型矩阵/u world2对象矩阵的逆(单位)相乘

那么,为什么切线(与法线相切,也是方向-它不是位置)与模型矩阵/u Object2World(单位)相乘以将其转换为世界空间

eg代码:在着色器中读取切线空间法线的代码:

o.normalWorld = normalize( mul(v.normal, _World2Object) );
o.tangentWorld = normalize( mul(_Object2World, v.tangent) );
o.binormalWorld = normalize( cross(o.normalWorld, o.tangentWorld) * v.tangent.w );
法向量通过逆矩阵的转置进行变换 从对象空间到世界空间的模型矩阵(因为它是 与曲面正交),而切线向量指定 曲面上点之间的方向,并因此进行变换 使用模型矩阵

(来源:)

为了更好的可视化,我画了一个小图片:

切线是曲面上的一个方向,因此如果y轴被挤压,它也会跟随曲面(因此使用模型矩阵)

法线是一个垂直于曲面的方向,因此如果y轴被挤压,它会反向移动以保持垂直(因此使用反向转置模型矩阵)

法向量通过逆矩阵的转置进行变换 从对象空间到世界空间的模型矩阵(因为它是 与曲面正交),而切线向量指定 曲面上点之间的方向,并因此进行变换 使用模型矩阵

(来源:)

为了更好的可视化,我画了一个小图片:

切线是曲面上的一个方向,因此如果y轴被挤压,它也会跟随曲面(因此使用模型矩阵)


法线是一个垂直于曲面的方向,因此如果y轴被挤压,它将以相反的方式移动以保持垂直(因此使用了反向转置模型矩阵)。

我已经了解了代码的实际工作方式。 如果通过向量乘法规则来考虑矩阵,则可以计算出以下内容:

v * m <=> m^-1 * v
因此,您有两个相同的变换备选方案:

o.normalWorld = normalize( mul(v.normal, _World2Object) );
<=>
o.normalWorld = normalize( mul(_Object2World, v.normal) );
o.normalWorld=normalize(mul(v.normal,_World2Object));
o、 normalWorld=normalize(mul(_Object2World,v.normal));

我已经弄明白了你的代码实际上是如何工作的。 如果通过向量乘法规则来考虑矩阵,则可以计算出以下内容:

v * m <=> m^-1 * v
因此,您有两个相同的变换备选方案:

o.normalWorld = normalize( mul(v.normal, _World2Object) );
<=>
o.normalWorld = normalize( mul(_Object2World, v.normal) );
o.normalWorld=normalize(mul(v.normal,_World2Object));
o、 normalWorld=normalize(mul(_Object2World,v.normal));

非常好,谢谢!祝福你提供了一个可视化的感谢!祝福你提供了一个视觉上奇怪的巧合:我在调试名为FadeToBlack的着色器时遇到了这个答案:-)奇怪的巧合:我在调试名为FadeToBlack的着色器时遇到了这个答案:-)