为什么我的“自制”openGL 3D对象没有正确遮蔽?

时间:2012-10-07 21:26:40

标签: c++ opengl graphics glut glu

我试图通过绘制顶点来制作3D方形截头体:

int xPts[] = { 1.0,  1.0, -1.0, -1.0,  2.0,  2.0, -2.0, -2.0 };
int yPts[] = { 1.0,  1.0,  1.0,  1.0, -1.0, -1.0, -1.0, -1.0 };
int zPts[] = { 1.0, -1.0, -1.0,  1.0,  2.0, -2.0, -2.0,  2.0 };

int sideA[] = { 0, 3, 7, 4 };
int sideB[] = { 0, 1, 5, 4 };
int sideC[] = { 2, 3, 7, 6 };
int sideD[] = { 1, 2, 6, 5 };

glPolygonMode(GL_FRONT, GL_FILL);

glPushMatrix();
    glTranslatef(xLoc, yLoc, zLoc);

    glRotatef(xRotation, 1, 0, 0);
    glRotatef(yRotation, 0, 1, 0);
    glRotatef(zRotation, 0, 0, 1);

    glScalef(xSize, ySize, zSize);

    glBegin(GL_POLYGON);
        for (int i = 0; i < 4; i++) {
            glVertex3f(xPts[i], yPts[i], zPts[i]);
        }

        for (int i = 4; i < 8; i++) {
            glVertex3f(xPts[i], yPts[i], zPts[i]);
        }

        for (int i = 0; i < 4; i++) {
            glVertex3f(xPts[sideA[i]], yPts[sideA[i]], zPts[sideA[i]]);
        }

        for (int i = 0; i < 4; i++) {
            glVertex3f(xPts[sideB[i]], yPts[sideB[i]], zPts[sideB[i]]);
        }

        for (int i = 0; i < 4; i++) {
            glVertex3f(xPts[sideC[i]], yPts[sideC[i]], zPts[sideC[i]]);
        }

        for (int i = 0; i < 4; i++) {
            glVertex3f(xPts[sideD[i]], yPts[sideD[i]], zPts[sideD[i]]);
        }
    glEnd();
glPopMatrix();

这成功地绘制了一个方形平截头体,我可以旋转,缩放和翻译没有问题。但是,阴影已关闭。它应该是一个明亮的黄色,但所有的侧面看起来都是均匀的阴影。你可以看到我的阴影对我所有其他可爱的形状都有效。

我是否完全错误地建造了我的方形截头体?如何正确应用阴影?

enter image description here

1 个答案:

答案 0 :(得分:3)

您还需要使用glNormal3f设置法线,否则无法计算光照/阴影。在您的情况下计算这些的最简单方法是简单地计算六个平面中每个平面的两个相邻边的叉积。因此,如果你手头有一些矢量数学库,那么第一个法线的代码就是这样的:

Vector3f v1(xPts[0], yPts[0], zPts[0]);
Vector3f v2(xPts[1], yPts[1], zPts[1]);
Vector3f v3(xPts[2], yPts[2], zPts[2]);
Vector3f edge1 = v1 - v2;
Vector3f edge2 = v3 - v2;
Vector3f normal = edge2.cross(edge1).normalize();
glNormal3f(normal.x, normal.y, normal.z);
for (int i = 0; i < 4; i++)
  glVertex3f(xPts[i], yPts[i], zPts[i]);

// ...

(当然你想把它放到一个函数中,而不是为所有六个多边形复制它...)