屏幕上看不到实心球体

时间:2012-11-27 18:46:46

标签: c opengl glut

我正在尝试将灯光与3D图形结合起来。球体的深度为100,它的半径为100.我使用translatef使其远离眼睛位置。
但屏幕上没有显示任何内容:

#import <OpenGL/OpenGL.h>
#import <GLUT/GLUT.h>

GLfloat width=500, height=500;
GLfloat angle=0.0;

void makeRound (GLfloat* angle)
{
    if(*angle>360.0)
    {
        *angle-=360.0;
    }
    else if(*angle<0.0)
    {
        *angle+=360.0;
    }
}

void init(void)
{
    GLfloat mat_specular[]   = { 1.0, 0.0, 0.0, 0.0 };
    GLfloat mat_diffuse[]    = { 0.9, 0.0, 0.0, 0.0 };
    GLfloat mat_shininess[]  = { 50.0 };
    GLfloat light_position[] = { 5.0, 5.0, 5.0, 1.0 };
    GLfloat white_light[]    = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat lmodel_ambient[] = { 0.1, 0.5, 0.1, 1.0 };

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, 0, 0, 0, 100, 0, 1, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1, 1, 1000);

    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_SMOOTH);

    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
    glLightfv(GL_LIGHT0, GL_SPECULAR,white_light);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
}

void display(void)
{
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();
    glRotatef(angle, 0, 1, 0);
    glTranslatef(0, 0, 100);
    glutSolidSphere (100.0, 80, 64);
    glPopMatrix();

    glutSwapBuffers();
}


void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
        case '+':
            angle+=5.0;
            makeRound(&angle);
            glutPostRedisplay();
            break;
        case '-':
            angle-=5.0;
            makeRound(&angle);
            glutPostRedisplay();
            break;
        default:
            break;
    }
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize (width, height);
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    init ();
    glutMainLoop();
    return 0;
}

更新

这就是我所看到的:

glTranslatef(0,0,-200);

enter image description here

1 个答案:

答案 0 :(得分:2)

作为翻译的结果,您实际上位于球体的边缘。这意味着多边形实际上是“你”。你不会看到任何由于你的近平面飞机造成的任何结果,并且由于背面剔除,你无法看到球体另一侧的三角形。

设置:

glCullFace( GL_FRONT );

或者设置变换以将球体推得更远:

glTranslatef(0, 0, -200);