77范文网 - 专业文章范例文档资料分享平台

毕业论文(10)

来源:网络收集 时间:2019-07-30 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

提供了纹理对象技术,可以把在管道内放多个纹理,每个纹理对应一个数字(名字), 需要用到是把这个名字的纹理Bind为当前纹理就可以了。用glGenTextures (n,*textures)命令取得可用的纹理名字的。

在3D图形中,纹理映射是广泛使用的。纹理映射也是相当复杂的过程:1、 定 义纹理;2、控制滤波;3、说明映射方式;4、绘制场景给出顶点的纹理坐标和几 何坐标。(注意!!纹理映射只能在RGBA模式下使用,不适用于颜色索引模式) 1.纹理定义

void glTexImage2D( GLenum target, GLint level, GLint components,GLsizei

width, GLsizei height, GLint border,GLenum format, GLenum type, const GLvoid *pixels );定义一个二维纹理映射,target是常数 GL_TEXTURE_2D;level表示多 级分辨率的纹理图象的级数,若只有一种分辨率,level为0;components是从1 到4的整数,1:选择R;2:选择R A;3:选择R G B;4:选择R G B A; width height是纹理的尺寸。format和type描述映射格式和数据类型。它们与前 面讲glDrawPixels()中GL_NEAREST_MIPMAP_NEAREST,GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST,GL_LINEAR_MIPMAP_LINEAR 2.1 滤波

原始纹理图象是个方形图象,把它映射到奇形怪状的物体上,一般不可能图象上的

一个象素对应屏幕的一个象素。因此局部放大缩小时,就要定义合适的滤波方式(以 西南交通大学本科毕业设计(论文) 第46页 2D为例): void glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); void glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); 前者是放大滤波(GL_TEXTURE_MAG_FILTER),后者是缩小滤波 (GL_TEXTURE_MIN_FILTER);另外,GL_NEAREST是利用最坐标最靠近象素中心的纹 理元素,这有可能使图样走型,但计算速度快;GL_LINEAR利用线形插值,效果好 但计算量大。

2.2重复与缩限

纹理映射可以重复映射或者缩限映射,重复映射时纹理可以在自己的坐标S T方向 重复。对于重复映射:

void glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); void glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 参数GL_REPEAT改为GL_CLAMP,则缩限,所有大于1的纹理元素值置为1。所 有小于0的纹理元素值置为0,0的纹理元素值置为0。

3. 映射方式

处理纹理本身图案颜色和物体本身颜色的关系:void glTexEnv{if}[v](GLenum target,GLenum pname,TYPE param);target必须是GL_TEXTURE_ENV;pname是 GL_TEXTURE_ENV_MODE,则param可以是 GL_DECAL GL_MODULATE或GL_BLEND,说 明纹理值与原来颜色不同的处理方式。pname是GL_TEXTURE_ENV_COLOR,则参数 param是包含4个浮点数(R、G、B、A)的数组。这些值只在采用GL_BLEND纹理函 数时才采用。

4. 纹理坐标

坐标的定义:纹理图象是方形的,纹理坐标可定义成s,t,r,q坐标,仿照齐次坐标 系的x,y,z,w坐标。void glTexCoord{1234}{sifd}[v](TYPE coords);设置当前 纹理坐标,此后调用glVertex*()所产生的顶点都赋予当前的纹理坐标。 5. 坐标自动产生

有时不需要为每个物体顶点赋予纹理坐标,可以使用void glTexGen{if}(GLenum coord,GLenum pname,TYPE param);coord为:GL_S GL_T GL_R或GL_Q,指明哪个 坐标自动产生pname为GL_TEXTURE_GEN_MODE时param为常数:GL_OBJECT_LINEAR GL_EYE_LINEAR或GL_SPHERE_MAP,它们决定用哪个函数来产生纹理坐标pname为 GL_OBJECT_PLANE或GL_EYE_PLANE,param时一个指向参数数组的指针。【16】 下面就本文中纹理贴图的例子做介绍:首先定义了一个读入位图的函数BOOL

