OpenGL中法线坐标的转换

一、简单介绍

我们都知道如果我们要将一个物体从本地坐标系变到视觉坐标系的话都是要通过模型视图矩阵来进行变化的,我们的光照效果是在视觉坐标系中进行实现的,因为观察者的位置其实是决定了光照的效果的,在我们开启光照功能的时候,法线是决定了顶点或者是面上所接受到光照的多少的,就比如说我们要确定一个指定顶点上的光线的强度的时候,如果我们使用的是漫射光的话,漫射光是需要两个变量的,一个就是光源的方向,还有一个就是表面法线的向量。以此两个向量的点乘来计算光照的强度。这里需要注意的是表面发现和光源的方向都是需要是单位强度的。


二、具体计算

上面介绍了为什么需要将法线向量变成视觉坐标系下的,再讲讲其的计算方法,这里进行坐标转换的时候不能直接和模型视图矩阵相乘,因为我们的光源是不需要受到平移影响的,因为法向量只是一个方向向量,不能够表达空间中的特定位置。所以不应该受到位移的影响。以及如果我们的模型视图矩阵当中没有涉及到非等比例缩放,意思就是说如果x,y,z轴的缩放比例都是相同的,那么我们直接把模型视图矩阵中的前面的3*3的矩阵与表面法线向量相乘就可以得到视觉坐标系下的表面法线向量了。

但是如果涉及到了非等比例缩放,那么就不能用上面的方法来进行计算了,而是应该去使用GL_MODELVIEW的左上角的3*3逆矩阵的转置矩阵和法线向量相乘去得到变换之后的法向量。

因为如果是非等比例缩放的话,这样的话表面的法线就不会垂直于物体表面了,而如果是等比例缩放的话,还是垂直的,只不过就是法线的长度发生了变化。长度发生变化了我们只需要去做标准化操作就好了。

举个例子,就比如说有如下这个三角形面,AB向量为(1,0,-1),AC向量为(0,1,-1),这样我们求得法向量为(1,1,1),如果我们将x缩放√2,y缩放√3,z轴缩放1,然后我们的法向量如果也这样进行缩放的,显然是不垂直的。


之前也看了篇文章关于这个的解释,在这里自己就简单的总结下为什么如果进行了非等比例缩放需要去使用的GL_MODELVIEW的左上角的3*3逆矩阵的转置矩阵。首先法向量是3个坐标构成的,x,y,z。所以我们这边只采用3*3的矩阵,而且模型视图矩阵中的平移分量真的用不到。首先我们先看两个图

下面的这个N向量就代表的是法向量,而T向量可以理解成就是三角形斜边的一个向量,从斜边的最下面的那个顶点指向上面的那个顶点。

如果经过非等比例缩放,可能会变成为这样子,也就是说法向量已经不再垂直这个面了

下面就根据结果来推导验证下。

如果我们想保证经过非等比例变换之后N'向量和T'向量还是垂直的话,首先我们要明确T向量变成T'向量其实就是构成这个向量的顶点做了modelView矩阵的变换。我们先设N向量经过G矩阵的变换之后还是可以保证和T'向量垂直。所以其实我们这里需要证明的就是G矩阵其实就是modelView的左上角的3*3矩阵的逆矩阵的转置

下面这里就用M代表的是模型视图矩阵的3*3的矩阵,我们这里先忽略平移,因为平移对我们证明是没有影响的 x 代表的就是两个向量相乘,向量相乘=模的积 x cos(夹角)。

所以其实就是下面的这个式子

N'xT' = (GN) x (MT) = 0

紧接着我们可以知道下面的这个式子,为什么?因为比如说我有两个向量A(1,2,3) 和向量B(1,3,5),这样的话我们下面的x做的其实也就是向量的点积,这样计算出来的结果就是1*1+2*3+5*3。而后面我们可以先变换完N,然后矩阵转置一下就变成了一个3*1的矩阵,然后再和后面的1*3的矩阵相乘,这样的话其实就是变成了一个1*1的矩阵,这样相当于就是1*1+2*3+2*5,所以可以这么理解,下面的式子左边和右边它们两个是相同的。

(GN) x (MT) = (GN)T(MT);

之后我们就可以把上面等式的右边做进一步的变换

(GN)T(MT) = NTGTMT

之后因为N和T的向量的乘积为0,然后我们这里如果GTM为单位矩阵的话,那么就有了NTIT = 0,这里I表示的就是单位矩阵。

所以这样的话,就能得出下面的这个式子了,其中M-1代表的就是逆矩阵,外面的T代表的就是转置。逆矩阵满足|A|·|A-1|=|E|=1

GTM = I <=> G = (M-1)T

说的有点不清楚,这里其实懂得思想就好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值