已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告课程名称:三维图形程序设计学院:计算机科学与工程学院专业:计算机科学与技术指导教师:曹跃学生姓名:郭小明学号:2011060100010实验成绩:日期:2013年5月3日电 子 科 技 大 学实 验 报 告 实验一:三维图形程序上机操作训练与图元编程 一. 实验室名称:主楼A2412 实验时间:2013年5月 3日 二实验目的:1. 掌握VC中OpenGL三维编程环境的建立过程;2. 掌握GLUT编写OpenGL应用程序的基本步骤,熟悉GLUT基于事件驱动的编程模型;3. 掌握不同类型图元的顶点装配方式,并能够利用图元建立简单的几何对象。 三实验原理: OpenGL编程语言 面向对象编程技术 四. 实验内容: (一)安装、配置和测试OpenGL三维编程环境1. 首先检查Windows操作系统中是否正确安装了Visual Studio集成开发环境:实验要求在Windows XP、Visual C+ 2005平台以上;2. 解压OpenGL.zip到任意目录下;3. 检查OpenGL核心库和实用库及其头文件是否安装正确和完整:检查%VSINSTALLDIR%VCPlatformSDKIncludeGL目录下是否存在gl.h、glu.h两个头文件,并从解压得到的GL子目录下拷贝缺少的头文件到该目录下;检查%VSINSTALLDIR%VCPlatformSDKLib目录下是否存在OpenGL32.lib、GLU32.lib两个库文件,并从解压得到的Lib子目录下拷贝缺少的Lib文件到该目录下;4. 安装GLUT库及其头文件。从解压得到的GL子目录下拷贝glut.h到%VSINSTALLDIR%VCPlatformSDKIncludeGL目录中,从解压得到的Lib子目录下拷贝 glut32.lib到%VSINSTALLDIR%VCPlatformSDKLib下,拷贝glut32.dll到%windir%system32目录下。5. 检测OpenGL环境是否配置正确。a. 打开Visual Studio集成开发环境,新建一个类型为“Win32控制台应用程序”的空项目Test;b. 在项目中新建一个C源文件Test.c;c. 拷贝如下代码到Test.c中;d. 生成Test项目,观察“输出”窗口中的编译和链接输出信息,若显示类似“生成: 1 已成功, 0 已失败, 0 最新, 0 已跳过”表明项目生成成功,否则根据输出信息检查程序或者OpenGL编程环境是否设置正确,并在改正后重新生成Test项目;e. 运行Test.exe查看程序是否能够正常启动。 /* Test.C */#include void display();void init();int main(int argc, char * argv) glutInit(&argc, argv);glutCreateWindow(“Simple”);glutDisplayFunc(display);init();glutMainLoop();void display() 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();void init() 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. 在窗口中绘制三角形和四边形两个简单填充图形,要求它们能够被鼠标选中并随鼠标一起拖动,此外能够使用右键菜单分别设置两个简单图形的颜色。2. 利用三角形图元生成黑白相间的圆锥台,要求通过键盘或鼠标能够改变圆锥台地大端和小端直径。五实验要求1. 实验前要做好充分准备。2. 实验中独立完成源程序编辑、编译、链接过程,运行并记录程序运行结果;3. 对程序结果进行分析。六、实验器材(设备、元器件): 编译器 Microsoft Visual Studio 2010 OpenGLAPI 函数库七、实验步骤:1: 首先需要配置OpenGL编程环境,在 Microsoft Visual Studio 2010 中添加相应的头文件以及lib文件,头文件添加地址为 C:Program FilesMicrosoft Visual Studio 10.0VCincludeGL lib文件添加地址 C:Program FilesMicrosoft Visual Studio 10.0VClib并且将glut.dll 添加到System.32 的文件夹里 配置过程如图:下面是需要的头文件:(有)将头文件放入:C:Program FilesMicrosoft Visual Studio 10.0VCincludeGL下面是需要的lib文件 C:Program FilesMicrosoft Visual Studio 10.0VClib把他们放入 C:Program FilesMicrosoft Visual Studio 10.0VClib就行了下面是建立OpenGL工程的过程选择空项目:然后输入名称选择添加C+文件键入代码就可以了。2 然后根据相应的编程要求进行编程试验 具体实现过程8、 实验数据及结果分析:编程任务1: 分别利用点、线图元生成锥形螺旋曲线和环形螺旋曲线,要求可以设置点的大小、线可以设置线形和宽度。锥形螺旋曲线的参数方程为: 环形螺旋曲线的参数方程为:其中,t为参数且。a,b和c是常数,比如可取a=2.0,b=3.0,c=18.0。#include#include #define PI 3.14void drawMyLines()float t;float x,y,z;float a=2,b=3,c=18;glColor3f(1.0,0.5,0.5);glBegin(GL_LINE_STRIP);for(t=0.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();glBegin(GL_LINES); /建立坐标轴 glVertex3f(0,0,0);glVertex3f(0,0,12);glEnd();glBegin(GL_LINES); /建立坐标轴glVertex3f(0,0,0);glVertex3f(0,12,0);glEnd();void display()glClear(GL_COLOR_BUFFER_BIT);drawMyLines(); /调用drawMyLines函数glFlush();void init()glClearColor(0.0,0.0,0.0,0.0);glColor3f(1.0,1.0,1.0);gluLookAt(1,1,1, /更改视角3,3,3,-1,-1,1);glMatrixMode(GL_PROJECTION); /设置投影模式glLoadIdentity(); /设置单位矩形glOrtho(-12.0,12.0,-12.0,12.0,-12,12);int main(int argc, char* argv) glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500);glutInitWindowPosition(0, 0);glutCreateWindow(Simple);glutDisplayFunc(display); init();glutMainLoop(); /使程序一直处在监听状态中 return 0;#include#include #define PI 3.14void drawMyLines()float t;float x,y,z;float a=2,b=3,c=18;glColor3f(1.0,0.5,0.5); glBegin(GL_LINE_STRIP); / 绘制函数模块for(t=0.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();glBegin(GL_LINES); /绘制坐标轴 glVertex3f(0,0,0);glVertex3f(0,0,12);glEnd();glBegin(GL_LINES); /绘制坐标轴glVertex3f(0,0,0);glVertex3f(0,12,0);glEnd();void display()glClear(GL_COLOR_BUFFER_BIT);drawMyLines();glFlush();void init()glClearColor(0.0,0.0,0.0,0.0);glColor3f(1.0,1.0,1.0);gluLookAt(1,1,1,3,3,3,-1,-1,1);glMatrixMode(GL_PROJECTION); /设置投影模式glLoadIdentity(); /使用单位矩阵glOrtho(-12.0,12.0,-12.0,12.0,-12,12);int main(int argc, char* argv) glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500);glutInitWindowPosition(0, 0);glutCreateWindow(Simple);glutDisplayFunc(display); init();glutMainLoop(); return 0;编程任务2:1. 在窗口中绘制三角形和四边形两个简单填充图形,要求它们能够被鼠标选中并随鼠标一起拖动,此外能够使用右键菜单分别设置两个简单图形的颜色。#include #include #define SIZE 512int wide=600,height=600;GLint HITS;void init() glClearColor (1.0, 1.0, 1.0, 0.0);int Rect1_x1=-250,Rect1_y1=-250,Rect1_x2=450,Rect1_y2=450;int Rect2_x1=-500,Rect2_y1=-500,Rect2_x2=250,Rect2_y2=250;int movex1=0,movey1=0;int movex2=0,movey2=0;int mousex=0,mousey=0;int RGB13=1.0,1.0,0.0;int RGB23=0.0,1.0,1.0;void drawObjects(GLenum mode,int flag)if(mode = GL_SELECT) glLoadName(1);glColor3f(RGB10,RGB11,RGB12);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(RGB20,RGB21,RGB22);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);void display(int flag)glClear(GL_COLOR_BUFFER_BIT);drawObjects(GL_RENDER,flag);glFlush();void processHits (GLint hits, GLuint buffer) unsigned int i, j; GLint ii, jj, names, *ptr; printf (hits = %dn, hits); ptr = (GLint *) buffer; for (i = 0; i hits; i+) names = *ptr; ptr+=3; for (j = 0; j names; j+) if(*ptr=1) printf (red rectanglen); else printf (blue rectanglen); ptr+; printf (n); GLuint selectBufSIZE;void mouse(int button, int state, int x, int y) /鼠标函数 GLint hits; GLint viewport4; 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) (viewport3 - 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(); void reshape(int w, int h)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();void keyboard(unsigned char key, int x, int y) switch (key) case 27: exit(0); break; void motion(int x,int y) /建立移动函数if(HITS = 1 & selectBuf3 = 1 )movex1 = x-mousex+movex1;movey1 = mousey-y+movey1;display(1);else if (HITS = 1 & selectBuf3 = 2 )movex2 = x-mousex+movex2;movey2 = mousey-y+movey2;display(2);else if (HITS = 2 )movex1 = x-mousex+movex1;movey1 = mousey-y+movey1;movex2 = x-mousex+movex2;movey2 = mousey-y+movey2;display(3);mousex = x;mousey = y;void subMenu1Func(int data) /设置控制键盘键switch(data)case 1:RGB10=1.0;RGB11=0.0;RGB12=0.0;break;case 2:RGB10=0.0;RGB11=1.0;RGB12=0.0;break;case 3:RGB10=0.0;RGB11=0.0;RGB12=1.0;break;display(0);void subMenu2Func(int data) /设置控制键盘键switch(data)case 1:RGB20=1.0;RGB21=0.0;RGB22=0.0;break;case 2:RGB20=0.0;RGB21=1.0;RGB22=0.0;break;case 3:RGB20=0.0;RGB21=0.0;RGB22=1.0;break;display(0);void MenuFunc(int data)int subMenu1,subMenu2,Menu;int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (wide, height);glutInitWindowPosition (100, 100); glutCreateWindow (argv0); 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();/是程序的监听一直运行,保证捕捉到操作,直到 return 0;这是生成的图像:一个绿色的三角形和一个黄色的矩形 系统可以根据操作他们可以随着鼠标的拖动而移动 下面是移动的图像的截图:分别把三角形移动到上方 把矩形移动到下方下面分别通过右击更改图形的颜色,把三角形的颜色通过菜单选项改成了红色,下面将矩形的颜色改成绿色:编程任务3:利用三角形图元生成黑白相间的圆锥台,要求通过键盘或鼠标能够改变圆锥台地大端和小端直径。#include #include #include void init()glClearColor(0.0,0.0,0.0,0.0); /清除颜色并进行设置glOrtho(-100,100,-100,100,-100,100); /设置视口int D_top=10,D_bottom=20,H=20;float PI = 3.14159;void display()glClear(GL_COLOR_BUFFER_BIT);int i=0;float angle=0.0f;glBegin(GL_TRIANGLES);for(;i32;angle += PI/32.0f,i+)glColor3f(0.9,0.9,0.9);glVertex3f(D_bottom*cos(angle),D_bottom*sin(angle),0);glVertex3f(D_bottom*cos(angle+PI/16.0),D_bottom*sin(angle+PI/16.0),0);glVertex3f(D_top*cos(angle),D_top*sin(angle),H);glColor3f(0.1,0.1,0.2);glVertex3f(D_top*cos(angle),D_top*sin(angle),H);glVertex3f(D_top*cos(angle+PI/16.0),D_top*sin(angle+PI/16.0),H);glVertex3f(D_bottom*cos(angle+PI/16.0),D_bottom*sin(angle+PI/16.0),0);glEnd();glBegin(GL_TRIANGLE_FAN);glVertex3f(0,0,0);for(i=0;i33;angle += PI/16.0f,i+)glColor3f(1.0,1.0,1.0);glVertex3f(D_bottom*cos(angle),D_bottom*sin(angle),0);glColor3f(0.1,0.1,0.2);glVertex3f(D_bottom*cos(angle+PI/32.0),D_bottom*sin(angle+PI/32.0),0);glEnd();glBegin(GL_TRIANGLE_FAN); /绘制图形glVertex3f(0,0,H);for(i=0;i32;angle += PI/32.0f,i+)glColor3f(1.0,1.0,1.0);glVertex3f(D_top*cos(angle),D_top*sin(angle),H);glColor3f(0.1,0.1,0.1);glVertex3f(D_top*cos(angle+PI/32.0),D_top*sin(angle+PI/32.0),H);glEnd();glFlush();void keyboard(unsigned char key, int x, int y) /设置移动键盘键switch(key)case x:printf(x);glRotatef(10,1.0,0.0,0.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临港新建超声波设备调试服务中心建设项目可行性研究报告
- 过程拼音教学模板课件
- 中成药质量控制实验室可行性研究报告
- 工厂展示课件
- 观潮下载课件
- 观潮课件下载课件
- 财务管理师考试综合测试卷及答案
- 2026年企业国际化经营模拟试题及答案
- 公共营养师营养食谱设计与营养评价专项题库及答案
- 消防安全设计审查与验收专项训练题库及答案
- 新版2026年新教材统编版九年级上册道德与法治期末复习全册考点提纲
- 羊绒衫制作工安全操作规程
- 新版2026秋新苏教版小学科学五年级上册全册知识点考点合集
- 2027兴业银行校园招聘笔试参考题库及答案详解
- ASME B31.3-2024 中文版(工艺管道规范 引用 ASME V 卷无损检测要求)
- 武汉产业投资控股集团有限公司招聘笔试参考题库及答案详解
- 2026年海南发展控股公司招聘试题及答案
- 2025年山东公务员考试行测真题完整版(含答案+详细解析)
- 肿瘤类器官模型应用
- 《JBT 20114.4-2009 糖浆剂瓶封口机》专题研究报告
- 喷涂工序低温烘干控制规范
评论
0/150
提交评论