计算机图形学实验报告姓名:学号:班级:目录实验一OpenGL程序结构练习 (3)实验二基本图形生成 (6)实验三交互式控制 (9)实验四图形基本变换 (12)实验五三维图形生成及显示 (15)实验六三维图形生成及显示 (19)实验一OpenGL程序结构练习【实验目的】1.熟悉C语言环境下OpenGL的使用方法;2.了解OpenGL程序的基本结构。
【实验原理】绝大多数OpenGL程序具有类似的结构,包含下述函数main():定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句)init():设置状态变量、视图、属性、回调、显示函数、输入和窗口函数#include <GL/glut.h> // glut.h includes gl.h and glu.hvoid display(){ ……}void init(){ ……}int main( intargc, char **argv){ ……}【实验内容】1.了解程序中各个结构的功能;2.用OpenGL生成三角形。
【实验步骤及结果】1.导入OpenGL的glut32.lib和glut.h文件:将.lib文件存放到C 语言程序文件夹的Library下,.h文件放到Include下;导入应用程序扩展文件glut32.dll,存放到system文件夹下。
2.打开VC 6.0,新建工程,并命名为text1,如图1.图 13.在工程text1下新建源文件,并命名为text1.cpp。
4.编写代码并编译链接,如图2所示。
图 25.运行,结果如图3所示。
图 3实验二基本图形生成【实验目的】1.熟悉OpenGL的程序结构,并了解各部分的功能。
2.学会应用OpenGL语言绘制出点,线,多边形。
【实验原理】1.GLUT函数glutInit使得应用程序可以获取命令行参数并初始化系统。
glutInitDisplayMode设置窗口的属性、RGB颜色、单缓冲区、属性按照逻辑或组合在一起。
glutWindowSize以像素为单位定义窗口的尺寸。
glutWindowPosition定义窗口左上角在显示器上的位置。
glutCreateWindow创建窗口,标题来自于参数值。
glutDisplayFunc定义显示回调函数。
glutMainLoop进入无穷的事件循环。
2.变换与视图在OpenGL中投影是利用投影矩阵乘法(变换)进行的,由于只存在一个变换函数系列,因此必须先设置矩阵模式。
glMatrixMode(GL_PROJECTION)变换函数是累加在一起的,因此需要从单位阵开始,然后把它改变为一个投影矩阵以定义视景体。
3.OpenGL的基本几何形状在display模块下采用glBegin()调用,如:glBegin(GL_POLYGON)既是调用多边形绘制方式。
4.颜色与状态颜色的每个分量在帧缓冲区中是分开存贮的,在缓冲区中通常每个分量占用8位字节。
注意在函数glColor3f中颜色的变化范围是从0.0(无)1.0(全部), 而在glColor3ub中颜色值的变化范围是从0到255。
在OpenGL程序中,由glColor*设置的颜色成为状态的一部分,后续构造过程将使用这一颜色,直至它被修改为止。
颜色与其它属性不是对象的一部分,但是在渲染对象时,要把这些属性赋给对象,可以按下述过程创建具有不同颜色的顶点glColor()glVertex()glColor()glVertex()【实验内容】1.用OpenGL生成点、线。
2.用OpenGL生成多边形。
【实验步骤及结果】1.打开VC 6.0,新建名为text2的工程文件,并新建名为text2.cpp 的源文件。
2.编写代码,编译并链接,如图1所示。
图 13.运行,结果如图2所示。
图 2实验三交互式控制【实验目的】1. 了解OpenGL中交互式控制的原理。
2.学会运用OpenGL程序实现鼠标和键盘对图形及窗口的控制。
【实验原理】1.GLUT中的回调函数GLU识别在各种窗口系统(Windows, X, Macintosh)中都有的一组事件:glutDisplayFunc //显示功能glutMouseFunc //鼠标功能glutReshapeFunc //重置形状功能glutKeyboardFunc //键盘功能glutIdleFunc //闲置停顿功能glutMotionFunc //动作请求功能glutPassiveMotionFunc //被动请求功能2.鼠标回调函数glutMouseFunc(mymouse)voidmymouse(GLintbtn, GLint state, GLint x, GLint y)其中btn的值可能是GLUT_LEFT_BUTTON、GLUT_MIDDLE_BUTTON、GLUT_RIGHT_BUTTON,表示哪个按钮导致了事件发生;state表示相应按钮的状态:GL_UP, GL_DOWN ;x, y表示在窗口中的位置。
3.键盘的应用glutKeyboardFunc(mykey)voidmykey(GLubyte key, GLint x, GLint y)返回键盘上被按下键的ASCII码和鼠标位置。
注意在GLUT中并不把释放键做为一个事件。
【实验内容】1.用OpenGL生成一个多边形。
2.在多边形的基础上实现用鼠标控制图形窗口的切换,并且能通过鼠标控制变换图形颜色。
3.在上述基础上实现用键盘控制图形窗口的关闭。
【实验步骤及结果】1.打开VC 6.0,新建名为text3的工程文件,在工程内新建名为text3.cpp的源文件。
2.编写代码,编译并链接,如图1所示。
图 13.程序运行结果如下:附:①鼠标控制方式如图2所示:鼠标左键控制显示display2的螺帽状图形,右键控制显示display1的矩形。
图 2②在display1中,定义for循环和n的整型变量,实现矩形颜色的变化,如图3所示:n=7时,即可实现8种颜色的变换,在颜色上调用glCoclor3fv(coclor[n])定义显示的颜色。
图 3③键盘控制方式:当键入Q或q时,图形显示窗口关闭运行结果:实验四图形基本变换【实验目的】1.了解OpenGL下图形窗口的坐标表示;2.掌握图形坐标的矩阵运算方法;3.能运用坐标的矩阵算法对图形进行伸缩、对称、错切变换。
【实验原理】1.空间图形的矩阵表示若用一个行向量[ x1 x2 …xn ]表示n维空间中一个点坐标,那么n维空间中m个点坐标就可以表示为一个向量集合:2.图形变换图形变换可以通过对表示图形坐标的矩阵进行运算来实现,称为矩阵变换法。
矩阵变换法的一般形式:(1)伸缩变换当a=d,图形沿x方向和y方向等比例缩放;当a=d>1,图形沿x、y方向等比例放大;当0<a=d<1,图形沿x 、y方向等比例缩小。
(2)对称变换和伸缩变换相似,如:关于x轴对称:(3)错切变换【实验内容】在OpenGL下绘制一个基本图形,并实现该图形的伸缩、对称、错切变换。
【实验步骤及结果】1.打开VC 6.0,新建名为text4的工程文件,并新建名为text4.cpp 的源文件。
2.编写代码,编译并链接,如图1所示。
图 13.程序运行结果如图2所示:图 2其中绿色为原图,青蓝色为y=-x对称,黄色为0.6倍缩放后关于x轴对称,红色为x方向错切。
实验五三维图形生成及显示【实验目的】1.了解OpenGL下3D图形生成的原理;2.学会运用OpenGL生成简单的三维图形。
【实验原理】1.OpenGL中的照相机在OpenGL中,初始的世界标架和照相机标架相同初始的模型-视图矩阵是单位阵照相机位于原点,并指向z轴的负向;OpenGL也指定了默认的视景体,它是一个中心在原点的边长为2的立方体。
缺省的投影矩阵是单位阵。
移动照相机:可以利用一系列旋转和平移把照相机定位到任意位置。
例如,为了得到侧视图:旋转照相机: R;把照相机从原点移开: T;模型-视图矩阵C = TR。
注意最后指定的变换是最先被应用的变换glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslated(0.0, 0.0, -d);glRotated(-90.0, 0.0, 1.0, 0.0);2.视图定位矩阵LookAt()函数:在GLU库中包含了函数gluLookAt(),提供了创建定位照相机所用的模型-视图矩阵的简单方法。
注意在设置中需要一个向上的方向初始化,即上载单位阵也可以与模型变换复合在一起。
例如:平行于轴的立方体的等角投影glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(1.,1.,1.,0.,0.,0.,0.,1.,0.);3.投影变换投影变换投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。
(注意,从现在起,坐标可以不再是-1.0到1.0了!)OpenGL支持两种类型的投影变换,即透视投影和正投影。
投影也是使用矩阵来实现的。
如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode()函数。
即为:glMatrixMode(GL_PROJECTION); 通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
glLoadIdentity(); 透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,两条铁轨似乎在远处相交了。
【实验内容】1.用OpenGL生成一个球体;2.为了便于观察,在程序中加入交互式控制模式,可以通过鼠标或键盘控制图形的变化。
【实验步骤及结果】1.打开VC 6.0,新建名为text5的工程文件,并新建名为text5.cpp 的源文件。
2.编写代码,编译并链接,如图1所示。
图 13.程序运行结果如图2所示:图 24.控制键盘方向键对图形进行变换,如图3所示图 3实验六三维图形生成及显示【实验目的】1.了解OpenGL下生成光照模型的方法;2.学会在OpenGL中创建光源,对3D图形进行明暗处理。
【实验原理】1.简单光照明模型模拟物体表面的光照明物理现象的数学模型-光照明模型。
简单光照明模型只考虑光源对物体的直接光照。
Phong光照明模型:简单光照明模型模拟物体表面对光的反射作用,光源为点光源。
反射作用分为镜面反射(Specular Reflection)和漫反射(Diffuse Reflection),物体间作用用环境光(Ambient Light)表示Phong模型的实现:对物体表面上的每个点P,均需计算光线的反射方向。
为了减少计算量,假设:光源在无穷远处,L为常向量,视点在无穷远处,V为常向量,(H•N)近似(R•V),H为L与V的平分向量,对所有的点总共只需计算一次H的值,节省了计算时间。