【OpenGL】平面法向量、顶点法向量的计算方法

平面法向量计算

平面法向量知识介绍:

对于平面法向量计算实质就是:平面内两非平行向量的叉积(又称"外积、向量积、叉乘")为该平面的法向量。
根据两向量相乘的前后顺序计算得到两个方向相反的法向量。用公式表示为:
平面内两非平行法向量:a, b (c为法向量)
a×b = c
b×a = -c
上式合并即为:
a×b = -b×a
可见,同样是两个向量相乘,不同相乘顺序得到的向量方向是相反的。

另外,平面内两非平行向量的叉乘得到的法向量方向判断方法为:
a×b的方向:右手四指同a方向一致,手掌不动,四手指逐渐弯向b靠近(无法弯向b?请自然的180翻转您的右手再试),拇指的指向就是a×b的方向,垂直于a和b所在的平面
b×a的方向:右手四指同b方向一致,手掌不动,四手指逐渐弯向a靠近,拇指的指向就是b×a的方向,垂直于b和a所在的平面
a×b的方向与b×a的方向是相反的,且有:a×b=-b×a

因此,在OpenGL中计算三角(四角)面片的法向量时,选取好两个非平行向量后,要得到正确的法向量(主要是方向正确),一定得注意两个向量相乘的顺序。

向量AC、AB,

AB×AC = 朝向屏幕外的法向量;

AC×AB = 朝向屏幕内的法向量;

如果point1~3属于3维空间,则具体计算步骤为:

用a表示向量AB,用b表示向量AC,则


其中,i、j、k为3维空间各维度的单位向量。

 

实战举例

相同的模型、环境光等条件,两个相反的法向量计算方式得到的模型效果如下:

   

 

 

顶点法向量

顶点法向量介绍:

顶点法向量:以此点为顶点的所有三角(四角)形的法向量之和即为顶点法向量。

以常见的OBJ文件的3D模型提供了所有顶点的法向量。

 

 

总结

1. 以常见的OBJ文件的3D模型提供了所有顶点的法向量,但未提供面的法向量,因此需要自己编写代码实现面的法向量计算。

2. 在OpenGL中为了加快计算速度,一定会将平面法向量和顶点法向量进行“向量归一化”处理。OpenGL顶点法向量归一化后可以加快计算速度。

 

 

衍生概念

向量归一化:

向量各分量之和等于1。归一化方法比较简单,因为非归一化的向量之和不一定是1,所以要将向量分别除以这几个向量之和,重新得出的数就是权重向量。比如:

你得到的向量为(0.68, 0.22, 0.09),它们的和是0.99,并不是1,所以要对其进行归一化处理。分别用
0.68/0.99 ;
0.22/0.99 ;
0.09/0.99 ;
然后四舍五入,最后得出的数为(0.6854 0.2213 0.0933),这些数值的和为1,所以叫归一化处理。

归一化的用处:是为了后面数据处理的方便,其次是保证程序运行时加快(各分量变小了)。因为归一化仍然保留着向量各分量的原有权重、特征。所以不会改变向量的原有特性,从而不会影响归一化前后的结果。

 

 

参考:

https://blog.csdn.net/nobleman__/article/details/79618331

https://blog.csdn.net/fisherwan/article/details/40897939

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值