2015-08-10 6 views
-1

Я пытаюсь нарисовать робота с кубической головой, используя glutSolidCube(), и нарисовать его глаза, используя glutSolidSphere().OpenGL с GLUT: Твердые объекты являются трансперентами

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

Как предотвратить эту прозрачность?


передний вид:

Front



Посмотрите со спины и правого края головы: Back

прилагаю мой код здесь:

#include <GL/glut.h> 
#include <stdio.h> 

GLsizei winWidth = 800; 
GLsizei winHeight = 800; 


// Global Variables 
static float eyeX = 0.0; 
static float eyeY = 0.5; 
static float eyeZ = 4.0; 
static float robotBottomX = 0.0; 
static float robotBottomZ = 0.0; 

void init() { 
    glClearColor(1.0, 1.0, 1.0, 0.0); 
} 

void displayFloor() { 
    int i, j; 

    for (i = -20 ; i < 20 ; i++) { 
     int startWithBlack = (i % 2 == 0); 
     for (j = -20 ; j < 20 ; j++) { 
      int black = ((startWithBlack && abs(j) % 2 == 0) || ((!startWithBlack) && abs(j) % 2 == 1)); 
      glColor3f(0.0, 1.0, 0.0); 
      if (black) { 
       glColor3f(1.0, 0.0, 0.0); 
      } 
      glPushMatrix(); 
      //glTranslatef((double)i + 0.5, 0.0, (double)j + 0.5); 
      glTranslatef((double)i/2.0, 0.0, (double)j/2.0); 
      glScalef(1.0, 0.0, 1.0); 
      glutSolidCube(1.0); 
      glPopMatrix(); 
     } 
    } 
} 

void displayRobot() { 
    puts("D: display function was called"); 

    glClear(GL_COLOR_BUFFER_BIT); 
    glPushMatrix(); 
    gluLookAt(eyeX, eyeY, eyeZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
    displayFloor(); 
    glColor3f(0.2, 0.2, 0.2); 
    glScalef(1.0, 1.0, 1.0); 
    glTranslatef(robotBottomX, 0.0, robotBottomZ); 
    glutSolidCube(1.0); 
    glPushMatrix(); 
    glTranslatef(0.0, 0.6, 0.0); 
    glScalef(0.2, 0.2, 0.2); 
    glColor3f(0.5, 0.5, 0.2); 
    glutSolidCube(1.0); 
    glPopMatrix(); 
    glPushMatrix(); 
    glTranslatef(0.0, 0.95, 0.0); 
    glScalef(0.5, 0.5, 0.5); 
    glColor3f(0.2, 0.5, 0.2); 
    glutSolidCube(1.0); 
    glPopMatrix(); 
    glPushMatrix(); 
    glTranslatef(0.15, 1.1, 0.25); 
    glScalef(0.05, 0.05, 0.0); 
    glColor4f(0.7, 0.7, 0.7, 0.5); 
    glutSolidSphere(1.0, 50, 50); 
    glPopMatrix(); 
    glPushMatrix(); 
    glTranslatef(-0.15, 1.1, 0.28); 
    glScalef(0.05, 0.05, 0.0); 
    glColor4f(0.7, 0.7, 0.7, 0.5); 
    glutSolidSphere(1.0, 50, 50); 
    glPopMatrix(); 
    glPopMatrix(); 

    glFlush(); 
} 


void winReshape(GLint newWidth, GLint newHeight) { 
    glViewport(0, 0, newWidth, newHeight); 
    glMatrixMode(GL_PROJECTION); 
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 20.0); 
    glMatrixMode(GL_MODELVIEW); 
    glClear(GL_COLOR_BUFFER_BIT); 

} 

void main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(winWidth, winHeight); 
    glutCreateWindow("Robot"); 

    init(); 
    glutDisplayFunc(displayRobot); 
    glutReshapeFunc(winReshape); 

    glutMainLoop(); 
} 

ответ

1

Я нашел решение, поэтому я выложу его здесь для публики:

  1. В функции init(), нужно добавить:

    glEnable(GL_DEPTH_TEST);

  2. в функции живописи, в glClear() вызова, добавьте " | GL_DEPTH_BUFFER_BIT":

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  3. В функции main(), в glutInitDisplayMode() вызова, добавьте " | GLUT_DEPTH":

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);