LoadBMP(TCHAR* szFileName),在位图函数中完成了纹理的定义;然后又定义了一

个函数GLLoadTextures(GLuint* ptList)完成了对纹理的滤波、重复和缩限的控制, 西南交通大学本科毕业设计(论文) 第47页 最后在场景模型的绘制中将纹理坐标赋给了模型顶点坐标。下面是本文中纹理贴图 的部分代码:

CLoadBMP::GLLoadTextures(GLuint* ptList) {

glGenTextures(18, ptList);//生成16个纹理名字

glBindTexture(GL_TEXTURE_2D, ptList[GRESS]);//将纹理名字GRESS绑定到 纹理目标上

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);//在S方 向纹理重复

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);//在T方 向纹理重复

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);//放 大滤波

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);//缩 小滤波

LoadBMP(\载入位图 ... }

绘制实验室房间的代码:

void CMyView::creatskybox() {

glPushMatrix();

glDisable(GL_BLEND);

glEnable(GL_TEXTURE_2D);启动纹理映射

glBindTexture(GL_TEXTURE_2D, tList[GRASS2]);选择纹理GRASS2 glColor4f(1.0f,1.0f,1.0f,1.0f); glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-100.0f, -100.0f, -100.0f); // 纹理和四边形的左下

glTexCoord2f(1.0f, 0.0f); glVertex3f( 100.0f, -100.0f, -100.0f); // 纹理和四边形的右下

glTexCoord2f(1.0f, 1.0f); glVertex3f(100.0f, 100.0f, -100.0f);

// 纹理和四边形的右上

glTexCoord2f(0.0f, 1.0f); glVertex3f(-100.0f, 100.0f, -100.0f); 西南交通大学本科毕业设计(论文) 第48页 // 纹理和四边形

的左上

glEnd(); ... }

编译运行后的结果如下图4-10所示:

图4-10 题图后的仿真场景效果图 4.4.2

设置光照 从图5-7可以看出,如果能使场景变的亮一些效果肯定很好,这是因为我们还 没有设置光照的效果,下面我们对场景进行光照设置。首先让我们了解一下OpenGL 中光照的知识。

在观察物体的表面时,人眼睛对颜色的感知取决于进入眼内视维细胞的光子的 能量分布。这些光子来自于光源或发光物体,一些被表面吸收,而另一些则被反射。 而且,不同表面的反射特性的差别是非常大的:对于较光滑的表面,入射光线在某 个方向上将完全反射,在另外的方向上则完全散射。大部分表面处于全反射与散射

之间。OpenGL近似地将光线分解成红、绿、蓝三种成分。光源的颜色取决于它所发

出的红、绿、蓝光的和。表面的材质特征则是由这个表面在各个方向反射的红、绿、 西南交通大学本科毕业设计(论文) 第49页 蓝光的百分比决定。虽然OpenGL的光照方程仅是一种近似算法,但与实际是十分

接近的,并且可以达到很快的计算速度。在OpenGL的光照模型中,场景中的光线 来自不同光源,这些光源的开关相互独立,有的从特定的方向、位置射出,还有一 些在场景中散射。OpenGL的光照模型将光照分成四个独立的成分:发射光,环境光, 散射光,镜面反射光。四种成分独立地计算,然后叠加到一起。发射光是最简单的, 它由物体发出,并且不受任何光源的影响。背景光成分是从某个光源发出并由环境 经多次散射得到的,难以确定其最初的方向,看起来好像来自于四面八方。散射光 来自于一个固定方向,所以当光线垂直照射到物体表面上时要比斜照时亮一些。然 而,一旦光线照到表面上就均匀地在各个方向都发生散射,因此不论观察点处在哪 个位置,其亮度都是一样的。来自于特定位置与方向的任何光线都可能带有散射光 成分。镜面反射光也来自于特定方向,但它几乎全部反射到对称的方向上。尽管光 源发出的光是按单一频率分布的,但其中的环境光、散射光和镜面反射光分量是有 区别的。对光线来说,每种颜色的数值对应于它所占光强的百分比。如果光线的R, G和B值都是1.0,这种光就是最强的白光。如果三个值都是0.5,颜色仍然是白色, 但亮度只有原来的一半,所以这种光看起来是灰色的。如果R=G=1而B=0(全红 和全绿,没有蓝),此时光是黄色的。

