04图形图示设计资料Word格式文档下载.docx
《04图形图示设计资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《04图形图示设计资料Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
这些数字化的输入经过计算机处理后变成图形输出。
可以说计算机图形学在当代社会的运用已经涉及到了各个领域上的运用,无论在什么领域上计算机图形学都发挥到了自己的作用;
计算机图形学以其对图像的专业处理技术,对图形图像的加工运用,实现图形的立体转化,三维立体图形的旋转变形,由平面图到三维立体图的转化等等,都是命了计算机图形学强大的图像处理技术。
1.3定义
计算机图形学:
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及计算机动画、自然景物仿真、虚拟现实等。
OpenGl:
用于编写计算机图形学的程序的编译工具。
OpenGL是行业领域中最为广泛接纳的2D/3D图形API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。
OpenGL是独立于视窗操作系统或其它操作系统的,亦是网络透明的。
在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™帮助程序员实现在PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OPENGL的功能及特点:
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;
OpenGL可以与VisualC++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;
OpenGL使用简便,效率高。
它具有七大功能:
旋转体:
一条平面曲线绕着它所在的平面内的一条定直线旋转所形成的曲面叫作旋转面;
封闭的旋转面围成的几何体。
旋转矩阵:
在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。
旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。
所有旋转加上反演形成了正交矩阵的集合。
旋转变换:
简称旋转.欧氏几何中的一种重要变换.即在欧氏平面上(欧氏空间中),让每一点P绕一固定点(固定轴线)旋转一个定角,变成另一点P′,如此产生的变换称为平面上(空间中)的旋转变换.。
变换矩阵:
在线性代数中,线性变换能够用矩阵表示。
如果T是一个把R映射到R的线性变换,且x是一个具有n个元素的列向量,
,那么我们把m×
n的矩阵A,称为T的变换矩阵。
3D坐标系:
三维笛卡儿坐标系是在二维笛卡儿坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。
2D坐标系:
在同一个平面上互相垂直且有公共原点的两条数轴构成平面直角坐标系。
模型变换和视图变换,并练习使用OpenGL模型视图变换方法建模以及生成动画图形
矩阵变换组合生成其它模型的建模方法
1.4参考资料
a.计算机图形学,项志钢,清华大学出版社,第1版,2006年12月;
b.软件文档国家标准(GB8567-88);
c.openGL入门学习;
d.OpenGL编程手册;
e.VC++编程手册;
2实际开发结果
2.1作品
1
系统需求分析
1.纹理的绘制
2,材质的绘制
3.移动光源的绘制
4.动态时钟实现
3算法流程,实现效果
3.1纹理的绘制
设置纹理的流程:
创建纹理数据,书上说必须是2的整数倍,而且最小为64。
-->
设置纹理数据,用glTexImage2D设置一个二维的纹理数据-->
设置纹理映射的控制参数,参数主要包括滤波,重复和简约,函数用glTexParameterf()。
映射中和物体表面颜色的处理函数用glTexEnvf等。
启动纹理.glEnable(GL_TEXTURE_2D);
--》绘制图形。
主要流程就是这样了。
主要函数:
voidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);
Target就设置为GL_TEXTURE_2D,level表示纹理分级的级数,我们现在只有一种纹理,就设置为0参数level表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0。
components参数是哪些颜色分量进行调整和混合。
具体功能不知道,我用的是3,表示RGB。
Width,height参数是像素的宽和高,border是边框大小,format是颜色类型,我选择的是GL_RGB,type是数据的类型,就用GL_UNSIGNED_BYTE,pixels参数就是数据源了。
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
设置重复设置方式,这里是S方向的,也就是说如果纹理坐标超过了这个范围,就从头算的。
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
滤波方式,这里是线性滤波,也就是说算两个像素的插值时用线性的方法算。
这样可以更平滑一点。
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
就是映射中和物体表面颜色的处理方式,我选择的纹理颜色。
初始化就差不多了,还有很多其他的函数,也不完全清楚是做什么的。
在绘制图形的时候,就用glTexCoord2f(0,0);
来确定纹理的坐标。
纹理效果图:
3.2光源的绘制
OpenGL有五种光,环境光,点光源,漫反射光,镜面反射光,聚光源。
OpenGL可以使用GL_LIGHT0-GL_LIGHT7七盏光。
每种关具体的参数请看书上的表:
pname参数名
缺省值
说明
GL_AMBIENT
(0.0,0.0,0.0,1.0)
RGBA模式下环境光
GL_DIFFUSE
(1.0,1.0,1.0,1.0)
RGBA模式下漫反射光
GL_SPECULAR
(1.0,1.0,1.0,1.0)
RGBA模式下镜面光
GL_POSITION
(0.0,0.0,1.0,0.0)
光源位置齐次坐标(x,y,z,w)
GL_SPOT_DIRECTION
(0.0,0.0,-1.0)
点光源聚光方向矢量(x,y,z)
GL_SPOT_EXPONENT
0.0
点光源聚光指数
GL_SPOT_CUTOFF
180.0
点光源聚光截止角
GL_CONSTANT_ATTENUATION
1.0
常数衰减因子
GL_LINER_ATTENUATION
线性衰减因子
GL_QUADRATIC_ATTENUATION
平方衰减因子
表10-1函数glLight*()参数pname说明
设置光源:
我们先对启用关照才能使用光源,启用光照的函数是:
glEnable(GL_LIGHTING);
然后我们可以使用:
glEnable(GL_LIGHT0);
来启用GL_LIGHT0这个光。
基本知识就学了这么多,然后是使用它的过程,
GLfloatlight_param[]={5.0,5.0,-1.0,1.0};
glLightfv(GL_LIGHT0,GL_POSITION,light_param);
放在程序的init函数里面,因为这是初始化的一部分。
他的意思就是启用光照,设置GL_LIGHT0的属性为点光源,他为位置是:
[5.0,5.0,-1.0,1.0]对应的其次坐标。
我也不知道他具体做什么,现在就当做是他的坐标吧。
这次加了一个键盘监听的处理函数。
可以响应键盘按键了,在这个程序中用1,2,3,4等键可以切换灯光。
按4键运行结果
按5键运行结果图
3.3材质的绘制
1.材质在光的照耀下才能发挥他的作用。
没有光,材质是不能显示的。
2.他和光的设置基本一样。
光设置的函数是glLightfv(XX,XXX,XX);
材质的设置是voidglMaterialf(
GLenumface,
//设置材质的面片,是前面,后面,还是双面
GLenumpname,
//材质的类型,是环境光材质,漫反射,反射,高光,辐射光等
GLfloatparam
//参数,跟光的参数一样,表示对应的值。
);
材质有环境光,漫反射,镜面反射,辐射,高光等几种设置。
里面的颜色参数代表他对该颜色的反射强度,1,最强,0表示完全吸收。
也就是说他会跟光做一个乘法。
得出来的光就颜色就是反射的我们眼睛的颜色。
例如:
[1.0,
0.0,1.0]的材质,本来呈现紫色,如果用[1.0,1.0,1.0]的光去照射就是紫色。
如果是[0.0,1.0,1.0]的光照射就是蓝色。
因为最后他们各分量相乘得到了[0,0,1]就呈现蓝色了。
运行效果图:
3.4动态时钟的绘制
采用蓝色填充时针,红色填充分针,蓝色填充时针,黄色填充秒针;
采用GL_TRIANGLES绘制时针、分针、秒针;
绘制时针和秒针的刻度时调用GL_POINTS,通过设置glPointSize()以区别时针和秒针的刻度。
动态效果图:
源代码附录:
1,纹理绘制
#pragmacomment(lib,"
glaux.lib"
)
#include"
gl\glaux.h"
#include<
gl\glut.h>
/**//*创建纹理*/
#defineImageWidth64
#defineImageHeight64
GLubyteImage[ImageWidth][ImageHeight][3];
GLfloatsgenparams[]={1.0,1.0,1.0};
voidmakeImage(void)
{
inti,j,r,g,b;
for(i=0;
i<
ImageWidth;
i++)
{
for(j=0;
j<
ImageHeight;
j++)
r=(i*j)%255;
g=(4*i)%255;
b=(4*j)%255;
Image[i][j][0]=(GLubyte)r;
Image[i][j][1]=(GLubyte)g;
Image[i][j][2]=(GLubyte)b;
}
}
voiddisplay(void)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//清楚颜色数据和深度数据(清屏)
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
//初始变换矩阵为单位矩阵
glColor3f(1,1,1);
//设置颜色为白色
//绘制一个实心的茶壶
glPushMatrix();
glTranslatef(-4,2,0);
glFrontFace(GL_CW);
glutSolidTeapot
(1);
glFrontFace(GL_CCW);
glPopMatrix();
//绘制一个实心的球体
glPushMatrix();
glTranslatef(-1,2,0);
glutSolidSphere(1,32,32);
glPopMatrix();
//绘制一个面
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(0,0,0);
glTexCoord2f(0,1);
glVertex3f(0,3,0);
glTexCoord2f(1,1);
glVertex3f(3,3,0);
glTexCoord2f(1,0);
glVertex3f(3,0,0);
glEnd();
glutSwapBuffers();
//交换缓冲区。
显示图形
//初始化
voidinit(void)
glClearColor(0.5,0.5,0.5,0.0);
//清理颜色,为黑色,(也可认为是背景颜色)
makeImage();
//创建纹理数据
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
//设置像素存储方式
glTexImage2D(GL_TEXTURE_2D,0,3,ImageWidth,ImageHeight,
0,GL_RGB,GL_UNSIGNED_BYTE,&
Image[0][0][0]);
//设置纹理信息
//设置s方向纹理重复,为重复设置。
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
//是指t方向的纹理重复,超出1范围的像素纹理都为1处的纹理像素
//glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
//设置滤波方式为线性滤波
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
//设置纹理和物体表面颜色处理方式
//只用纹理颜色,不关心物体表面颜色
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
//和物体表面颜色做与运算。
//glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
//做融合运算,我还不知道具体是什么东东。
//glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_BLEND);
//glEnable(GL_BLEND);
//自动生成坐标的方式。
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
//如果有自动生成坐标,他就会自动生成,就算你有glTexCoord2f()。
//glEnable(GL_TEXTURE_GEN_T);
//glEnable(GL_TEXTURE_GEN_S);
//启动自动生成s方向自动生成纹理
glEnable(GL_TEXTURE_2D);
//启动一维纹理
GLfloatligPos[]={0,0,5,0};
glLightfv(GL_LIGHT0,GL_POSITION,ligPos);
//glEnable(GL_LIGHTING);
//启动光照
glEnable(GL_LIGHT0);
//启动第一个光源light0
//glEnable(GL_AUTO_NORMAL);
//XXX不知道
//glEnable(GL_NORMALIZE);
//XXx不知道
//不知道是什么,用了,球就不能正常显示了。
但是不用,茶壶就不能正常显示了。
//glFrontFace(GL_CW);
glMaterialf(GL_FRONT,GL_SHININESS,64.0);
//设置材质的高光为64
glEnable(GL_DEPTH_TEST);
//启动深度裁剪
glDepthFunc(GL_LEQUAL);
//裁剪方式为小于等于
glCullFace(GL_BACK);
//裁剪方式为背面剔除
glEnable(GL_CULL_FACE);
//启动面片剔除
//当窗口大小改变时,会调用这个函数
voidreshape(GLsizeiw,GLsizeih)
//这里小说明一下:
矩阵模式是不同的,他们各自有一个矩阵。
投影相关
//只能用投影矩阵。
(只是目前情况下哦,等我学多了可能就知道为什么了。
glViewport(0,0,w,h);
//设置视口
glMatrixMode(GL_PROJECTION);
//设置矩阵模式为投影变换矩阵,
//变为单位矩阵
//gluPerspective(60,(GLfloat)w/h,0,1000);
//设置投影矩阵
glOrtho(-6.0,6.0,-6.0*h/w,6.0*h/w,-10,10);
//为了不变形,则要长和宽成比例
glMatrixMode(GL_MODELVIEW);
//设置矩阵模式为视图矩阵(模型)
intmain(intargc,char**argv)
glutInit(&
argc,argv);
//Opnegl初始化
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
//设置显示模式为双缓冲,RGEBA
glutInitWindowSize(800,600);
//窗口大小
glutInitWindowPosition(100,100);
//窗口位置
glutCreateWindow("
hello"
//创建一个标题为hello的窗口
init();
//初始化资源,这里一定要在创建窗口以后,不然会无效。
glutDisplayFunc(display);
//窗口大小改变时的回调
glutReshapeFunc(reshape);
//绘制图形时的回调
glutMainLoop();
//主循环。
return0;
2.光照效果
//压入变换矩阵那
glTranslated(0,0,-5);
//平移0,0,-5向Z负方向平移5个单位
glutSolidSphere(1,30,30);
//利用库函数绘制一个半径为1的球体。
//弹出矩阵。
//清理颜