【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
【OpenGL】平面法向量、顶点法向量的计算方法相关推荐
- Python 计算Mesh顶点法向量
一.将顶点转为点云后利用点云计算法向量的方法 首先将.obj文件读入并将顶点转为点云存储为.pcd文件: import os import numpy as npdef read_obj(obj_pa ...
- 网格顶点法向量从世界坐标到切空间坐标转换:法向贴图高低模烘焙
从世界坐标法向量到切空间法向量转换计算 目的 符号定义 世界坐标顶点法向量转切空间法向量 转换矩阵TtbnT_{tbn}Ttbn的求解 TtT_{t}Tt求解 TnT_{n}Tn求解 TbT_{ ...
- OpenCV矩阵运算之顶点法向量计算
OpenCV进行顶点法向量计算 先介绍一下我接触此题的背景.我需要将一个.obj文件中的vn即顶点法向量计算出来.现在有的数据是f(三角面片索引),v(顶点坐标),但是网上找的代码不是很多,逻辑也不是 ...
- 求一个平面上的法向量
求一个平面上的法向量 定理:如果一条直线和平面的两条相交直线垂直,那么这条直线垂直于这个平面. 参考 已知三点求平面的法向量 -- 两种方法 切平面的法线方程 平面法线式方程 求空间直线与与平面的交点
- Win32 OpenGL编程 5 顶点数组详细介绍
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Win3 ...
- 空间点到平面的垂足坐标的计算方法以及matlab实现
问题描述: 已知空间点坐标(x,y,z),并且知道三个点的坐标(不要共线!),求解空间点到平面投影坐标. 参考百度文库的这篇文章 空间点到平面的垂足坐标的计算方法 下面是matlab的代码: %% 变 ...
- OpenGL基础19:法向量与漫反射
前置:OpenGL基础18:光照 一.法向量 法向量:垂直于当前点所在面的向量 无论是漫反射光照还是镜面光照,我们都需要知道当前反射点的法向量 单纯的对于一个顶点来讲,它肯定是没有法向量的,所以我们需 ...
- ThreeJs顶点法向量光照计算
1.实现步骤 1.创建空几何体的法向量数据(类型数组) 2.创建属性缓冲区对象(生成法向量) 3.设置几何体的attributes属性的位置normal属性(将顶点赋给空几何体) 2.意义功能 法向量 ...
- 【NXOpen C#】获取平面对象的法向量
通过面的Tag获取垂直于面的向量 说明:使用UF函数直接得到平面的法向,以及面中心点的UV坐标 代码示例 /// <summary>/// 获取面的向量与中心点坐标/// </sum ...
最新文章
- Java方法调用事件_Java中的事件处理和Java中actionPerformed方法的执行
- Java里的按值传递与引用传递
- 3.13. Notepad++中Windows,Unix,Mac三种格式之间的转换
- 使用ActiveMQ支持Spring Integration路由
- AUTOSAR从入门到精通100讲(一)-SPI、UART、I2C总线详解
- iview代码片段 去除水平menu底部横线
- 七月刚入职的阿里测试开发岗-高频知识整理,内附面试题答案
- Crossin先生的微信打飞机游戏(4)
- 正定矩阵和半正定矩阵
- 电路分析超详细思维导图
- Gym - 100886B 2015-2016 Petrozavodsk Winter Training Camp, Saratov SU Contest B - Game on Bipartite
- phython学习记录 基础篇
- 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一2.5 商品摆放:营造氛围的搭配...
- AI创业时代!这9个方向有钱途;AIGC再添霸榜应用Lensa;美团SemEval2022冠军方法分享;医学图像处理工具箱… | ShowMeAI资讯日报
- JAVA梅森旋转随机算法_伪随机数生成算法-梅森旋转(Mersenne Twister/MT)
- 如何构建基于数字孪生的智慧全息路口
- mybatis-plus 读写空间数据 geometry类型
- 【C++学习】 第一课1——最初的最初
- Android的优化
- influxdb常用命令、influxdb增删改查、SpringBoot整合influxdb