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

来源:互联网 发布:mac air玩游戏怎么样 编辑:程序博客网 时间:2024/04/29 16:38

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

        几点迷惑:

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

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

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

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

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

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


情况1:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. A[X] = point2[X] - point1[X];  
  2. A[Y] = point2[Y] - point1[Y];  
  3. A[Z] = point2[Z] - point1[Z];  
  4. B[X] = point1[X] - point3[X];  
  5. B[Y] = point1[Y] - point3[Y];  
  6. B[Z] = point1[Z] - point3[Z];  

情况2:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="color:#000000;">A[X] = point3[X] - point1[X];  
  2. A[Y] = point3[Y] - point1[Y];  
  3. A[Z] = point3[Z] - point1[Z];  
  4. B[X] = point1[X] - point2[X];  
  5. B[Y] = point1[Y] - point2[Y];  
  6. B[Z] = point1[Z] - point2[Z];</span>  


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


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

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

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

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


bunny数据文件下载链接

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

第一个连接是bunny模型的几种数据格式文件,第二个链接是一个包含bunny模型的顶点数据和已经计算出的顶点法向量数据。大家可以自己利用顶点数据计算顶点法向量,然后和该文件中的顶点法向量进行比对,来验证自己写的计算顶点法向量程序的正确与否。
原文链接:http://blog.csdn.net/scudz/article/details/7750816
0 0
原创粉丝点击