电子科大计算机学院三维图形程序设计实验报告.docx
《电子科大计算机学院三维图形程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《电子科大计算机学院三维图形程序设计实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
电子科大计算机学院三维图形程序设计实验报告
实验报告
课程名称:
三维图形程序设计
学 院:
计算机科学与工程学院
专 业:
计算机科学与技术
指导教师:
周川
学生姓名:
郫县卡戴珊
学 号:
2014666666666
实验成绩:
日 期:
2016年3月31日
电子科技大学计算机学院实验中心
电子科技大学
实验报告
一、实验一:
三维图形程序上机操作训练与图元编程
二、实验室名称:
主楼A2412实验时间:
2016年3月31号
三、实验目的:
1.掌握VC中OpenGL三维编程环境的建立过程;
2.掌握GLUT编写OpenGL应用程序的基本步骤,熟悉GLUT基于事件驱动的编程模型;
3.掌握不同类型图元的顶点装配方式,并能够利用图元建立简单的几何对象。
四、实验原理:
OpenGL编程语言
面向对象编程技术
五、实验内容:
(一)安装、配置和测试OpenGL三维编程环境
1.首先检查Windows操作系统中是否正确安装了VisualStudio集成开发环境:
实验要求在WindowsXP、VisualC++2005平台以上;
2.解压OpenGL.zip到任意目录下;
3.检查OpenGL核心库和实用库及其头文件是否安装正确和完整:
检查%VSINSTALLDIR%\VC\PlatformSDK\Include\GL目录下是否存在gl.h、glu.h两个头文件,并从解压得到的GL子目录下拷贝缺少的头文件到该目录下;检查%VSINSTALLDIR%\VC\PlatformSDK\Lib目录下是否存在OpenGL32.lib、GLU32.lib两个库文件,并从解压得到的Lib子目录下拷贝缺少的Lib文件到该目录下;
4.安装GLUT库及其头文件。
从解压得到的GL子目录下拷贝glut.h到%VSINSTALLDIR%\VC\PlatformSDK\Include\GL目录中,从解压得到的Lib子目录下拷贝
glut32.lib到%VSINSTALLDIR%\VC\PlatformSDK\Lib下,拷贝glut32.dll到%windir%\system32目录下。
5.检测OpenGL环境是否配置正确。
a.打开VisualStudio集成开发环境,新建一个类型为“Win32控制台应用程序”的空项目Test;
b.在项目中新建一个C源文件Test.c;
c.拷贝如下代码到Test.c中;
d.生成Test项目,观察“输出”窗口中的编译和链接输出信息,若显示类似“生成:
1已成功,0已失败,0最新,0已跳过”表明项目生成成功,否则根据输出信息检查程序或者OpenGL编程环境是否设置正确,并在改正后重新生成Test项目;
e.运行Test.exe查看程序是否能够正常启动。
/**Test.C**/
#include
voiddisplay();
voidinit();
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutCreateWindow(“Simple”);
glutDisplayFunc(display);
init();
glutMainLoop();
}
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5,-0.5);
glVertex2f(-0.5,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,-0.5);
glEnd();
glFlush();
}
voidinit()
{
glClearColor(0.0,0.0,0.0,0.0);
}
(二)编程任务1:
1.分别利用点、线图元生成锥形螺旋曲线和环形螺旋曲线,要求可以设置点的大小、线可以设置线形和宽度。
锥形螺旋曲线的参数方程为:
环形螺旋曲线的参数方程为:
其中,t为参数且
。
a,b和c是常数,比如可取a=2.0,b=3.0,c=18.0。
(三)编程任务2:
1.在窗口中绘制三角形和四边形两个简单填充图形,要求它们能够被鼠标选中并随鼠标一起拖动,此外能够使用右键菜单分别设置两个简单图形的颜色。
利用三角形图元生成黑白相间的圆锥台,要求通过键盘或鼠标能够改变圆锥台地大端和小端直径。
六、实验器材(设备、元器件):
机房电脑、MicrosoftVisualStudio、OpenGLAPI函数库
七、实验步骤:
1:
配置环境
首先需要配置OpenGL编程环境,在MicrosoftVisualStudio2010中添加相应的头文件以及lib文件》
头文件添加地址为C:
\ProgramFiles\MicrosoftVisualStudio10.0\VC\include\GL
lib文件添加地址C:
\ProgramFiles\MicrosoftVisualStudio10.0\VC\lib
并且将glut.dll添加到System.32的文件夹里
2:
建立工程
建立OpenGL工程的过程
选择空项目;
输入名称;
选择添加文件;
键入代码;
3:
根据具体的题目要求进行实验
八、实验数据及结果分析:
编程任务1:
分别利用点、线图元生成锥形螺旋曲线和环形螺旋曲线,要求可以设置点的大小、线可以设置线形和宽度。
锥形螺旋曲线的参数方程为:
环形螺旋曲线的参数方程为:
其中,t为参数且
。
a,b和c是常数,比如可取a=2.0,b=3.0,c=18.0。
/**Test.C**/
#include
#include
#definePI3.1415
voiddrawthelines()
{
floatt,x,y,z;
floata=2,b=3,c=18;
glColor3f(1.0,0.5,0.5);
glBegin(GL_LINE_STRIP);
for(t=0;t<=2*PI;t+=0.0002)
{
x=a*t*cos(c*t)+b;
y=a*t*sin(c*t)+b;
z=c*t;
glVertex3f(x,y,z);
}
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(12,0,0);
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(0,12,0);
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(0,0,12);
glEnd();
}
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawthelines();
glFlush();
}
voidinit()
{
glClearColor(0.0,0.0,0.0,0.0);
glColor3f(1.0,1.0,1.0);
gluLookAt(1,1,1,
0,0,0,
0,1,0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-12.0,12.0,-12.0,12.0,-12,12);
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0,0);
glutCreateWindow("Drawthelines");
glutDisplayFunc(display);
init();
glutMainLoop();
return0;
}
实验一
(2)
/**Test.C**/
#include
#include
#definePI3.1415
voiddrawthelines()
{
floatt,x,y,z;
floata=2,b=3,c=18;
glColor3f(1.0,0.5,0.5);
glBegin(GL_LINE_STRIP);
for(t=0;t<=2*PI;t+=0.0002)
{
x=(a*sin(c*t)+b)*cos(t);
y=(a*sin(c*t)+b)*sin(t);
z=a*cos(c*t);
glVertex3f(x,y,z);
}
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(12,0,0);
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(0,12,0);
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(0,0,12);
glEnd();
}
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawthelines();
glFlush();
}
voidinit()
{
glClearColor(0.0,0.0,0.0,0.0);
glColor3f(1.0,1.0,1.0);
gluLookAt(1,1,1,
0,0,0,
0,1,0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-12.0,12.0,-12.0,12.0,-12,12);
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0,0);
glutCreateWindow("Drawthelines");
glutDisplayFunc(display);
init();
glutMainLoop();
return0;
}
编程任务2:
1.在窗口中绘制三角形和四边形两个简单填充图形,要求它们能够被鼠标选中并随鼠标一起拖动,此外能够使用右键菜单分别设置两个简单图形的颜色。
#include
#include
#defineSIZE512
intwide=600,height=600;
GLintHITS;
voidinit()
{
glClearColor(1.0,1.0,1.0,0.0);
}
intRect1_x1=-250,Rect1_y1=-250,Rect1_x2=450,Rect1_y2=450;
intRect2_x1=-500,Rect2_y1=-500,Rect2_x2=250,Rect2_y2=250;
intmovex1=0,movey1=0;
intmovex2=0,movey2=0;
intmousex=0,mousey=0;
intRGB1[3]={1.0,1.0,0.0};
intRGB2[3]={0.0,1.0,1.0};
voiddrawObjects(GLenummode,intflag)
{
if(mode==GL_SELECT)glLoadName
(1);
glColor3f(RGB1[0],RGB1[1],RGB1[2]);
glTranslated(4*movex1,4*movey1,0);
glRectf(Rect1_x1,Rect1_y1,Rect1_x2,Rect1_y2);
glTranslated(-4*movex1,-4*movey1,0);
if(mode==GL_SELECT)glLoadName
(2);
glColor3f(RGB2[0],RGB2[1],RGB2[2]);
glTranslated(4*movex2,4*movey2,0);
glBegin(GL_TRIANGLES);
glVertex2i(0,0);
glVertex2i(145,245);
glVertex2i(-45,280);
glEnd();
glTranslated(-4*movex2,-4*movey2,0);
}
voiddisplay(intflag)
{
glClear(GL_COLOR_BUFFER_BIT);
drawObjects(GL_RENDER,flag);
glFlush();
}
voidprocessHits(GLinthits,GLuintbuffer[])
{
unsignedinti,j;
GLintii,jj,names,*ptr;
printf("hits=%d\n",hits);
ptr=(GLint*)buffer;
for(i=0;inames=*ptr;
ptr+=3;
for(j=0;jif(*ptr==1)
printf("redrectangle\n");
else
printf("bluerectangle\n");
ptr++;
}
printf("\n");
}
}
GLuintselectBuf[SIZE];
voidmouse(intbutton,intstate,intx,inty)//鼠标函数
{
GLinthits;
GLintviewport[4];
if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
{
mousex=x;
mousey=y;
glGetIntegerv(GL_VIEWPORT,viewport);
glSelectBuffer(SIZE,selectBuf);
glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix((GLdouble)x,(GLdouble)(viewport[3]-y),5.0,5.0,viewport);
gluOrtho2D(-2.0*wide,2.0*wide,-2.0*height,2.0*height);
drawObjects(GL_SELECT,0);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glFlush();
hits=glRenderMode(GL_RENDER);
HITS=hits;
processHits(hits,selectBuf);
glutPostRedisplay();
}
}
voidreshape(intw,inth)
{
wide=w;
height=h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-2.0*wide,2.0*wide,-2.0*height,2.0*height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
voidkeyboard(unsignedcharkey,intx,inty)
{
switch(key){
case27:
exit(0);
break;
}
}
voidmotion(intx,inty)//建立移动函数
{
if(HITS==1&&selectBuf[3]==1)
{
movex1=x-mousex+movex1;
movey1=mousey-y+movey1;
display
(1);
}
elseif(HITS==1&&selectBuf[3]==2)
{
movex2=x-mousex+movex2;
movey2=mousey-y+movey2;
display
(2);
}
elseif(HITS==2)
{
movex1=x-mousex+movex1;
movey1=mousey-y+movey1;
movex2=x-mousex+movex2;
movey2=mousey-y+movey2;
display(3);
}
mousex=x;
mousey=y;
}
voidsubMenu1Func(intdata)//设置控制键盘键
{
switch(data)
{
case1:
RGB1[0]=1.0;
RGB1[1]=0.0;
RGB1[2]=0.0;
break;
case2:
RGB1[0]=0.0;
RGB1[1]=1.0;
RGB1[2]=0.0;
break;
case3:
RGB1[0]=0.0;
RGB1[1]=0.0;
RGB1[2]=1.0;
break;
}
display(0);
}
voidsubMenu2Func(intdata)//设置控制键盘键
{
switch(data)
{
case1:
RGB2[0]=1.0;
RGB2[1]=0.0;
RGB2[2]=0.0;
break;
case2:
RGB2[0]=0.0;
RGB2[1]=1.0;
RGB2[2]=0.0;
break;
case3:
RGB2[0]=0.0;
RGB2[1]=0.0;
RGB2[2]=1.0;
break;
}
display(0);
}
voidMenuFunc(intdata)
{
}
intsubMenu1,subMenu2,Menu;
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(wide,height);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
//创建菜单改变颜色
subMenu1=glutCreateMenu(subMenu1Func);
glutAddMenuEntry("红ì色?
",1);
glutAddMenuEntry("绿ì色?
",2);
glutAddMenuEntry("蓝?
色?
",3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
//创建菜单改变颜色
subMenu2=glutCreateMenu(subMenu2Func);
glutAddMenuEntry("红ì色?
",1);
glutAddMenuEntry("绿ì色?
",2);
glutAddMenuEntry("蓝?
色?
",3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
Menu=glutCreateMenu(MenuFunc);
//为两个菜单设置名字
glutAddSubMenu("设置方块1的颜色",subMenu1);
glutAddSubMenu("设置三角形1的?
颜色",subMenu2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutMotionFunc(motion);
glutMainLoop();//是程序的监听一直运行,保证捕捉到操作,直到
return0;
}
九、总结、改进建议及心得体会:
电子科技大学
实验报告
一、实验二:
(实验项目名称)
二、实验室名称:
实验时间:
三、实验目的:
四、实验原理:
五、实验内容:
六、实验器材(设备、元器件):
七、实验步骤:
八、实验数据及结果分析:
九、总结、改进建议及心得体会:
...
(注:
文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注!
)