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

因为需要的论文,最近开始学习OpenGL。由于刚入门的初学者有这么总会遇到很多问题,。

这些天,好不容易才OpenGL个问题弄明确了。

几点迷惑:

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

怎样通过如果方法推断平面法向量的方向(这里是指三角面片):

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

接着。就会存在以下两种情况,例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmlzaGVyd2Fu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

因此,我们在程序中仅仅要反着试一次,就会得到我们的结果了。

以下我给出我的部分代码已经效果图(斯坦福大学著名的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数据文件下载链接

bunny数据包括顶点数据和顶点法向量数据链接

第一连接是bunny一些数据模型格档,第二个环节是一个包括bunny顶点数据模型和已计算出的顶点法向矢量数据。

计算,我们可以自己用顶点数据顶点的法线,在顶点的法线进行比较,然后,和文件,写你自己的计算,验证顶点正常的程序是正确与否。

时间: 2025-01-01 21:46:57

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

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

由于毕业论文的需要,近期开始学习OpenGL,由于新手刚开始接触所以总会遇到很多问题.这两天,总算把OpenGL中顶点法向量这个问题弄明白了. 几点迷惑: 在网上百度,发现很多求平面法向量的介绍以及程序.后面才知道顶点法向量才是我要的. 对于空间中的三个点,怎么确定平面法向量的方法?这里可以通过尝试顺时针和逆时针结合结果图来判断.下面简单介绍下怎样进行假设. 如何通过假设方法判断平面法向量的方向(这里是指三角面片): 首先,当然要有数据,就是原始数据中每个面片是由那三个顶点组成.比如现在空间中有

OpenGL学习笔记之法线向量

 需要注意的地方: 1.使用glTranslate*函数或者glRotate*函数可以改变物体的外观,但法线向量并不会随之改变.然而,使用glScale*函数,对每一坐标轴进行不同程度的缩放,很有可能导致法线向量的不正确,虽然OpenGL提供了一些措施来修正这一问题,但由此也带来了各种开销.因此,在使用了法线向量的场合,应尽量避免使用glScale*函数.即使使用,也最好保证各坐标轴进行等比例缩放. 2.还有一个地方就是,只能给顶点或者多边形定义法线向量,不可以对多边形的的每个指定的地方定义

【一步步学OpenGL 26】-《法线贴图》

教程 26 法线贴图 原文: http://ogldev.atspace.co.uk/www/tutorial26/tutorial26.html CSDN完整版专栏: http://blog.csdn.net/column/details/13062.html 背景 之前的我们的光线着色器类已经可以达到很不错的效果了,光线效果通过插值计算遍布到整个模型表面,使整个场景看上去比较真实,但这个效果还可以进行更好的优化.事实上,有时插值计算反而会影响场景的真实性,尤其是用材质来表现一些凹凸不平的纹理

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

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

(原)在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

ARKit学习之SCNGeometrySource加顶点、法线、纹理及索引时贴图不正确

1.背景 需求:通过ARKit,让用户拍摄房间时显示挑选的家具或其它模型. 要求:需要感知房间的空间大小,让家具物体贴近现实. 2.功能实现 由于公司不是用通用的3D模型obj.dae或者苹果官方的scn文件. 之前对于3D建模知识完全不懂,所以只能摸索有没有更底层的方法. 后面看例子,发现可以用SCNGeometrySource和SCNGeometryElement实现. 代码如下: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Me

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.效果如