解决opengl计算顶点法向量问题

由于毕业论文的需要,近期开始学习OpenGL,由于新手刚开始接触所以总会遇到很多问题。这两天,总算把OpenGL中顶点法向量这个问题弄明白了。

几点迷惑:

  1. 在网上百度,发现很多求平面法向量的介绍以及程序。后面才知道顶点法向量才是我要的。
  2. 对于空间中的三个点,怎么确定平面法向量的方法?这里可以通过尝试顺时针和逆时针结合结果图来判断。下面简单介绍下怎样进行假设。

如何通过假设方法判断平面法向量的方向(这里是指三角面片):

首先,当然要有数据,就是原始数据中每个面片是由那三个顶点组成。比如现在空间中有一个三角形平面由三个顶点A,B,C组成。

接着,就会存在下面两种情况,如下图:

因此,我们在程序中只要反着试一次,就会得到我们的结果了。下面我给出我的部分代码已经效果图(斯坦福大学著名的bunny模型):

其中,A和B是后面要进行叉乘的两个向量,point1,point2,point3就是三角面片的三个顶点。

情况1:

		A[X] = point2[X] - point1[X];
		A[Y] = point2[Y] - point1[Y];
		A[Z] = point2[Z] - point1[Z];
		B[X] = point1[X] - point3[X];
		B[Y] = point1[Y] - point3[Y];
		B[Z] = point1[Z] - point3[Z];

情况2:

		<span style="color:#000000;">A[X] = point3[X] - point1[X];
		A[Y] = point3[Y] - point1[Y];
		A[Z] = point3[Z] - point1[Z];
		B[X] = point1[X] - point2[X];
		B[Y] = point1[Y] - point2[Y];
		B[Z] = point1[Z] - point2[Z];</span>

从上面两种情况可以看出,它们确实是相反的。自己再实际操作的时候可以去尝试一下。

计算顶点法向量的过程记录:

首先,我们要了解几个概念,平面法向量(平面上两个不平行,不共线的向量叉乘得到),顶点法向量(以这个点为顶点的所有三角形的法向量之和)。

接着,我们就可以通过三个顶点求得两个向量,两个向量叉乘得到平面法向量。(平面法向量进行归一化)

然后,统计每个顶点的所有平面法向量之和。(顶点法向量进行归一化)

bunny数据文件下载链接



时间: 2024-12-17 22:40:59

解决opengl计算顶点法向量问题的相关文章

解决opengl计算顶点的法线问题

因为需要的论文,最近开始学习OpenGL.由于刚入门的初学者有这么总会遇到很多问题,. 这些天,好不容易才OpenGL个问题弄明确了. 几点迷惑: 在网上百度.发现非常多求平面法向量的介绍以及程序.后面才知道顶点法向量才是我要的. 对于空间中的三个点.怎么确定平面法向量的方法?这里能够通过尝试顺时针和逆时针结合结果图来推断.以下简介下如何进行如果. 怎样通过如果方法推断平面法向量的方向(这里是指三角面片): 首先,当然要有数据,就是原始数据中每一个面片是由那三个顶点组成.比方如今空间中有一个三角

计算顶点法向量在世界坐标中的值

顶点从模型空间转换到世界坐标空间只需要乘以世界转换矩阵即可,但是顶点的法向量却不能通过直接乘以这个矩阵将其变换到世界空间. 一个顶点的世界转换矩阵为m,则该顶点的法向量转换矩阵为m的逆矩阵然后转置 Vec3 localVertex, localNormal; Vec3 worldVertex=localVertex*m; Vec3 worldNormal=localNormal*(m-1)t 可以参考:http://www.cnblogs.com/mengdd/archive/2011/08/3

顶点法向量从物体坐标系变换到世界坐标系

3维网格模型的顶点的法向量一开始是定义在模型坐标系中的,在将模型布置在场景中后,根据光照模型计算颜色时需要用到顶点法向量,由于光照都是在世界坐标系中进行计算,这时用到的法向量也应该是定义在世界坐标系中.所以我们需要设法将顶点法向量从模型坐标系中转换到世界坐标系中. 我们已经知道通过缩放.旋转.平移三种基本操作合成的model矩阵可以将网格顶点坐标从模型坐标系中转换到世界坐标系中.那么这个model矩阵是否也可以将顶点法向量转换到世界坐标系呢?如果不行,那么需要找到一个可以完成这个任务的矩阵. 1

(原)在firefly_rk3288开发板上解决openGL在设置32位色深以后出现花屏的问题

转载请注明出处:http://www.cnblogs.com/lihaiping/p/5567141.html 在做openGL测试的过程中,根据论坛上的帖子,在使用/bin/fbset -a -nonstd 1 -depth 32 -rgba "8/0,8/8,8/16,8/24"命令以后,会出现显示花屏的问题,当然我这边暂时使用的是hdmi输出进行测试的,vga的设置方法,另外一个网友已经发帖贴出了解决方法:http://developer.t-firefly.com/thread

Java使用BigDecimal解决精确计算的问题

最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解就可以,但是当你写了一个四重for循环后你会发现解不出来.由此考虑到结果可能是小数,便把增量改成了float类型,每次自增0.1. 当你写完满心欢喜地运行的时候会发现还是出不来结果.再改成double类型也同样是不行. 这是因为java中float类型相加是把十进制转化为二进制后相加然后把二进制结果

解决js计算0.1+0.2 !==0.3

经常做用js数据运算的同学应该了解,在js中,0.1+0.2不会等于0.3,而是等于: 我一开始发现这个bug的时候也觉得很奇怪,那怎么去解决这个bug,让0.1+0.2 最后能得到0.3呢? 方法一最简单的就是先把0.1和0.2换成别的数字(因为在js中只有这两个数相加有bug,例如:1.1+1.2不会有问题),所以先让0.1和0.2分别乘以10,求和之后再除以10 ,则不会有问题: (0.1*10+0.2*10)/10 ===0.3 方法二可能很多小伙伴都忘记了js的Number对象有一个保

018、Java中除法的是用,解决除法计算精度问题

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public static void main(String[] args) { int x = 9; // 声明整型变量 int y = 5; // 声明整型变量 System.out.println(x / (double) y); // 将其中一个int类型变量转换为double类型 } } 02.效果如

顶点法线和面法线

在3D世界中每一个顶点都有颜色,除了使用光源和物体的材质信息之外,还需要知道每个顶点的法向量,根据光照入射方向和法向量的夹角,计算顶点的最终颜色.那么我们来了解下顶点法线. 顶点法线: 每一个顶点都有法向量,就能知道光线到达物体表面的入射角. 面法线: 垂直一个平面的直线叫面法线 一般情况下顶点法线和面法线的方向是相同的,比如一个类是于圆球体和圆的定点法线和面法线方向就不一致,如下图 计算顶点的法向量,假设一个三角形由P0,P1,P2顶点组成. 如何计算顶点的法向量N1呢? N1 = (P0 -

OpenGL中两种计算投影矩阵的函数

OpenGL无意间同时看到两种创建投影矩阵的写法,可以说它们完成的是同样的功能,但写法完全不同,可以观摩一下什么叫做异曲同工之妙... 第一种: gltMakeShadowMatrix函数是重点 1 // Gets the three coefficients of a plane equation given three points on the plane. 2 void gltGetPlaneEquation(GLTVector3 vPoint1, GLTVector3 vPoint2,