C 多边形的OpenGL面法线计算
我正在尝试向从点多边形文件创建的多边形添加照明。我的问题是,当从点创建向量时,我只会照亮多边形的某一部分,然后如果我反转法线的计算(从a.x-C.x到C.x-a.x),它会照亮之前未照亮的部分。代码和图片如下C 多边形的OpenGL面法线计算,c,opengl,3d,normals,C,Opengl,3d,Normals,我正在尝试向从点多边形文件创建的多边形添加照明。我的问题是,当从点创建向量时,我只会照亮多边形的某一部分,然后如果我反转法线的计算(从a.x-C.x到C.x-a.x),它会照亮之前未照亮的部分。代码和图片如下 h_vector V1;//= (p2 - p1); // A = 0 B = 1 C = 2 D =3 V1.x = vertices[1].x - vertices[0].x; V1.y = vertices[1].y - vertices[0].y;
h_vector V1;//= (p2 - p1);
// A = 0 B = 1 C = 2 D =3
V1.x = vertices[1].x - vertices[0].x;
V1.y = vertices[1].y - vertices[0].y;
V1.z = vertices[1].z - vertices[0].z;
h_vector V2;// = (p3 - p1);
V2.x = vertices[3].x - vertices[0].x;
V2.y = vertices[3].y - vertices[0].y;
V2.z = vertices[3].z - vertices[0].z;
/*
h_vector V1;//= (p2 - p1);
V1.x = vertices[0].x - vertices[1].x;
V1.y = vertices[0].y - vertices[1].y;
V1.z = vertices[0].z - vertices[1].z;
h_vector V2;// = (p3 - p1);
V2.x = vertices[0].x - vertices[3].x;
V2.y = vertices[0].y - vertices[3].y;
V2.z = vertices[0].z - vertices[3].z;
*/
surfaceNormal.x = (V1.y*V2.z) - (V1.z-V2.y);
surfaceNormal.y = - ( (V2.z * V1.x) - (V2.x * V1.z) );
surfaceNormal.z = (V1.x-V2.y) - (V1.y-V2.x);
float normalize = sqrtf((pow(surfaceNormal.x,2) + pow(surfaceNormal.y,2) + pow(surfaceNormal.z,2)));
surfaceNormal.x = surfaceNormal.x/normalize;
surfaceNormal.y = surfaceNormal.y/normalize;
surfaceNormal.z = surfaceNormal.z/normalize;
此跨产品代码被严重破坏:
surfaceNormal.x = (V1.y*V2.z) - (V1.z-V2.y);
surfaceNormal.y = - ( (V2.z * V1.x) - (V2.x * V1.z) );
surfaceNormal.z = (V1.x-V2.y) - (V1.y-V2.x);
括号内的表达式都应该有一个乘法运算符,但在上面的代码中,有一半是减法运算
叉积计算应为:
surfaceNormal.x = V1.y * V2.z - V1.z * V2.y;
surfaceNormal.y = V1.z * V2.x - V1.x * V2.z;
surfaceNormal.z = V1.x * V2.y - V1.y * V2.x;
您可能需要研究如何使用矩阵/向量库。如果您进行一些搜索,其中有许多代码是免费提供的。问题似乎是面部剔除,而不是法线,但在结束之前需要查看其余代码。不相关,但法线计算可以用更简单的方法完成。