1

照明と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);

ここに画像の説明を入力してください

4

1 に答える 1

2

翻訳の結果、実際には球の端に配置されます。つまり、ポリゴンは実際には「あなた」を通り抜けます。ニアクリッププレーンの結果として何も表示されず、背面カリングのおかげで、球の反対側にあるトリスを表示できません。

次のいずれかを設定します。

glCullFace( GL_FRONT );

または、球をさらに遠ざけるように変換を設定します。

glTranslatef(0, 0, -200);
于 2012-11-27T18:59:54.957 に答える