Unity中的法线变换

Unity中的法线变换


前言

最近,在学习UnityCG.cgjnc源码时,发现在非统一变换下,矩阵变换变成了左乘,顿时充满了疑惑,故此文章推导官方为啥这么写。
在这里插入图片描述


符号含义
T o T_o To模型空间下顶点的切线向量
T w T_w Tw世界空间下顶点的切线向量
N o , N w N_o,N_w NoNw同上,N表示法线向量
M o w M_{ow} Mow模型空间到世界空间的变换矩阵
M w o M_{wo} Mwo世界空间到模型空间的变换矩阵
G G G法线向量从模型空间到世界空间的变换矩阵

一、特殊的法线变换

在计算光照的时候,我们常常会用到世界空间坐标下的法线。对于顶点的切线向量 T w T_w Tw ,可由下列公式得到:
T w = M o w ⋅ T o T_w = M_{ow} \cdot T_o Tw=MowTo
单独来说,顶点的法线向量,也可通过上式变换。但是,变换后的法线向量却不一定与变换后的切线向量垂直了。具体可看乐乐女神的图解,
在这里插入图片描述
所以,为了求得 N w N_w Nw,我们得利用切线与法线垂直的关系。即:
T w ⋅ N w = 0 T_w \cdot N_w = 0 TwNw=0
因此,我们可以进行如下公式推导:
T w ⋅ N w = 0 ( M o w ⋅ T o ) ⋅ ( G ⋅ N o ) = 0 T o T ⋅ ( M o w T ⋅ G ) ⋅ N o = 0 T_w \cdot N_w = 0 \\ (M_{ow} \cdot T_o) \cdot (G \cdot N_o) = 0 \\ T_o^T \cdot (M_{ow}^T \cdot G) \cdot N_o = 0 \\ TwNw=0(MowTo)(GNo)=0ToT(MowTG)No=0
因为 T o T ⋅ N o = 0 T_o^T \cdot N_o =0 ToTNo=0, 所以只要 M o w T ⋅ G = I M_{ow}^T \cdot G = I MowTG=I,上式即可成立。
故,
G = ( M o w T ) − 1 G = ( M o w − 1 ) T G = (M_{ow}^T)^{-1} \\ G = (M_{ow}^{-1})^T \\ G=(MowT)1G=(Mow1)T
因此, N w = ( M o w − 1 ) T ⋅ N o N_w = (M_{ow}^{-1})^T \cdot N_o Nw=(Mow1)TNo,再来个双重转置可得, N w = N o T ⋅ M o w − 1 N_w = N_o^T \cdot M_{ow}^{-1} Nw=NoTMow1,又因为 M o w − 1 = M w o M_{ow}^{-1} = M_{wo} Mow1=Mwo,所以最终得到:
N w = N o ⋅ M w o N_w = N_o \cdot M_{wo} Nw=NoMwo
这个公式,就是源码中的实现方式。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值