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

大学电脑作业:大学论文(50页)(8)

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

第四章

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); // 纹理和四边形的左上 glEnd();

... }

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

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

4.4.2 设置光照

置。首先让我们了解一下OpenGL中光照的知识。

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

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

28

第四章

完全反射,在另外的方向上则完全散射。大部分表面处于全反射与散射之间。OpenGL近似地将光线分解成红、绿、蓝三种成分。光源的颜色取决于它所发出的红、绿、蓝光的和。表面的材质特征则是由这个表面在各个方向反射的红、绿、蓝光的百分比决定。

虽然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()描述了光照模型的参数。

为场景中的物体定义材料属性。一种物体的材质属性决定了它如何反射光线,也由此决定了该物体表现出来的材质属性。函数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;//分别定义了材质反射环境光、反

29

第四章

射漫反射光、反射镜面反射光、辐射光和光强度的参数数组 //对各个参数数组的初始化赋值

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); 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 基于模型的视景仿真的实现

本节是实现基于模型的视景仿真系统的核心环节。系统中机械手的运动应该受到指定的控制模型的控制,控制模型的任何参数的改变都应该在视景仿真系统中得到反应。本系统的初始目标是实现控制模型对系统中机械手模型的实时控制,这需要完成Matlab

和VC++的混合编程技术也就是建立一个Matlab和VC++的接口来实现Matlab中的控制模型对OpenGL中的机械手模型运动的实时控制。但是由于时间的限制,在本系统中未能实现这一技术。本文实现了通过控制模型生成的数据来控制机械手模型的运动,

相比前一技术缺乏实时性控制,但是却相应的扩大了应用范围,因为本系统读入的数据没有模型的限制,可以读入任何模型导入

的数据。

本系统实现的技术思路是首先获取控制模型导出的数据(这个数据可以以不同的文件形式给出,本系统采用的是文本文件(TXT)

30

第四章

的格式),然后将获取的数据以数组的形式存储在计算机的内存里,在机械手模型运动的时候调用这些数据。

4.5.1 数据的读取

本系统采用的数据文件为TXT格式,文件中存储了每个时刻三个关节角的度数值,读取实现思路是先定义一个数组结构体,然后读取数据并存进数组里。代码如下: //先定义一个结构体,存放角度值 typedef struct{ float rot1;//

float rot2;// float rot3;//

}HHand;

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

然后我们要实现读取文件对话框的建立和数据文件的读取工作:首先我们要建立读取菜单按钮:(1)选择页面Resource View,双

击Menu文件夹中的IDR_MAINFRAME工具栏显示图如图4-12所示。单击工具栏最右边的灰色图标,创建一个新的图标工具。 图4-12 工具栏页面

选择新建的图标工具,选择菜单“查看”,在弹出的对话框中按图4-13所示进行操作。

图4-13 工具栏属性页面

选择新建的图标工具,选择菜单“建立类向导”,在弹出的对话框中按图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( ) ); //列表添加文件路径

ShellExecute(NULL, _T(\显示打开的文件 fp=fopen(dlg.GetPathName( ),\以读的方式打开所选择的数据文件 int i;

FILE *fp,*fw;//定义文件指针

31

第四章

for(i=0;i<101;i++) {

//fseek(fp,0L,1);

fscanf(fp,\读取 的值 fseek(fp,3L,1);//向后移动4个空格

fscanf(fp,\读取 的值 fseek(fp,3L,1);//向后移动4个空格

fscanf(fp,\读取 的值 fseek(fp,2L,1);//移到下一行开始处

}

fw=fopen(\以写的方式打开文件,若没有则新建一个

for(i=0;i<101;i++) { fprintf(fw,\将读入数组中的数据在文件中打印出来,检测是不是正确读取的数据

}

fclose(fp);//关闭文件指针

}

这样就将数据从文件中读入到数组中存储在计算机内存中以供下一步调用来控制机械手的运动。

4.5.2 利用读取的数据控制机械手的运动

首先我们要建立时间定时器的消息响应函数OnTimer(),并在OnCreate()里加入SetTimer(1, 20, NULL);设置时间定时器,在

OnDestroy()里加如KillTimer(1);关闭时间定时器。

然后我们要将实现用数组变量来控制机械手模型三个自由度的运动即腰部、大臂和小臂的转动。在前面的建模过程中我们已经将数组变量加入到控制模型变化的坐标变换当中来实现对机械手模型三个转动的控制,代码为: void CMyView::manipulator()

{ ...

glRotatef(hand[i].rot1,0.0,1.0,0.0);//实现对腰部转动的变量控制 ...

glRotatef(hand[i].rot2,0.0,0.0,1.0);//实现对大臂转动的变量控制

...

glRotatef(hand[i].rot3-hand[i].rot2,0.0,0.0,1.0);//实现对小臂转动的变量控制

32

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库大学电脑作业:大学论文(50页)(8)在线全文阅读。

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