计算多边形的 OpenGL 面法线

标签 c opengl 3d normals

我正在尝试向从点多边形文件创建的多边形添加照明。我的问题是,当从这些点创建 vector 时,我只点亮了多边形的某个部分,然后如果我反转法线的计算(从 A.x - C.x 到 C.x - A.x),它会点亮之前未点亮的部分。代码和图片如下。

A.x - D.x

D.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;
    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;

您可能想研究使用矩阵/vector 库。如果您进行一些搜索,其中有许多是免费提供的。

关于计算多边形的 OpenGL 面法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26129772/

相关文章:

c - 将由逗号分隔的数字列表读取到 C 中的数组中

c - GTK+ 线程与 OpenGL 的 GLUT/FreeGLUT

opengl - 从 3D 噪声计算每顶点法线

c++ - 基本 3D OpenGL 碰撞检测 C++

javascript - 旋转后如何计算一个点在 HTML5 canvas 中的位置?

c - C程序中struct和union如何分配内存?

c - `dlopen` 从同一 DSO 内部访问 DSO

c++ - CppCheck。可以缩小变量的范围(和循环)

c++ - 编写代码,不会导致很多页面错误

iOS5 和 OpenGL ES 2.0 最佳编译器