OpenGL学习笔记:法线矩阵和镜面光照

法线矩阵

为什么需要法线矩阵

之前我们计算的坐标都是世界坐标,但法线向量却是局部空间的,应该把法线向量也转换到世界空间才对。但把法线向量转换到世界空间,不能简单的乘以模型矩阵,模型矩阵中可能会有位移、缩放、旋转等变换。
首先,法线向量只有方向意义,没有位置意义,因此不能对法线进行位移操作。
其次,法线向量虽然不能位移,但可以跟随平面做旋转和缩放操作。如果是旋转,法线向量直接跟随旋转即可,但如果是缩放,等比例缩放还算简单,再标准化一次就行,非等比例缩放就麻烦了,因为非等比例缩放会导致向量的各个分量缩放比例不同,从而影响向量的方向,导致法向量不再垂直于平面。
在这里插入图片描述
为了解决这个问题,将法向量从局部空间向世界空间转换时需要专门的转换矩阵,我们称之为法线矩阵。

法线矩阵推导

根据法线性质可知,平面上任一向量都与法线向量垂直, 即它们的数量积为0。
设平面上任一向量为 v ⃗ \vec{v} v ,法线向量为 n ⃗ \vec{n} n ,转换矩阵为 M M M,法线矩阵为 S S S,转换后的平面向量为 v ′ ⃗ \vec{v'} v ,转换后的法线向量为 n ′ ⃗ \vec{n'} n ,则有
v ′ ⃗ = M v ⃗ n ′ ⃗ = S n ⃗ n ⃗ ⋅ v ⃗ = ( n x n y n z ) ⋅ ( v x v y v z ) = n x v x + n y v y + n z v z = ( n x n y n z ) ⋅ ( v x v y v z ) = ( n ⃗ ) T ⋅ v ⃗ = 0 \vec{v'}=M\vec{v}\\ \vec{n'}=S\vec{n}\\ \vec{n}\cdot \vec{v}=\left( \begin{array}{ccc}n_x \\ n_y \\ n_z \end{array} \right)\cdot \left( \begin{array}{ccc}v_x \\ v_y \\ v_z \end{array} \right)=n_xv_x+n_yv_y+n_zv_z= \left( \begin{array}{ccc}n_x & n_y & n_z \end{array} \right)\cdot \left( \begin{array}{ccc}v_x \\ v_y \\ v_z \end{array} \right)=(\vec{n})^T\cdot \vec{v}=0\\ v =Mv n =Sn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木千

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值