实验一 VC++6.0+OpenGL绘图环境及简单图形的输出
实验1 opengl基本图形绘制
实验一、直线的扫描转换系别:计算机学院专业班级: 10信科2姓名:学号实验日期: 2013-3-27 实验报告日期:2013-3-27一、实验目的:理解直线的不同生成算法,并用程序实现。
二、实验环境:1熟悉VC6.0开发平台;2熟悉OpenGL开发库;三、实验内容:1.使用OpenGL中的基本画点函数,分别使用DDA算法、中点算法、Bresenham算法画直线。
要求为每一种算法分别建立对应的函数,函数参数为直线段的端点坐标。
四、实验报告内容1、程序源码;void MidpointMethod(Point point1,Point point2){int x ,y,d,times1,times2,stepX,stepY; //k表示斜率int a,b,c; //a,b ,c分别为直线方程 aX+bY+c=0的参数int i;float k;x=point1.x; y=point1.y;times1=abs(point1.x-point2.x);//循环次数times2=abs(point2.y-point1.y);a=point2.y-point1.y; //求出直线方程 aX+bY+c=0的参数的参数ab=point1.x-point2.x; //求出直线方程 aX+bY+c=0的参数的参数bc=point1.x*(point1.y-point2.y)+point1.y*(point2.x-point1.x); //求出直线方程 aX+bY+c=0的参数的参数cstepX=b/abs(b)*(-1); //stepX表示该直线在X轴上的延伸方向,stepX值为1,表示直线像素点的横坐标跳步的方向与x轴一样,否则为-1 stepY=a/abs(a); //stepY表示该直线在y轴上的延伸方向,stepY 值为1,表示直线像素点的纵坐标跳步的方向与Y轴一样,否则为-1k=((float)a)/((float)b)*(-1); //求出斜率kglPointSize(1.0f);glBegin(GL_POINTS);if((0<=k)&&(k<=1)) //斜率为0到1的情况{d=a+0.5*b; //初值for(i=0;i<=times1;i++){x=x+stepX;if(stepX*d>=0) //判断y方向是否走步,stepX表示该直线在X轴上的延伸方向,stepX值为1,表示直线像素点的横坐标跳步的方向与x轴一样,否则为-1 //{y+=stepY;d=d+a+b;}elsed=d+a;glVertex2i(x,y);}}else if((1<k)&&(k<=10000)) //斜率大于1的情况{d=b+0.5*a;for(i=0;i<times2;i++) //times表示循环要执行的次数{y+=stepY;if(d*stepY<=0) //判断中点是否在直线的上方,stepY表示该直线在y轴上的延伸方向,stepX值为1,表示直线像素点的纵坐标跳步的方向与x轴一样,否则为-1{x+=stepX;d=d+a+b;}else d=d+b;glVertex2i(x,y);}}else if((-1<=k)&&(k<0)) //斜率为-1到0的情况{d=a+0.5*b;for(i=0;i<=times1;i++){x=x+stepX;if(stepX*d<=0){y+=stepY;d=d+a-b;}elsed=d+a;glVertex2i(x,y);}}else if((-10000<=k)&&(k<-1)) //斜率为小于-1的情况{d=a*0.5+b;for(i=0;i<=times2;i++){y=y+stepY;if(stepY*d>=0){x+=stepX;d=d-a+b;}elsed=d+b;glVertex2i(x,y);}}else //斜率无限大的情况{for(i=0;i<times2;i++){y+=1;glVertex2i(x,y);}}glEnd();}2、实验报告;报告中包含以下内容:①自己编写的绘图函数及其辅助函数。
opengl实验报告
opengl实验报告OpenGL实验报告引言:OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
VC6.0简单绘图说明
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
实验1,opengl的基本语法实验报告心得体会
实验1,opengl的基本语法实验报告心得体会实验1,opengl的基本语法实验报告心得体会篇一:图形学实验报告openGL的基本语法《计算机图形学基础》实验1 OpenGL的基本语法一、实验目的及要求1. 了解OpenGL的主要功能2. 了解OpenGL的绘制流程3. 掌握OpenGL的基本语法4. 通过以上内容,掌握 OpenGL的编程框架,实现简单的图形绘制二、实验环境主要是软件开发环境:VC三、实验内容OpenGL绘制矩形的简单例子。
四、实验结果五、程序代码#includevoid Initial(void){}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(, , );//设置当前的绘图颜色为红色glRectf(, , , ); //绘制一个矩形glFlush();//处理所有的OpenGL程序}int main(int argc, char* argv[]){glutInit(&argc, argv); glutInitDisplayMo(转载于: 小龙文档网:实验1,opengl的基本语法实验报告心得体会)de(GLUT_SINGLE | GLUT_RGB); //初始化glClearColor(, , , ); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//设置投影参数gluOrtho2D(,,,); 窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口的位置}glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //启动主GLUT事件处理循环return 0;六、心得体会。
实验1 用VC 6.0编写简单C程序
实验一 用VC++6.0编写简单C 程序一、实验目的:1. 掌握C++程序的编译、连接和运行的过程;2. 熟练编写简单的C 程序;二、实验环境:一台PC 机,window xp 操作系统,VC++6.0虚拟机系统。
三、实验内容及步骤: 1 编写一个程序实现输入变量x 的值,计算函数5.22log 5sin 2cos )(ex x x x f -+=的值并输出。
(1)N-S 图(2) 程序#include <iostream >#include <math.h>using namespace std;int main(){float x,y;cout<<"请输入x 的值:"<<endl;cin>>x;y=sqrt((cos(2*x)+sin(x*x)))/(5*log10(x)-exp(2.5));cout<<y<<endl;return 0;}(3)测试测试一:输入:3.5输出:-0.0703243测试二:输入:3输出:-0.1751192 教材P34 习题 #include <iostream >using namespace std;int main(){float BeiBaoPrice=60.0;float BeiXingPrice=40.0;float BiJiBenPrice=5.0;int BeiBaoGeShu=0;int BeiXingGeShu=0;int BiJiBenGeShu=0;float Total=0.0;cout<<"请输入背包个数:"<<endl;cin>>BeiBaoGeShu;cout<<"请输入背心个数:"<<endl;cin>>BeiXingGeShu;cout<<"请输入笔记本个数:"<<endl;cin>>BiJiBenGeShu;Total=BeiBaoPrice*BeiBaoGeShu+BeiXingPrice*BeiXingGeShu+BiJiBenPrice*BiJiBenGeShu;cout<<"总费用为:"<<endl;cout<<Total<<endl;return 0;}测试测试一:输入:1 2 3输出:155测试二:输入:2 3 4输出: 2603 编写一个简单程序,实现输入月工资,计算应交税款。
实验一vc6.0opengl绘图环境及简单图形的输出
任课教师:马文娟《3D图形学》(2013-2014学年第1学期)实验报告学号:姓名:班级:实验一VC++6.0+OpenGL绘图环境及简单图形的输出一、实验目的1、熟练使用实验主要开发平台VC++6.0;2、进一步熟悉OpenGL的主要功能;3、掌握OpenGL的绘图流程和原理;4、掌握OpenGL的基本数据类型、核心函数的使用。
二、实验内容创建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制。
三、实验原理1、基本语法(C版本下的OpenGL语法)OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。
OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。
一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glColor3d()、glColor3f()和glColor3bv ()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。
OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float 和void。
2、程序的基本结构OpenGL程序的基本结构可分为三个部分:1)第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。
这些状态一般都用函数glEnable(…)、glDisable(…)来设置,“…”表示特定的状态。
2)第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影方式为透视投影,其取景体积是一个截头锥体。
VC6.0简单绘图说明
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
实验一 opengl高级图形图像实验报告
高级图形图像第一次实验报告一、实验描述以及关键步骤1.opengl编程环境组建(基于VC6.0)1)下载opengl开发库文件夹;2)复制glut32.dll和glut.dll到…\windows\system32;3)复制glut.h到...\Microsoft Visual Studio\VC98\Include\GL;4)复制glut32.lib和glut.lib到…\Microsoft Visual Studio\VC98\Lib;5)新建工程后,进入Project菜单,选Settings项,弹出 Settings 对话框,选Link项,在 Libraries 栏目中加入OpenGL库:opengl32.lib glu32.lib glaux.lib。
2.基本图形绘制首先运行一个Windows环境下的一个基本OpenGL程序,直接打开60version文件夹内的工程,它将显示一个空的OpenGL窗口,可以在定制窗口大小和全屏模式下切换(按F1),按ESC退出,该程序为以后的应用程序提供了实验平台,并预留了绘图接口。
根据教材P67-70,了解绘制函数,根据附件2提供的源码baseshape.cpp,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,修改图形绘制命令和参数,显示出点、线、矩形、三角形等,可设置不同线宽。
3.图形的二维变换根据附件3提供源码,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,通过调用glTranslate*, glRotate*,glscale*等二维变换函数实现平移、旋转、缩放等变换,通过参数操作和矩阵操作两种方式执行。
glTranslatef:在opengl中,函数glTranslatef的作用就是移动坐标原点。
glRotatef:glRotatef( angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度,满足右手法则,即沿着右手握拳时四个手指指向的方向旋转。
OpenGL程序结构与基本图形的绘制
实验名称OpenGL程序结构与基本图形的绘制一、实验目的学习基于OpenGL的图形学编程,掌握程序设计的基本过程与程序的基本结构。
二、实验内容在VC6.0下生成基于控制台的应用程序,把OpenGL的基本头文件包含进应用程序中,并设置好相应的环境参数,编写基于OpenGL的应用程序,实现基本图形的绘制。
三、实验步骤1.在VC6.0环境下生成一基于控制台的应用程序(win32 console),选择存储目录为桌面,名字为学号或者姓名的拼音。
如下图:2.在创建的应用程序中选择创建一个“hello world”的应用程序。
3.把以下代码加入到应用程序的CPP文件中。
void display() {glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 0.0); // Set current color to green}void init() {glClearColor( 0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}并把原main函数中的内容用以下代码替换:glutInit( &argc, argv);glutInitWindowSize( 400, 400);glutInitWindowPosition( 200, 100);glutCreateWindow( "Green Triangle");glutDisplayFunc( display);init();glutMainLoop();return 0;4.修改display函数,实现三角形,多边形及圆等基本图形的绘制。
实验一OpenGL直线,圆的绘制
实验一、Ope nGL直线、圆的绘制1、实验目的1)了解OpenGL图形库的功能和结构;2)学习了解OpenGL程序的基本结构,及常用函数;3 )学习使用OpenGL绘制基本图形(线、圆);2、实验内容1 )使用OpenGL编写一个简单的C++程序,使该程序能够绘制出直线。
2 )使用OpenGL编写一个简单的C++程序,使该程序能够绘制出圆。
3、实验过程1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);2)使用Visual V++6.0新建一个C++文档,并创建相应的工程;3)在文档中引入OpenG啲头文件,编辑代码实现鼠标拖动画直线,画圆。
4、实验结果可单击鼠标左键,然后拖动鼠标画出两条直线,并同时画出圆; 可单击鼠标右键,然后拖动鼠标画出两个圆,并同时画出直线。
结果截图:1.鼠标左键主要控制绘制的直线:石Open诂L直找和园的锭制5、实验代码1. #in elude vgl/glut.h>2. #in elude <math.h>3.3. // GLint pNum = 0;4. GLint px1, py1, px2, py2, ex, cy, r;5. GLint winWidth=600, winHeight=600;-/25.} 26.7. 8. llllllllllllllllll 画直线 llllllllllll 9. void Draw_Brese nham(i nt pStartx,i nt pStarty,i nt 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.27. pEn dx,i nt pEndy) {ll 用Bresenham 算法画直线 int i; if(pStartx==pE ndx) ll 为竖线 if(pStartyv=pE ndy) for(i=pStarty;i<=pE ndy;i++) glVertex2f(pStartx,i); else for(i=pE ndy;i<=pStarty;i++) glVertex2f(pStartx,i); return;-/// 为横线 if(pStarty==pE ndy) { if(pStartx<=pE ndx) { for(i=pStartx;i<=pE ndx;i++) glVertex2f(i,pStarty);} else { for(i=pE ndx;i<=pStartx;i++) glVertex2f(i,pStarty); } return; } // 为斜线 float m=(pE ndy-pStarty)*1.0/(pE ndx-pStartx); 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.-/ float p;}else-/p=2*m-1; if(m>0 && m<=1) { if(pStartx<pE ndx) { while(pStartx<=pE ndx) { glVertex2f(pStartx++,pStarty); if(p>=0) { p+=2*m-2; pStarty++; } else p+=2*m; } { while(pE ndx<=pStartx) {50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.} else glVertex2f(pE ndx++,pE ndy); if(p>=0) { p+=2*m-2; pEndy++; } else p+=2*m; } } return; } p=-2*m-1; if(m<0 && m>=-1) { if(pStartx<pE ndx) { while(pStartx<=pE ndx) { glVertex2f(pStartx++,pStarty);72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93.} elseif(p>=0) { p+=-2*m-2; pStarty--; } else p+=-2*m; } } else { while(pE ndx<=pStartx) { glVertex2f(pE ndx++,pE ndy); if(p>=0) { p+=-2*m-2; pEn dy--; p+=-2*m;94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.} else } return; } p=2/m-1; if(m>1) { if(pStartyvpE ndy) { while(pStartyv=pE ndy) { glVertex2f(pStartx,pStarty++); if(p>=0) { p+=2/m-2; pStartx++; p+=2/m; }116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137.-/else {while(pE ndyv=pStarty) {glVertex2f(pE ndx,pE ndy++); if(p>=0) {p+=2/m-2; pEndx++; } else p+=2/m; } }return;} p=-2/m-1; if(pStarty<pE ndy) { while(pStarty<=pE ndy)138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153.154. 155. 156. 157. 158. 159.-/181.{glVertex2f(pStartx,pStarty++);if(p>=0){p+=-2/m-2;pStartx--;}elsep+=-2/m;}}else{while(pE ndyv=pStarty){glVertex2f(pE ndx,pE ndy++);if(p>=0){p+=-2/m-2;pEn dx--;}else160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180.-/203. }182.p+=-2/m; 183. }184. }185. }186.187.////////////////// 画圆//////////// 188. /////////其他象限绘制189. void CirclePoi nts(i nt x,i nt y){190.// 第1象限191.glVertex2f(x,y); 192.glVertex2f(y,x);193.// 第2象限194.glVertex2f(-x,y); 195.glVertex2f(-y,x);196.// 第3象限197.glVertex2f(-y,-x); 198.glVertex2f(-x,-y);199.// 第4象限200.glVertex2f(x,-y); 201.glVertex2f(y,-x);202.-/void DrawCircle(i nt cx,i nt cy,i nt radis){ glPushMatrix(); gITra nslatef(cx,cy,0); glPoi ntSize(1);glColor3f(0.5f, 0.5f, 1.0f); glBegi n( GL_POINTS);int x,y; double p; x=0; y=radis; p=1.25-radis; while(x<=y+1) {CirclePoi nts(x,y); x++; if(p>=0) { y--;p+=2.0*(x-y)+5;204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225.〃////////中点算法画圆-/} else p+=2*x+3; }glE nd(); glPopMatrix(); }////////// 绘制坐标轴 void DrawOx(){ glColor3f(0.95, 0.7, 0.8); glPoi ntSize(1); glBeg in (GL_LINES); glVertex2f(-wi nWidth/2,0); glVertex2f(wi nWidth/2,0); glVertex2f(0,wi nH eight/2); glVertex2f(0,-wi nH eight/2); glE nd(); }226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243.244. 245. 246. 247.////////// 显示函数-/ 248. void Display(){249. 〃//////GL_COLOR_BUFFER_BIT(用背景颜色填充) 250. glClear(GL_COLOR_BUFFER_BIT);251.251. DrawOx();253.252. glColor3f(0.0,0.0,1.0);255.253. glBegi n( GL_POINTS);254. //Brese nhamL in e(px1, py1, px2, py2);255. Draw_Brese nham(px1, py1,px2, py2);256. glE nd();257. glBegi n( GL_POINTS);258. Draw_Brese nham(py1, px1,py2, px2);259. glE nd();260. //glBegi n(GL_LINES);261. 〃glVertex2f(px1,py1);262. 〃glVertex2f(px2,py2);263. 〃glVertex2f(py1,px1);264. 〃glVertex2f(py2,px2);265. //glE nd();269.270. DrawCircle(cx,cy,r);271. DrawCircle(cy,cx,r);272.273. III 交换缓冲区274. glutSwapBuffers();275. 〃glFlush();〃刷新绘图命令276. }277.278.279. II 设置渲染状态(听起来满下人,实际上很简单)280. void SetupRC(void)281. {282. II清除颜色(这里为黑色,为了方便找画的那个点)可以理解成背景颜色283. II和glColor4f(1.0f, O.Of, O.Of , 1.0f) 一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的284. II最后的那个1.0f是透明度,0.0f表示全透明,1.0f 是完全不透明285. glClearColor(1.0f, 1.0f, 1.0f,1.0f);286. }287.287. II当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,288. //几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧290. void Chan geSize(i nt w, i nt h)291. {292. wi nWidth = w;293. wi nH eight = h;294. //设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)295. glViewport(0,0,w,h);296. //重置坐标系统,指定设置投影参数297. glMatrixMode(GL_PROJECTION);298. /////// 调用单位矩阵,去掉以前的投影参数设置299. glLoadIde ntity();300. ////// 设置投影参数301. gluOrtho2D(-w/2,w/2,-h/2,h/2);302. }303.304. ///////////////// 鼠标点击305. void MousePlot(GLi nt butto n,GL int actio n,GL int xMouse,GLi nt yMouse){306. if(butto n==GLUT_LEFT_BUTTON &&-/324.307. px1 = xMouse - win Width/2; 308. py1 = winH eight/2 - yMouse;309. }310.if(butto n==GLUT_LEFT_BUTTONactio n==GLUT_UP){311. px2 = xMouse - win Width/2; 312. py2 = winH eight/2 - yMouse; 313. glutPostRedisplay();314. }315.if(butto n==GLUT_RIGHT_BUTTONactio n==GLUT_DOWN){316. cx=xMouse-wi nWidth/2; 317. cy=wi nH eight/2-yMouse; 318. }319. }320. //////////////// 鼠标移动321.void MouseMove(GLi nt xMouse,GL int yMouse){ 322. px2 = xMouse - win Width/2; 323. py2 = winH eight/2 - yMouse;actio n==GLUT_DOWN){ &&&&r=sqrt(pow((xMouse-wi nWidth/2-cx),2)+pow((wi nH eig-/ ht/2-yMouse-cy),2));325. glutPostRedisplay();326. }327.327. //主函数328. int main (i nt argc, char* argv[])329. {330. glutI ni t(&argc, argv);331. //设置显示模式332. glutI ni tDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);333. //设置窗口大小像素334. glutI nitWin dowSize(600, 600);335. ////设置窗口出现在屏幕的位置336. glutI nitWin dowPositio n(300,160);337. //建立一个叫OpenGL的窗口338. glutCreateWi ndow("Ope nGL-Li ne");340.339. //调用函数Display进行绘制340. glutDisplayF un c(Display);341. ////// 调用鼠标移动函数-/ 342. //glutPassiveMotio nFun c(PassiveMouseMove);-/ 357. } 345. glutMotio nFun c(MouseMove); 346. ... 调用鼠标点击函数 347. glutMouseFu nc(MousePlot); 348. 349.//如果窗口大小改变则调用函数 绘制 350. glutReshapeF un c(Cha ngeSize); 351. //清屏 352. SetupRC(); 353. //循环绘制 354. glutMai nLoop(); 355. 356.return 0; ChangeSize 重新进行。
《计算机图形学》课内实验报告(实验一)
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
#ifndef __APPLE__
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
{
GLbyte infoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj, MAX_INFO_LOG_SIZE, NULL, infoLog);
fprintf(stderr, "Error in program linkage!\n");
fprintf(stderr, "Info log: %s\n", infoLog);
// Demonstrates high-level shaders
// Program by Benjamin Lipchak
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include "../../Common/GLTools.h" // System and OpenGL Stuff
// Initially set the blink parameter to 1 (no flicker)
if (flickerLocation != -1)
glUniform1fARB(flickerLocation,1.0f);
// Program object has changed, so we should revalidate
图形学实验报告 OpenGL中基本图形的绘制
《计算机图形学基础》实验4 OpenGL中基本图形的绘制一、实验目的及要求1.掌握OpenGL中点的绘制方法。
2.掌握OpenGL中直线的绘制方法。
3.掌握OpenGL中多边形面的绘制方法。
4. 掌握OpenGL中字符函数的绘制方法。
二、实验环境主要是软件开发环境vc 6.0三、实验内容OpenGL实现直线段的反走样。
四、实验结果五、程序代码#include <gl/glut.h>GLuint lineList; //指定显示列表IDvoid Initial(){glClearColor(1.0f, 1.0f, 1.0f, 0.0f);glLineWidth(12.0f);glColor4f (0.0, 0.6, 1.0, 1.0);lineList = glGenLists(1);glNewList(lineList, GL_COMPILE); //定义显示列表glBegin(GL_LINE_LOOP);glVertex2f(1.0f, 1.0f);glVertex2f(4.0f, 2.0f);glVertex2f(2.0f, 5.0f);glEnd();glEndList();}void ChangeSize(GLsizei w, GLsizei h){if(h == 0) h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)gluOrtho2D(0.0, 5.0, 0.0, 6.0*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(0.0, 5.0*(GLfloat)w/(GLfloat)h, 0.0, 6.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void Displayt(void){glClear(GL_COLOR_BUFFER_BIT);glCallList(lineList);glFlush();}void Displayw(void){glClear(GL_COLOR_BUFFER_BIT);glEnable(GL_LINE_SMOOTH); //使用反走样glEnable (GL_BLEND); //启用混合函数glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //指定混合函数glCallList(lineList);glFlush();}void main(void){glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(300, 300);glutCreateWindow("原始图形");glutDisplayFunc(Displayt);glutReshapeFunc(ChangeSize);Initial();glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(300, 300);glutInitWindowSize(300, 300);glutCreateWindow("反走样图形");glutDisplayFunc(Displayw);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();}六、心得体会在光栅图形显示器上绘制非水平且非垂直的直线或多边形边界时,或多或少会呈现锯齿状或台阶状外观。
实验一OpenGL 软件的使用
实验一OpenGL 软件的使用1.实验目的:1) 学会 OpenGL 的安装及编程;2) 掌握用OpenGL绘图包编程的软件总体结构.3) 掌握用 OpenGL 绘图包绘制立方体的基本语句;4) 掌握OpenGL 绘图包用鼠标交互操作图形的语句;2.实验要求:要求能够从网上下载OpenGL的动态链接文件和库文件,并进行安装。
能够用OpenGL的函数进行编程绘制立方体,实现用鼠标拖动、旋转、缩放立方体。
3.实验内容:从网上下载OpenGL的动态链接文件(.DLL)和库文件(.Lib),把它们放置到规定的目录中。
用VC++的Windows编程,实现绘制立方体,和用鼠标交互。
4.实验步骤:1) 从网上下载OpenGL的动态链接文件(.DLL)和库文件(.Lib),把它们放置到规定的目录中。
2) 用VC++的Windows编程,配制编程环境。
3) 编程实现绘制立方体。
4) 编程实现用鼠标的交互操作。
5.实验学时:2 学时。
6.实验结果:上交编制的软件和实验报告。
实验二网格地形的绘制1.实验目的:1) 学会使用 OpenGL 进行三维地形的绘制;2) 掌握用OpenGL绘制网格的关键技术.3) 掌握用 OpenGL 绘制网格的的基本语句;4) 深刻体会网格剖分的理论和技术;2.实验要求:要求能够用OpenGL的语句绘制三维地形图,以网格表现。
调整网格的参数,它的高程,u,v值,它的网格数,实现不同精度,不同外观的地形。
3.实验内容:从网上下载OpenGL的地形绘制程序,或按照书上的程序例子,编程实现地形绘制。
调整程序中的网格的参数,它的高程,u,v值,它的网格数,实现不同精度,不同外观的地形。
4.实验步骤:1) 从网上下载OpenGL的地形绘制程序。
或找到书上的程序例子。
2) 用VC++的Windows编程,实现地形绘制。
3) 调整程序中的网格的参数,它的高程,u,v值,它的网格数。
4) 编程实现并观看各种地形效果。
OpenGL编程实习报告
OpenGL编程实习报告班级:学号:姓名:专业:摄影测量与遥感指导老师:实习目的:1、了解OPENGL绘图原理;熟悉OPENGL的编程步骤;掌握在OPENGL中绘图。
2、实现在VC++6.0环境下在OPENGL中绘图,绘制一个圆形或正方形;实现这个三维物体的变换。
实习原理:OpenGL的基本工作流程为:OpenGL程序的基本结构为定义窗口、清理窗口、绘制物体、结束运行。
其基本操作有:描述图元、绘制图元、OpenGL变换。
在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用相应的函数;用OpenGL作图也是类似,OpenGL函数是通过"渲染上下文"(RenderingContext简写RC)完成三维图形的绘制。
Windows下的窗口和设备上下文支持"位图格式"(PIXELFORMAT)属性,和RC有着位图结构上的一致。
只要在创建RC时与一个DC建立联系(RC也只能通过已经建立了位图格式的DC来创建),OpenGL的函数就可以通过RC对应的DC画到相应的显示设备上。
实习步骤:1、首先创建工程。
用AppWizard产生一个MFC单文档(SDI)的EXE文件。
选中三维控制(3D Controls),其余保持默认值即可。
2、将此工程所需的OpenGL文件和库加入到工程中。
在工程菜单中,选择"Build"下的"Settings"项。
单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"OpenGL32.lib glu32.lib glaux.lib",选择"OK"结束。
然后打开文件"stdafx.h",将语句#include <gl\gl.h>和#include <gl\glu.h>插入到文件中。
在vc++6.0中配置OpenGL环境
OpenGL入门学习——写给想用计算机画图的朋友OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。
1、与C语言紧密结合。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。
如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。
2、强大的可移植性。
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。
而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。
并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。
3、高性能的图形渲染。
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
OpenGL官方网站(英文)下面将对Windows下的OpenGL编程进行简单介绍。
学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。
这里我们选择VC++6.0作为学习OpenGL的环境。
第二步,安装GLUT工具包GLUT下载地址:(大小约为150k)/resources/libraries/glut/glut_downloads.php /glutdlls37beta.zipWindows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件(glut.h glut.lib glut32.lib glut.dll glut32.dll)2、把解压得到的glut.h复制到VC的“include\gl”文件夹下。
3、把解压得到的glut.lib和glut32.lib复制到静态函数库所在文件夹“VC\lib”文件夹。
实验OpenGL基本图形绘制
实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。
二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。
3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。
VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。
选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。
实验1__OpenGL基本图形绘制[整理版]
实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。
二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。
3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。
VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。
选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。
计算机图形学OpenGL实验一
实验报告
学院(系)名称:\
姓名
学号
专业
班级
实验项目
实验一:绘制基本图形
课程名称
计算机图形学
课程代码
实验时间
实验地点
批改意见
成绩
教师签字:
一、实验目的
1.理解图形元素显示的基本原理,掌握扫描转换直线段的常用算法原理,扫描转换圆弧的常用算法原理。
2.分别实现港口起重机、工程车、等设备的绘制。
3.颜色的设置要合适,且易于更换。
#include <math.h>
#include <gl/glut.h>
int SCREEN_HEIGHT = 480;//屏幕高度
//跟踪鼠标点击次数,达到3次后绘制Bezier曲线
int NUMPOINTS = 0;
Point POld = abc[0];
//绘制Bezier曲线段,控制t的增量可以控制曲线精度
for(double t = 0.0;t <= 1.0; t += 0.1) {
Point P = drawBezier(abc[0], abc[1], abc[2], t);
drawLine(POld, P);
2.熟悉glut常用几个功能函数
3.熟悉glut的函数回调机制
4.掌握绘制不同大小和颜色的点的方法
5.掌握绘制不同线型和颜色的直线的方法(直线,折线,环线)
6.掌握绘制彩色多边形边框的方法(各种设备)
7.熟悉OpenGL的编程环境(OpenGL+GlUT/SDK/MFC+C++)
VC6.0中OpenGL开发环境配置
VC6.0中OpenGL开发环境配置(整opengl必看)第一步:选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builde r,Dev-C++等,它们都是支持OpenGL的。
但这里我们选择VC++ 6.0作为学习OpenGL的环境。
第二步:安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows环境下的GLUT下载地址:(大小约为150k)/resources/libraries/glut/glutdlls37beta.zip无法从以上地址下载的话请使用下面的连接:/upfile/200607311626279.zip Windows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件2、以我的安装目录为例:(1)“d:\Program Files\Microsoft Visual Studio\VC98\include\GL文件夹”。
把解压得到的glut.h放到这个GL文件夹里。
没有GL文件夹可以自己建一个,一般都有的。
(2)“d:\Program Files\Microsoft Visual Studio\VC98\lib文件夹”)。
把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹,即lib文件夹。
(3)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)这是非常重要的动态链接库设置!第三步,创建工程,其步骤如下:(1)创建一个Win32 Console Application。
(以我创建的为例,工程名为s impleGL)(2)链接OpenGL libraries:在Visual C++中先单击Project,再单击Settin gs,再找到Link单击,最后在Object/library modules 的最前面加上openg l32.lib Glut32.lib Glaux.lib glu32.lib 。
c++程序设计实验报告
C++程序设计实验报告姓名:班级:学号:指导教师:实验一 VC6.0环境入门与简单程序设计一、实验目的:1、熟悉VC++6.0开了环境并编写简单的C++程序。
3、使用C++语言编写简单的输入输出程序。
4、使用VC++6.0的DEBUG调试功能:单步执行、设置断点、观察变量值。
二、实验内容:1、使用VC++建立一个标准C++程序,编译、运行如下程序:#include<iostream>Int main(){Cout<<”Hello World!\n”;Cout<<”Welcome to C++!\n”;}2、编程计算图形的面积。
程序可计算圆形、长方形、正方形等的面积,运行时首先提示用户选择图形类型,然后根据不同图形类型,输入相关参数计算其面积,并将其显示出来。
#include<iostream>using namespace std;void circle_area();void rectangle_area();void square_area();int main(){int i;while(1){cout<<"请输入图形类型(1:圆形;2:长方形;3:正方形;4:退出。
):";cin>>i;switch(i){case 1:circle_area();break;case 2:rectangle_area();break;case 3:square_area();break;case 4:return 0;default:cout<<"输入错误!\n";}}}void circle_area(){float r,s;cout<<"输入圆的半径:";cin>>r;s=3.14*r*r;cout<<"该圆的面积是:"<<s<<endl;}void rectangle_area(){float a,b,s;cout<<"输入长方形的长和宽:";cin>>a>>b;s=a*b;cout<<"该长方形的面积是:"<<s<<endl;}void square_area(){float a,s;cout<<"输入正方形的边长:";cin>>a;s=a*a;cout<<"该正方形的面积是:"<<s<<endl;}实验二函数的应用一、实验目的:1、掌握函数的定义和调用方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任课教师:马文娟
《3D图形学》
(2013-2014学年第1学期)
实
验
报
告
学号:
姓名:
班级:
实验一VC++6.0+OpenGL绘图环境及简单图形的输出
一、实验目的
1、熟练使用实验主要开发平台VC++6.0;
2、进一步熟悉OpenGL的主要功能;
3、掌握OpenGL的绘图流程和原理;
4、掌握OpenGL的基本数据类型、核心函数的使用。
二、实验内容
创建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制。
三、实验原理
1、基本语法(C版本下的OpenGL语法)
OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。
OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。
一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glColor3d()、glColor3f()和glColor3bv ()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。
OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float 和void。
2、程序的基本结构
OpenGL程序的基本结构可分为三个部分:
1)第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。
这些状态一般都用函数glEnable(…)、glDisable(…)来设置,“…”表示特定的状态。
2)第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:
函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);
函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;
函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影方式为透视投影,其取景体积是一个截头锥体。
3)第三部分是OpenGL的主要部分,是使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等。
3、OpenGL状态机制
OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状
态或模式在重新改变它们之前一直有效。
例如,当前颜色就是一个状态变量,在这个状态改变之前,绘制的每个像素都将使用该颜色,直到当前颜色被设置为其他颜色为止。
OpenGL中大量地使用了这种状态机制,如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位置和特性等。
许多状态变量可以通过glEnabel()、glDisable()这两个函数来设置成有效或无效状态,如是否设置光照、是否进行深度测试等;在被设置成有效状态之后,绝大部分状态变量都有一个缺省值。
四、实验代码
#include<windows.h>
#include<GL/glut.h>
//初始化OpenGL场景
void myinit (void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);//将背景置成黑色
glShadeModel (GL_FLAT);//设置明暗处理
}
//用户的绘图过程
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
//清除缓存
glBegin(GL_LINES);//开始画一根白线
glColor3f (1.0f, 1.0f, 1.0f); //设置颜色为白色
//设置第一根线的两个端点,请注意OpenGL坐标系的原点是在屏幕左下角glVertex2f(10.0f, 50.0f);
glVertex2f(110.0f, 50.0f);
glColor3f (1.0f, 0.0f, 0.0f);//设置颜色为红色
//设置第二根线的端点
glVertex2f(110.0f, 50.0f);
glVertex2f(110.0f, 150.0f);
glEnd();//画线结束
glFlush ();//绘图结束
}
//
//主过程
// 初始化windows窗口界面
// 并初始化opengl场景,绘图
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸
glutInitWindowPosition(100,120); //设置窗口的位置glutCreateWindow("第一个opengl程序");
//创建一个名为“第一个opengl程序”的窗口
glutDisplayFunc(display);//设置当前窗口的回调函数
myinit();//完成窗口初始化
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
glutMainLoop(); //启动GLUT事件循环
return(0);
}
五、实验结果
六、实验心得
实验前对OpenGL的图形标准有一个基本的认识,OpenGL是一个开放式的、与硬件无关的图形软件包,它独立于窗口系统与操作系统。
OpenGL的具体功能包括:建模、变换、着色、光照处理和材质设置、位图显示、图像增强和纹理映射、双缓存动画;通过本次实验了解进一步熟悉OpenGL的主要功能,初步掌握OpenGL的绘图流程和原理以及OpenGL的基本数据类型、核心函数的使用;对OpenGL开发库的组成有了基本了解,windows下OpenGL组件由函数说明文件、静态链接库文件、动态链接库文件3部分组成,OpenGL的库函数采用C语言风格;通过本次实验学会如何在visual c++环境中使用OpenGL库函数。