OpenGL的光照模型进行了这样的近似处理:材料的颜色,是由它对红、绿、蓝 光各反射百分比的叠加结果决定的。为光线指定额色成分意味着光的颜色与材料的 颜色是不同的。对村质来说,其R、G、B值对应着材质对这些颜色光的反射比例。 所以,若某材料R=1,G=0.5,B=0,说明这种材质反射全部红光,一半的绿光, 不反射蓝光。换句话说,在OpenGL中,若光线的RGB值为(LR,LG,LB),材料的 RGB值为(MR.MG,MB),如果其他的反射影响可以忽略,那么最后进入人眼中光的 RGB值则为(LR×MR,LG×MG,LB×MB)。类似地,如果有两束光(R1,G1,B1)和(R2, G2,B2)进入人眼,OpenGL将它们合成为(R1+R2,G1+G2,B1+B2)

下面列出的是向场景中增加光照需要的步骤:

为所有物体的顶点定义法线向量。这些法线决定了物体相对于光源的方位。

创建、选择光源,并为光源定位。通过传递给函数glLight()以参数GL_POSITION

来指定光源的位置,并通过模型视图变换得到光源的最终位置。可以使用此函数在 场景中设置八个不同颜色的光源。此函数有三个参数,通过设置十个不同的参数, 可以得到不同的效果,如参数为GL_AMBIENT设置光源的环境光亮度,GL_DIFFUSE 对应光源的散射光亮度等。定义了期望的光源特征之后,便可以使用参数 GL_LIGHTING调用函数g]Enable(),让OpenGL开始执行光照计算。

创建并选择光照模型,定义全局环境光的等级、观察点的有效位置(用于光照

计算)和正面和背面是否采取相同光照计算。函数g1LightModel()描述了光照模型 西南交通大学本科毕业设计(论文) 第50页 的参数。 为场景中的物体定义材料属性。一种物体的材质属性决定了它如何反射光线, 也由此决定了该物体表现出来的材质属性。函数glMaterial()指定用于执行光照计 算的当前材料属性。此函数可以通过设置七个不同的参数,得到不同的效果。如设 置材质的环境颜色、设置材质的散射颜色等。 本文中设置光照的代码如下: void CMyView::lm()

{

GLfloat lAmb[4]; GLfloat lDif[4];GLfloat lSpe[4];GLfloat lPos[4];//分别 定义了环境光、漫反射光、镜面反射光和光的位置的参数数组

GLfloat mAmb[4]; GLfloat mDif[4]; GLfloat mSpe[4]; GLfloat mEmi[4]; GLfloat mShininess;//分别定义了材质反射环境光、反射漫反射光、反射镜面 反射光、辐射光和光强度的参数数组 //对各个参数数组的初始化赋值

lAmb[0]=0.2f; lAmb[1]=0.2f;lAmb[2]=0.2f; lAmb[3]=0.1f; lDif[0]=0.2f; lDif[1]=0.2f;lDif[2]=0.2f; lDif[3]=1.0f; lSpe[0]=0.5f; lSpe[1]=0.5f;lSpe[2]=0.5f; lSpe[3]=1.0f;

lPos[0]=0.0f; lPos[1]=1000.0f;lPos[2]=-1000.0f; lPos[3]=0.0f; mAmb[0]=0.0f; mAmb[1]=0.0f;mAmb[2]=0.0f; mAmb[3]=1.0f; mDif[0]=0.0f; mDif[1]=0.0f;mDif[2]=0.0f; mDif[3]=1.0f; mSpe[0]=1.0f; mSpe[1]=1.0f;mSpe[2]=1.0f; mSpe[3]=1.0f; mEmi[0]=0.3f; mEmi[1]=0.3f;mEmi[2]=0.3f; mEmi[3]=1.0f; mShininess=6.80f;

//定义光照属性

glLightfv(GL_LIGHT1,GL_AMBIENT,lAmb);

glLightfv(GL_LIGHT1,GL_DIFFUSE,lDif);

西南交通大学本科毕业设计(论文) 第51页 glLightfv(GL_LIGHT1,GL_SPECULAR,lSpe); glLightfv(GL_LIGHT1,GL_POSITION,lPos); //定义材质属性

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mAmb); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mDif); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mSpe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,mEmi);

