OpenGL绘制的几类三维实体
EXAM304_H
//防止重复嵌入
#if !defined _EXAM304_H_
#define _EXAM304_H_
//指定嵌入文件
#include<gl/glut.h>
#include<math.h>
//宏
#define RADIUS 50.0f
#define SIZE 100.0f
#define CONE 1
#define TETRAHEDRON 2
#define CUBE 3
#define DODECAHEDRON 4
#define ICOSAHEDRON 5
#define OCTAHEDRON 6
#define SPHERE 7
#define TORUS 8
#define TEAPOT 9
#define WIRED 10
//全局变量
GLboolean bWire=false;
GLint nSelected=CONE;
//函数原型
void OnDisplay(void);
void OnReshape(int,int);
void OnMenu(int value);
void CreateMenu();
void SetupLights();
#endif
EXAM304.cpp
#include "EXAM304.H"
void main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutCreateWindow("EXAM304");
glutCreateMenu(OnMenu);
glutDisplayFunc(OnDisplay);
glutReshapeFunc(OnReshape);
CreateMenu();
SetupLights();
glutMainLoop();
}
void OnDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glPushMatrix();
glColor3f(0.0f,1.0f,1.0f);
glEnable(GL_NORMALIZE);
switch(nSelected)
{
case(CONE):
if(bWire)
glutWireCone(RADIUS,2*RADIUS,30,30);
else
glutSolidCone(RADIUS,2*RADIUS,30,30);
break;
case(TETRAHEDRON):
glPushMatrix();
glScalef(RADIUS,RADIUS,RADIUS);
if(bWire)
glutWireTetrahedron();
else
glutSolidTetrahedron();
glPopMatrix();
break;
case(CUBE):
if(bWire)
glutWireCube(1.5*RADIUS);
else
glutSolidCube(1.5*RADIUS);
break;
case(DODECAHEDRON):
glPushMatrix();
glScalef(RADIUS/2,RADIUS/2,RADIUS/2);
if(bWire)
glutWireDodecahedron();
else
glutSolidDodecahedron();
glPopMatrix();
break;
case(ICOSAHEDRON):
glPushMatrix();
glScalef(RADIUS,RADIUS,RADIUS);
if(bWire)
glutWireIcosahedron();
else
glutSolidIcosahedron();
glPopMatrix();
break;
case(OCTAHEDRON):
glPushMatrix();
glScalef(RADIUS,RADIUS,RADIUS);
if(bWire)
glutWireOctahedron();
else
glutSolidOctahedron();
glPopMatrix();
break;
case(SPHERE):
if(bWire)
glutWireSphere(RADIUS,30,30);
else
glutSolidSphere(RADIUS,30,30);
break;
case(TORUS):
if(bWire)
glutWireTorus(RADIUS/2,RADIUS,30,30);
else
glutSolidTorus(RADIUS/2,RADIUS,30,30);
break;
case(TEAPOT):
if(bWire)
glutWireTeapot(RADIUS);
else
glutSolidTeapot(RADIUS);
}
glPopMatrix();
glutSwapBuffers();
}
//窗口尺寸变化后的回调函数
void OnReshape(int w,int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect=(float)h/(float)w;
if(w<=h)
glOrtho(-SIZE,SIZE,-SIZE*aspect,SIZE*aspect,-SIZE,SIZE);
else
glOrtho(-SIZE/aspect,SIZE/aspect,-SIZE,SIZE,-SIZE,SIZE);
gluLookAt(10.0f,20.0f,25.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
}
void OnMenu(int value)
{
if(value==WIRED)
bWire=!bWire;
else
nSelected=value;
glutPostRedisplay();
}
void CreateMenu()
{
glutAddMenuEntry("圆锥体",CONE);
glutAddMenuEntry("四面体",TETRAHEDRON);
glutAddMenuEntry("正方体",CUBE);
glutAddMenuEntry("正十二面体",DODECAHEDRON);
glutAddMenuEntry("正二十面体",ICOSAHEDRON);
glutAddMenuEntry("正八面体",OCTAHEDRON);
glutAddMenuEntry("球体",SPHERE);
glutAddMenuEntry("圆环体",TORUS);
glutAddMenuEntry("茶壶",TEAPOT);
glutAddMenuEntry("线框或实体",WIRED);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
void SetupLights()
{
GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};
GLfloat diffuseLight[]={0.9f,0.9f,0.9f,1.0f};
GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};
GLfloat lightPos[]={50.0f,100.0f,80.0f,1.0f};
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight);
glMateriali(GL_FRONT,GL_SHININESS,100);
}