对立方体的法线似乎指向内部

时间:2017-04-21 14:32:34

标签: c++ opengl normals

我编写了以下函数来绘制立方体:

void drawCube() {

   Point vertices[8] = { Point(-1.0, -1.0, -1.0), Point(-1.0, -1.0, 1.0), Point(1.0, -1.0, 1.0), Point(1.0, -1.0, -1.0),
                         Point(-1.0, 1.0, -1.0), Point(-1.0, 1.0, 1.0), Point(1.0, 1.0, 1.0), Point(1.0, 1.0, -1.0) };

   int faces[6][4] = {{0, 1, 2, 3}, {0, 3, 7, 4}, {0, 1, 5, 4}, {1, 2, 6, 5}, {3, 2, 6, 7}, {4, 5, 6, 7}};

   glBegin(GL_QUADS);

   for (unsigned int face = 0; face < 6; face++) {

     Vector v = vertices[faces[face][1]] - vertices[faces[face][0]];
     Vector w = vertices[faces[face][2]] - vertices[faces[face][0]];

     Vector normal = v.cross(w).normalised();

     glNormal3f(normal.dx, normal.dy, normal.dz);

     for (unsigned int vertex = 0; vertex < 4; vertex++) {

       switch (vertex) {
         case 0: glTexCoord2f(0, 0); break;
         case 1: glTexCoord2f(1, 0); break;
         case 2: glTexCoord2f(1, 1); break;
         case 3: glTexCoord2f(0, 1); break;
       }

       glVertex3f(vertices[faces[face][vertex]].x, vertices[faces[face][vertex]].y, vertices[faces[face][vertex]].z);
     }
   }

   glEnd();
}

当立方体被照射到它上面的光渲染时,看起来当我旋转立方体时,正确的阴影过渡只发生在大约一半的面上。剩下的只是一个非常黑暗的阴影,好像我已经删除了正常的计算。

然后我决定删除几个面以查看立方体内部。在外部没有正确反射光线的面部正在内侧正确地进行。如何确保每张脸的法线指向该脸部,而不是指向立方体的中心?

2 个答案:

答案 0 :(得分:1)

要反转正常方向,请交换用于交叉产品的订单:

{{1}}

答案 1 :(得分:0)

也许有一种更有效的方式,但以下是一种非常容易理解的方式....

计算从侧面中心指向立方体中心的矢量。叫它

m = center cube - center side

然后用您的法线计算该向量的标量积:

x = < m , n >

如果两个矢量指向相对于侧面的相同方向(它们之间的角度小于90度),则标量积为正。如果它们指向相反方向(角度大于90度)则为负。然后纠正你的正常通过

if ( x > 0 ) n = -n;

确保它总是向外指出。