2024年4月1日发(作者:)

#include

static GLfloat xRot = 0.0f;

static GLfloat yRot = 0.0f;

void Reshape(int w, int h)

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glClearColor(0.5f,0.5f,1.0f,0.5f);

GLfloat Scale;

if(h == 0)

h = 1;

glViewport(0, 0, w, h);

Scale = (GLfloat)w/(GLfloat)h;

glMatrixMode(GL_PROJECTION);

glLoadIdentity()

gluPerspective(40.0f, Scale, 1.0, 40.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void SpecialKeys(int key, int x, int y)

{

if(key == GLUT_KEY_UP)

xRot-= 1.0f;

if(key == GLUT_KEY_DOWN)

xRot += 1.0f;

if(key == GLUT_KEY_LEFT)

yRot -= 1.0f;

if(key == GLUT_KEY_RIGHT)

yRot += 1.0f;

xRot = (GLfloat)((const int)xRot % 360);

yRot = (GLfloat)((const int)yRot % 360);

glutPostRedisplay();

}

void Display(void)

{

GLUquadricObj *pObj;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glTranslatef(0.0f, -1.0f, -5.0f);

glRotatef(xRot, 1.0f, 0.0f, 0.0f);

glRotatef(yRot, 0.0f, 1.0f, 0.0f);

pObj = gluNewQuadric();

gluQuadricNormals(pObj, GLU_SMOOTH);

// Main Body

glPushMatrix();

glColor3f(1.0f, 1.0f, 1.0f);

gluSphere(pObj, .40f, 26, 13); // Bottom

glTranslatef(0.0f, .550f, 0.0f); // Mid section

gluSphere(pObj, .3f, 26, 13);

glTranslatef(0.0f, 0.45f, 0.0f); // Head

gluSphere(pObj, 0.24f, 26, 13);

// Eyes

glColor3f(0.0f, 0.0f, 0.0f);

glTranslatef(0.1f, 0.1f, 0.21f);

gluSphere(pObj, 0.02f, 26, 13);

glTranslatef(-0.2f, 0.0f, 0.0f);

gluSphere(pObj, 0.02f, 26, 13);

// Nose

glColor3f(1.0f, 0.3f, 0.3f);

glTranslatef(0.1f, -0.12f, 0.0f);

gluCylinder(pObj, 0.04f, 0.0f, 0.3f, 26, 13);

glPopMatrix();

// Hat

glPushMatrix();

glColor3f(0.0f, 0.0f, 0.0f);

glTranslatef(0.0f, 1.17f, 0.0f);

glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);

gluCylinder(pObj, 0.17f, 0.17f, 0.4f, 26, 13);

// Hat brim

glDisable(GL_CULL_FACE);

gluDisk(pObj, 0.17f, 0.28f, 26, 13);

glEnable(GL_CULL_FACE);

glTranslatef(0.0f, 0.0f, 0.40f);

gluDisk(pObj, 0.0f, 0.17f, 26, 13);

glPopMatrix();

glPopMatrix();

glutSwapBuffers();

}

int main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize(800, 600);

glutCreateWindow("Snowman");

glutReshapeFunc(Reshape);

glutSpecialFunc(SpecialKeys);

glutDisplayFunc(Display);

glutMainLoop();

return 0;

}