计算机图形学实验报告孙舸Word文档下载推荐.docx
《计算机图形学实验报告孙舸Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告孙舸Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
一、实验目的-13-
二、实验原理-13-
三、实验内容-14-
四、实验步骤及结果-14-
实验四图形基本变换-16-
一、实验目的-16-
二、实验原理-16-
三、实验内容-17-
四、实验步骤及结果-18-
实验五三维图形生成及显示
(一)-21-
一、实验目的-21-
二、实验原理-21-
三、实验内容-23-
四、实验步骤及结果-23-
实验六三维图形生成及显示
(二)-26-
一、实验目的-26-
二、实验原理-26-
三、实验内容-28-
四、实验步骤及结果-28-
实验一OpenGL程序结构练习
一、实验目的:
1.熟悉C语言环境下OpenGL的使用方法;
2.了解OpenGL程序的基本结构;
3.学习绘制一些基本的图形。
二、实验原理:
绝大多数OpenGL程序具有类似的结构,包含下述函数
main():
定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句)
init():
设置状态变量、视图、属性、回调、显示函数、输入和窗口函数
#include<
GL/glut.h>
//glut.hincludesgl.handglu.h
voiddisplay()
{……}
voidinit()
intmain(intargc,char**argv)
{……}
三、实验内容:
1.了解程序中各个结构的功能;
2.了解用OpenGL绘制点、线、三角形及多边形;
3.绘制一个绿色的三角形。
四、实验步骤及结果:
1.导入OpenGL的glut32.lib和glut.h文件:
将.lib文件存放到C语言程序文件夹的Library下,.h文件放到Include下;
导入应用程序扩展文件glut32.dll,存放到system文件夹下;
2.打开VC6.0,新建工程,并命名为sun1;
3.在工程sun1下新建源文件,并命名为sunge.cpp;
4.编写代码并编译链接;
5.运行结果。
选择界面
实验二基本图形生成
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()
1.用OpenGL生成点、线;
2.用OpenGL生成多边形。
1.打开VC6.0,新建名为sun2的工程文件,并新建名为sun.cpp的源文件;
2.编写代码,编译并链接;
3.运行结果。
(1):
(2):
(3):
实验三交互式控制
1.了解OpenGL中交互式控制的原理;
2.学会运用OpenGL程序的回调函数实现鼠标和键盘操作的响应。
1.GLUT中的回调函数
GLU识别在各种窗口系统(Windows,X,Macintosh)中都有的一组事件:
glutDisplayFunc//显示功能
glutMouseFunc//鼠标功能
glutReshapeFunc//重置形状功能
glutKeyboardFunc//键盘功能
glutIdleFunc//闲置停顿功能
glutMotionFunc//动作请求功能
glutPassiveMotionFunc//被动请求功能
2.鼠标回调函数
glutMouseFunc(mymouse)
voidmymouse(GLintbtn,GLintstate,GLintx,GLinty)
其中btn的值可能是GLUT_LEFT_BUTTON、GLUT_MIDDLE_BUTTON、GLUT_RIGHT_BUTTON,表示哪个按钮导致了事件发生;
state表示相应按钮的状态:
GL_UP,GL_DOWN;
x,y表示在窗口中的位置。
3.键盘的应用
glutKeyboardFunc(mykey)
voidmykey(GLubytekey,GLintx,GLinty)
返回键盘上被按下键的ASCII码和鼠标位置。
注意在GLUT中并不把释放键做为一个事件。
1.用OpenGL生成一个三角形;
2.在三角形的基础上实现多边形形成圆的过程,用鼠标左键增加边数,鼠标右键减少边数;
3.在上述基础上实现用键盘“q”或“Q”控制图形窗口的关闭。
1.打开VC6.0,新建名为sun3的工程文件,在工程内新建名为sun3.cpp的源文件;
实验四图形基本变换
1.了解OpenGL下图形窗口的坐标表示;
2.掌握图形坐标的矩阵变换运算方法;
4.了解OpenGL中封装好的图形变换函数;
3.能运用坐标的矩阵算法对图形进行伸缩、对称、错切变换。
1.空间图形的矩阵表示
若用一个行向量[x1x2…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下绘制一个基本图形三角形,并实现该图形的伸缩、对称、错切变换,其中伸缩通过键盘的“f”和“s”键控制。
1.打开VC6.0,新建名为sun4的工程文件,并新建名为sun4.cpp的源文件;
4.程序运行结果。
原图:
放大:
显示原图的2.0倍伸缩变换
缩小:
显示原图的0.5倍伸缩变换
其中绿色为原图,青蓝色为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(),提供了创建定位照相机所用的模型-视图矩阵的简单方法。
注意在设置中需要一个向上的方向初始化,即上载单位阵也可以与模型变换复合在一起。
例如:
平行于轴的立方体的等角投影
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.为了便于观察,在程序中加入交互式控制模式,可以通过鼠标或键盘控制图形的变化;
3.用OpenGL绘制一个各个面颜色不同的彩色正方体,并通过鼠标左键控制其旋转。
1.打开VC6.0,新建名为sun5的工程文件,并新建名为sun5.cpp的源文件;
3.程序运行结果。
(1):
控制键盘方向键对图形进行变换
实验六三维图形生成及显示
(二)
1.了解OpenGL下生成光照模型的方法;
2.学会在OpenGL中创建光源,对3D图形进行明暗处理。
1.简单光照明模型
模拟物体表面的光照明物理现象的数学模型-光照明模型。
简单光照明模型只考虑光源对物体的直接光照。
Phong光照明模型:
简单光照明模型模拟物体表面对光的反射作用,光源为点光源。
反射作用分为镜面反射(SpecularReflection)和漫反射(DiffuseReflection),物体间作用用环境光(AmbientLight)表示
Phong模型的实现:
对物体表面上的每个点P,均需计算光线的反射方向。
为了减少计算量,假设:
光源在无穷远处,L为常向量,视点在无穷远处,V为常向量,(H•N)近似(R•V),H为L与V的平分向量,对所有的点总共只需计算一次H的值,节省了计算时间。
示例:
增量式光照明模型:
在每个多边形顶点处计算光照明强度或参数,然后在各个多边形内部进行双线性插值,得到多边形光滑均匀颜色分布。
两个主要算法:
双线性光强插值、Gouraud明暗处理;
双线性法向插值、Phong明暗处理。
2.局部光照明模型
从光电学知识和物体微平面假设出发,介绍镜面反射与物体材质有关的普遍局部光照明模型。
局部光照明模型表示:
物体表面反射光强,表示环境光的影响。
最后一项是考虑了物体表面性质后的反射光强度量,是该局部光照明模型的复杂性与普遍性所在。
简单与局部模型比较:
3.纹理及纹理映射
解决计算机生成真实感图象缺乏现实物体表面细节的问题。
纹理映射是把纹理图象值映射到三维物体的表面的技术。
纹理映射的问题:
改变物体的属性,可以产生纹理的效果,对简单光照明模型而言,改变漫反射系数来改变物体的颜色;
改变物体表面的法向量。
映射方法:
建立物体空间坐标(x,y,z)和纹理空间坐标(u,v)之间的对应关系,对物体表面进行参数化,反求出物体表面的参数后,根据(u,v)得到该处的纹理值,并用此值取代光照明模型中的相应项,实现纹理映射。
2.在生成的球体上加入光源,并改变光照类型。
1.打开VC6.0,新建名为sun6的工程文件,并新建名为sun6.cpp的源文件;