Почему мой & quot; самодельный & quot; 3D объект openGL не закрашен должным образом?

Я пытаюсь сделать 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();

Это успешно рисует квадратную усечку, которую я могу вращать, масштабировать и переводить без проблем. Тем не менее, затенение отключено. Это должно быть ярко-желтый, но все стороны выглядят так, как будто они были равномерно затенены. Вы можете видеть, что моя штриховка работает в целом для всех моих других прекрасных форм.

Я неправильно строю свой квадратный усеченный конус? Как мне заставить шейдинг применить его правильно?

введите описание изображения здесь

-1

Решение

Вам также нужно установить нормали, используя 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]);

// ...

(Конечно, вы хотите поместить это в функцию вместо того, чтобы копировать ее для всех шести полигонов …)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]