-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 を使用して法線を設定する必要があります。そうしないと、ライティング/シェーディングを計算できません。あなたのケースでこれらを計算する最も簡単な方法は、6 つの平面のそれぞれについて、隣接する 2 つのエッジの外積を単純に計算することです。したがって、ベクトル数学ライブラリが手元にある場合、最初の法線のコードは次のようになります。

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

// ...

(もちろん、6 つのポリゴンすべてにコピーするのではなく、これを関数に入れたいと思います...)

于 2012-10-07T21:51:01.180 に答える