1、实验一OPENGL基本图形绘制实验一OpenGL基本图形绘制一、实验目的和要求:1、了解三维图形编程机制以及OpenGL三维图形绘制的程序结构;2、通过编程实现简单三维图形的绘制;3、掌握三维图形显示原理。二、实验内容:1、 使用VisualC+6.0和OpenGL编写一个简单的三维程序。2、 建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、 初步了解OpenGL的功能以及语法特点;2、 下载glut包,复制glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/inc
2、lude/gl文件夹下;3、 创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32ConsoleApplication项,然后填入你自己的Projectname,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、 为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:programfilesdevstudiovclib)中。选中菜单Project
3、-AddToProject-Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project-Setting-Link-Object/libraryModules即可。点击工具条中NewTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了;5、 请将下面的程序写入源文件Test.c;#include#includeconstintn=60;constGLfloatR=0.2f;constGLfloatPi=3.1415926536f;
4、voidmyDisplay(void) inti; glClear(GL_COLOR_BUFFER_BIT); /glShadeModel(GL_FLAT); /glShadeModel(GL_SMOOTH); /点 glPointSize(2.0); glBegin(GL_POINTS); glVertex2f(0.0f,0.0f); glEnd(); /由闭合折线组成的圆 glBegin(GL_LINE_LOOP); glColor3f(1.0,1.0,0.0); for(i=0;iAddToProject-Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。
5、这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project-Setting-Link-Object/libraryModules即可。点击工具条中NewTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了;4、 请将下面的程序写入源文件Test.c;#includestaticintangle=45;/定义旋转角度voidreshape(GLsizeiw,GLsizeih) /视口变换 glViewport(0,0,w,h);/使用glViewport来定义视口。其中前两个参数定义了视口的左下脚(0,0表示最
6、左下方) /后两个参数分别是宽度和高度。 /投影变换 glMatrixMode(GL_PROJECTION);/OpenGL支持两种类型的投影变换,即透视投影和正投影。 /投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以 /GL_PROJECTION为参数调用glMatrixMode函数。 /glLoadIdentity();/重置模型观察矩阵 /glFrustum(-1.0,1.0,-1.0,1.0,1.0,10.0); /使用glFrustum函数可以将当前的可视空间设置为透视投影空间。 /用它之前先要用glMatrixMode()说明当前矩阵方式是投影GL_PROJECTION。
7、/也可以使用更常用的gluPerspective函数。 /空间可以是“正投影”的(使用glOrtho或gluOrtho2D), /也可以是“透视投影”的(使用glFrustum或gluPerspective)。 glOrtho(-1.0,1.0,-1.0,1.0,-1.0,6.0); /正射投影,同glFrustum,六个参数分别为:左右垂直切面坐标,底上水平切面坐标 /近深度切面和远深度切面的距离,可为负值。voidmyDisplay() glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /模型变换 glMatrixMode(GL_MODEL
8、VIEW); glTranslatef(0.0f,0.0f,0.0f);/物体在三个坐标上的位移值。 glRotatef(angle,0.5f,0.5f,0.0f);/物体绕(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。 glScalef(1.0,1.0,1.0);/三个参数分别是X、Y、Z轴向的比例变换因子。 /金字塔底边 glBegin(GL_QUADS); glVertex3f(0.5f,-0.5f,0.5f); glVertex3f(-0.5f,-0.5f,0.5f); glVertex3f(0.5f,-0.5f,-0.5f); glVertex3f(
9、-0.5f,-0.5f,-0.5f); glEnd(); glBegin(GL_TRIANGLES); /三角形前侧面 glColor3f(1.0f,0.0f,0.0f); glVertex3f(0.0f,0.5f,0.0f); glColor3f(0.0f,0.5f,0.0f); glVertex3f(-0.5f,-0.5f,0.5f); glColor3f(0.0f,0.0f,0.5f); glVertex3f(0.5f,-0.5f,0.5f); /三角形右侧面 glColor3f(0.0f,1.0f,0.0f); glVertex3f(0.0f,0.5f,0.0f); glColor3f
10、(0.0f,0.0f,0.5f); glVertex3f(0.5f,-0.5f,0.5f); glColor3f(0.0f,0.5f,0.0f); glVertex3f(0.5f,-0.5f,-0.5f); /三角形后侧面 glColor3f(0.0f,0.0f,0.1f); glVertex3f(0.0f,0.5f,0.0f); glColor3f(0.0f,0.5f,0.0f); glVertex3f(0.5f,-0.5f,-0.5f); glColor3f(0.0f,0.0f,0.5f); glVertex3f(-0.5f,-0.5f,-0.5f); /三角形左侧面 glColor3f(
11、1.0f,1.0f,1.0f); glVertex3f(0.0f,0.5f,0.0f); glColor3f(0.0f,0.0f,0.5f); glVertex3f(-0.5f,-0.5f,-0.5f); glColor3f(0.0f,0.5f,0.0f); glVertex3f(-0.5f,-0.5f,0.5f); glEnd(); glFlush();intmain(intargc,char*argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutInitWindowPosition(0,0);
12、glutInitWindowSize(500,500); glutCreateWindow(OpenGL3D坐标转换); glutReshapeFunc(reshape); glutDisplayFunc(&myDisplay); glutMainLoop(); return0;5、 修改投影方式,观察不同的投影变换效果,适当修改绘图函数myDisplay中的内容,自由发挥并绘制三维图形;6、 完成实验报告并提交程序源代码。实验三绘制Bezier曲线一、实验目的和要求:1、 理解Bezier曲线的生成方式;2、 掌握二次Bezier曲线和三次Bezier曲线的生成算法;3、 使用C语言实现Be
13、zier曲线的绘制。二、实验内容:1、 使用VisualC+6.0和OpenGL进行二次Bezier曲线和三次Bezier曲线的绘制。三、实验步骤:1、 下载glut包,复制glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;2、 创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32ConsoleApplication项,然后填入你自己的Projectname,如Test,回车即可。VC为你创建一个工作区(WorkSpace)
14、,你的项目Test就放在这个工作区里;3、 为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:programfilesdevstudiovclib)中。选中菜单Project-AddToProject-Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project-Setting-Link-Object/libraryModules即可。点击工具条中Ne
15、wTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了;4、 请将下面的程序写入源文件Test.c,下面的程序完成二次Bezier曲线的绘制;#include#includeintSCREEN_HEIGHT=480;/屏幕高度/跟踪鼠标点击次数,达到3次后绘制Bezier曲线intNUMPOINTS=0;/点classPointpublic: floatx,y; voidsetxy(floatx2,floaty2)x=x2;y=y2; constPoint&operator=(constPoint&rPoint)x=rPoint
16、.x;y=rPoint.y;return*this;Pointabc3;voidmyInit() glClearColor(0.0,0.0,0.0,0.0); glColor3f(1.0,0.0,0.0); glPointSize(4.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,640.0,0.0,480.0); voiddrawDot(intx,inty) glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); glFlush();voiddrawLine(Pointp
17、1,Pointp2) glBegin(GL_LINES); glVertex2f(p1.x,p1.y); glVertex2f(p2.x,p2.y); glEnd(); glFlush();/计算下一个Bezier曲线上的点PointdrawBezier(PointA,PointB,PointC,doublet) PointP; P.x=pow(1-t),2)*A.x+2*t*(1-t)*B.x+pow(t,2)*C.x; P.y=pow(1-t),2)*A.y+2*t*(1-t)*B.y+pow(t,2)*C.y; returnP;voidmyMouse(intbutton,intstate
18、,intx,inty)/左键按下if(button=GLUT_LEFT_BUTTON&state=GLUT_DOWN) /存储鼠标点击的点 abcNUMPOINTS.setxy(float)x,(float)(SCREEN_HEIGHT-y); NUMPOINTS+; /绘制红点 drawDot(x,SCREEN_HEIGHT-y); /绘制Bezier曲线 if(NUMPOINTS=3) glColor3f(1.0,1.0,1.0); /绘制控制多边形 drawLine(abc0,abc1); drawLine(abc1,abc2); PointPOld=abc0; /绘制Bezier曲线段
19、,控制t的增量可以控制曲线精度 for(doublet=0.0;t=1.0;t+=0.1) PointP=drawBezier(abc0,abc1,abc2,t); drawLine(POld,P); POld=P; glColor3f(1.0,0.0,0.0); NUMPOINTS=0; voidmyDisplay() glClear(GL_COLOR_BUFFER_BIT); glFlush();intmain(intargc,char*argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(100,150); glutCreateWindow(BezierCurve); glutMouseFunc(myMouse); glutDisplayFunc(myDisplay); myInit(); glutMainLoop(); return0;5、 扩展程序代码,可以支持3次Bezier曲线的绘制;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1