设置光照后的结果如图4-11所示:

图4-11 设置光照后仿真场景效果图 4.5

基于模型的视景仿真的实现 本节是实现基于模型的视景仿真系统的核心环节。系统中机械手

的运动应该受

到指定的控制模型的控制,控制模型的任何参数的改变都应该在视景仿真系统中得

到反应。本系统的初始目标是实现控制模型对系统中机械手模型的实时控制,这需 西南交通大学本科毕业设计(论文) 第52页 要完成Matlab和VC++的混合编程技术也就是建立一个Matlab和VC++的接口来实

现Matlab中的控制模型对OpenGL中的机械手模型运动的实时控制。但是由于时间 的限制,在本系统中未能实现这一技术。本文实现了通过控制模型生成的数据来控 制机械手模型的运动,相比前一技术缺乏实时性控制,但是却相应的扩大了应用范 围,因为本系统读入的数据没有模型的限制,可以读入任何模型导入的数据。 本系统实现的技术思路是首先获取控制模型导出的数据(这个数据可以以不同 的文件形式给出,本系统采用的是文本文件(TXT)的格式),然后将获取的数据以 数组的形式存储在计算机的内存里,在机械手模型运动的时候调用这些数据。 4.5.1 数据的读取 本系统采用的数据文件为TXT格式,文件中存储了每个时刻三个关节角的度数 值,读取实现思路是先定义一个数组结构体,然后读取数据并存进数组里。代码如 下:

//先定义一个结构体,存放角度值 typedef struct{ float rot1;//θ1

float rot2;//θ2 float rot3;//θ3

}HHand;

HHand hand[110];//存储各个时刻对应三个角度的值,可以根据时间步数改变 容量大小

然后我们要实现读取文件对话框的建立和数据文件的读取工作:首先我们要建 立读取菜单按钮:(1)选择页面Resource View,双击Menu文件夹中的IDR_MAINFRAME 工具栏显示图如图4-12所示。单击工具栏最右边的灰色图标,创建一个新的图标工 具。 西南交通大学本科毕业设计(论文) 第53页 图4-12 工具栏页面 选择新建的图标工具,选择菜单“查看”,在弹出的对话框中按图4-13所示进 行操作。

图4-13 工具栏属性页面 西南交通大学本科毕业设计(论文) 第54页 选择新建的图标工具,选择菜单“建立类向导”,在弹出的对话框中按图5-14 所示进行操

图4-14 工具栏命令向导页面 在生成的消息响应函数OnFileOpen1()添加代码完成读取文件对话框的显示和

数据的读取。代码如下:

void CMyView::OnFileOpen1() {

CFileDialog

dlg(TRUE,_T(\ |OFN_ALLOWMULTISELECT,_T(\建立打开对话框 if ( dlg.DoModal()!=IDOK ) { return; } CComboBox m_cFileList;

m_cFileList.AddString( dlg.GetPathName( ) ); //列表添加文件路径

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库毕业论文(10)在线全文阅读。

毕业论文(10).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/666516.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: