我计算机图形学的实验文档,分享一下.
一、效果图
(懒得上传了)
二、具体内容
本次实验为建模,我画了一个茶壶,两个杯子,两个杯托。
三、代码说明
glutInit(&argc, argv);
初始化和开启事件处理循环。
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
函数功能:设置初始显示模式,GLUT_DOUBLE指定双缓存窗口,GLUT_RGB指定 RGB 颜色模式的窗口,GLUT_DEPTH窗口使用深度缓存。
glutInitWindowSize(800,600);
glutInitWindowPosition(100,100);
glutCreateWindow("title");
制定产生的窗口的大小,位置和标题,以及生成窗口
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
GL_COLOR_BUFFER_BIT表示清除颜色,GL_DEPTH_BUFFER_BIT表示清除深度缓冲
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
以GL_DEPTH_TEST为参数调用glEnable函数,启动深度测试和光照。
glutReshapeFunc(reshape);
窗口大小改变时调用reshape回调函数
glViewport(0, 0, (GLsizei)w, (GLsizei)h) ;
设置视口大小为整个窗口大小
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
/单位化投影矩阵。
gluPerspective(90,w/h,0.5,200);
设置投影矩阵,参数分别是:角度,视景体的宽高比,沿z轴方向的两裁面之间的距离的近处,沿z轴方向的两裁面之间的距离的远处
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
gluLookAt(-15,30,40,0,0,0,0,10,0);
设置模型视图矩阵
glutDisplayFunc(draw);
为当前窗口设置显示回调函数,此处调用draw函数
glEnable(GL_LIGHT0);
使用GL_LIGHT0表示第0号光源
glutMainLoop();
进行一个消息循环。
//show函数
glPushMatrix();//茶壶
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(0.51,0.0,0.1,0.0);
glTranslatef(0,8,0);
glScalef(5,10,5);
glutSolidTeapot(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
矩阵有自己的“堆栈”,方便进行保存和恢复。使用的函数是glPushMatrix和glPopMatrix。
glEnable(GL_COLOR_MATERIAL)开启设置物体绘制的颜色
glColorMaterial(GL_FRONT,GL_AMBIENT) 设置正面填充,环绕
glTranslatef(0,8,0);移动矩阵
glScalef(5,10,5);缩放矩阵
glutSolidTeapot(1);调用glut库中的绘制茶壶的函数
GLUquadricObj *pObj;
创建弧形物体
glPushMatrix();//第一个杯子 左边
pObj = gluNewQuadric();
gluQuadricNormals(pObj,GLU_SMOOTH);
glTranslatef(-8,6,8);
glRotatef(90,1,0,0);
gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);
glPopMatrix();
gluNewQuadric()创建一个二次曲面对象,并返回指针
gluQuadricNormals(pObj,GLU_SMOOTH) 指定法线模式, 每个定点一个法线
gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);obj被指定为沿着z轴方向定义的,底面是z = 0,高度为height,底面半径base和顶面半径为radius用来逼近的多边形用来实现侧面,地面和顶面为空,slices是经线,stacks是纬线void gluCylinder(GLUquadricObj* obj, GLdouble base, GLdouble top,GLdouble height, GLdouble slices, Gldoble stacks)
glPushMatrix(); //桌面上垫圈
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(0.21,0.21,0.21,0.0);
pObj= gluNewQuadric();
glTranslatef(-8,1,8);
glRotatef(90,1,0,0);
gluDisk(pObj, 0.50f, 3.0f, 10, 10);
glPopMatrix();
圆盘Disk是平面物体,中心有一个空洞。圆盘在z = 0创建,inner指定内半径,outer指定外半径slices指定了经线,而rings指定了环数
void gluDisk(GLUquadricObj* obj,GLdouble inner, GLdouble outer,Glint slices, GLint rings)