【Unity Shader 基础 法线变换】Unity Shader 基础 法线变换,直观深入理解法线变换矩阵

前言

在学习《Unity Shader入门精要》中,发现对于模型顶点从模型空间变换到世界空间,和法线从模型空间变换到世界空间,使用的矩阵不一致,在书中,使用模型空间到世界空间的逆转置矩阵变换法线,(Mo->w-1)T
Mo->w表示模型空间到世界空间,-1表示求矩阵的逆,T求矩阵的转置
vertex=>worldPos,normal=>WorldNormal

i.worldPos = mul(unity_ObjectToWorld, v.vertex);   
i.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);    

当然unity为我们提供了更加简洁高效的函数实现
UnityObjectToWorldNormal

i.worldNormal = UnityObjectToWorldNormal(v.normal);

正交单位矩阵的逆矩阵=其转置矩阵

这里只做直观的解释,不进行严格的证明
为什么正交单位矩阵的逆矩阵等于转置矩阵,正交单位矩阵是任意2个向量相互垂直
直观的解释,正交单位矩阵可以看作一个单位矩阵I经过xyz方向的旋转得到,在x轴旋转的矩阵
[ c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} cos θ & -sin θ & 0 & 0 \\ sin θ & cos θ & 0&0\\ 0 & 0 & 1&0\\ 0 & 0 & 0& 1\\ \end{bmatrix} cosθsinθ00sinθcosθ0000100001
它的转置矩阵
[ c o s θ s i n θ 0 0 − s i n θ c o s θ 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} cos θ & sin θ & 0 & 0 \\ -sin θ & cos θ & 0&0\\ 0 & 0 & 1&0\\ 0 & 0 & 0& 1\\ \end{bmatrix} cosθsinθ00sinθcosθ0000100001
它的逆矩阵
[ c o s − θ s i n − θ 0 0 − s i n − θ c o s − θ 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} cos -θ & sin-θ & 0 & 0 \\ -sin -θ & cos -θ & 0&0\\ 0 & 0 & 1&0\\ 0 & 0 & 0& 1\\ \end{bmatrix} cosθsinθ00sinθcosθ0000100001
转置矩阵,就是sin θ 和 -sin θ 互换了位置,可以看到转置矩阵和逆矩阵相等

为什么不直接使用Mo->w

考虑2维情况
这是因为对一个物体进行非统一缩放,变换后的法线不同一致了
注意进行缩放变换之前,下图代表的变换都是经过了,模型=>世界,即都是在世界空间
绿色代表切线T,法线N
T*N=0
想要变换后KT * N=0
(x,y)(x0,y0)=xx0+yy0=0
(k1x,k2y)(x0,y0)=k1xx0+k2yy0=0
x0,y0要乘以 1 k   1   \frac{1}{k~1~} k 1 1, 1 k   2   \frac{1}{k~2~} k 2 1,
使得xx0+yy0=0
如果k1=k2,则k1(xx0+yy0)=0,所以物体使用统一缩放,可以直接使用模型=>世界的矩阵变换法线
我们要,求的就是 1 k   1   \frac{1}{k~1~} k 1 1,缩放系数的倒数, 1 k   2   \frac{1}{k~2~} k 2 1,得到缩放的逆矩阵同时逆操作不影响旋转

图出自《Unity Shader入门精要》P86 图4.48

这里对结论进行直观的解释,便于大家的理解,暂时不进行严格的证明,对于证明书上,有详细的推导过程
因为向量有方向,4×4的平移矩阵对向量无效
只使用3×3即可,所以只要考虑缩放和旋转
那么实际上就是要得到缩放的逆矩阵,因为逆矩阵对旋转产生了影响

  • 对于缩放对xyz缩放了abc倍,逆矩阵则是对xyz缩放了1/a,1/b,1/c倍
  • 即物体绕x轴旋转30°,逆矩阵则是物体绕x轴旋转-30°
    由上面的结论得,旋转矩阵是正交单位矩阵
    其逆矩阵=转置矩阵
    对矩阵取逆,得到缩放的倒数,但是对旋转产生影响
    再进行转置矩阵即可,转置矩阵对于缩放无效,因为沿着对角线交互元素,对旋转矩阵进行转置等价于对其取逆,
    对旋转取了2次逆,旋转不受影响
    第一次取逆, 缩放矩阵正确;旋转受影响x轴30°=>-30°
    第一次取转置, 缩放矩阵不受影响且正确;旋转取转置等同于取逆,x轴-30°=>30°,即旋转=原来的旋转
    至此,大家应该理解了法线为什么要用模型空间到世界空间的逆转置矩阵变换

猜你喜欢

转载自blog.csdn.net/qq_58047420/article/details/134548397