OpenGL 计算三角形法线 C++

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL 计算三角形法线 C++相关的知识,希望对你有一定的参考价值。

三角形的三个顶点是任意的,现在需要为三角形计算法线向量,以便得到合格的光照效果。
最好是这样的:
写一个函数:
JiSuanFaXian(```)给9个数值给它,9个分别是3个顶点的X Y Z 坐标
然后函数计算好 glNormal3f 所需要的三个浮点数值。

顺便把原理也贴出来!十分感谢!

用normal,传入4个float[3], 前3个点, 后1个返回法线, 然后用glNormal3fv 就行
#include <math.h> //sqrt
#define M2(x) ((x)*(x))
inline void normalize(float v[3])

register GLfloat d = sqrt(M2(v[0])+M2(v[1])+M2(v[2]));
if(d==0.0)return;
v[0]/=d;
v[1]/=d;
v[2]/=d;

inline void normcrossprod(float v1[3],float v2[3],register float out[3])

out[0]=v1[1]*v2[2]-v1[2]*v2[1];
out[1]=v1[2]*v2[0]-v1[0]*v2[2];
out[2]=v1[0]*v2[1]-v1[1]*v2[0];
normalize(out);

void normal(float v1[3],float v2[3],float v3[3],float norm[3])

float d1[3],d2[3];
for(register int i=0;i<3;i++)

d1[i]=v1[i]-v2[i];
d2[i]=v2[i]-v3[i];

normcrossprod(d1,d2,norm);
参考技术A ^ Vn (Normal)
|
|
|
|
v1 *------------------* v2 (Vu)
/ /
/ /
/ /
/ /
v3 *------------------
(Vv)

Vector4 u, v;
u = v2 - v1;
v = v3 - v1;
normal = CrossProduct(u, v); // 向量叉积

以上是关于OpenGL 计算三角形法线 C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenGl中计算三角形网格的顶点法线?

OpenGL在给定点列表的情况下计算正确的法线

计算 GL_TRIANGLE 的顶点法线

为 OpenGL Gouraud 着色提供带有三角形条和扇形的法线

openGL中的法向量问题

OpenGL,尽管逆时针顺序,一些法线反转