【问题标题】:Normals to a cube seem to be pointing inwards立方体的法线似乎指向内部
【发布时间】:2017-04-21 14:32:33
【问题描述】:

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

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();
}

当光照在立方体上渲染时,看起来当我旋转立方体时,正确的阴影过渡只发生在大约一半的面上。其余的只是保持非常暗的阴影,好像我已经删除了正常的计算。

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

【问题讨论】:

  • 如果您知道立方体的中心,您可以轻松检查法线是否远离它
  • 我可以检查从中心到法线向量 (x, y, z) 的距离是否大于从中心到计算法线的点的距离吗?如果没有,则设置normal = -normal?
  • 对不起,我的评论部分错误和误导,我会在第二次写一个答案

标签: c++ opengl normals


【解决方案1】:

要反转法线的方向,请交换用于叉积的顺序:

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

【讨论】:

  • 但是,只有一些法线指向内侧,我如何检查法线是否指向内侧?如果是,那我可以按照你上面说的做
  • @KOB 您需要更改某些面的顶点顺序,以便所有面的顶点在您查看时都以相同的顺序(顺时针或逆时针)他们。您的系统需要具有一致的惯用手(右手或左手)。
  • 我的脸呈现方式的惯用手是整个问题的根源 - 纠正这个问题解决了所有问题。
  • 阅读您的答案,误解了它,写了我的,意识到您的解决方案是您的解决方案,而我的解决方案是 ...*facepalm*
【解决方案2】:

也许有一种更有效的方法,但恕我直言,很容易理解的方法如下......

计算从边中心到立方体中心的向量。叫它

m = center cube - center side

然后用你的法线计算那个向量的标量积:

x = < m , n >

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

纠正你的正常
if ( x > 0 ) n = -n;

确保它始终指向外部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多