-1

我正在尝试通过绘制顶点来制作一个 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();

这成功地绘制了一个方形平截头体,我可以毫无问题地旋转、缩放和平移它。但是,阴影已关闭。它应该是亮黄色,但所有侧面看起来都被均匀着色。你可以看到我的阴影一般适用于我所有其他可爱的形状。

我要建造我的方形平截头体是完全错误的吗?如何让阴影正确应用到它?

在此处输入图像描述

4

1 回答 1

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]);

// ...

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

于 2012-10-07T21:51:01.180 回答