虚拟现实与仿真实验报告.docx

上传人:b****8 文档编号:9520723 上传时间:2023-02-05 格式:DOCX 页数:30 大小:1.73MB
下载 相关 举报
虚拟现实与仿真实验报告.docx_第1页
第1页 / 共30页
虚拟现实与仿真实验报告.docx_第2页
第2页 / 共30页
虚拟现实与仿真实验报告.docx_第3页
第3页 / 共30页
虚拟现实与仿真实验报告.docx_第4页
第4页 / 共30页
虚拟现实与仿真实验报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

虚拟现实与仿真实验报告.docx

《虚拟现实与仿真实验报告.docx》由会员分享,可在线阅读,更多相关《虚拟现实与仿真实验报告.docx(30页珍藏版)》请在冰豆网上搜索。

虚拟现实与仿真实验报告.docx

虚拟现实与仿真实验报告

 

合肥工业大学

计算机与信息学院

实验报告

 

课程:

虚拟现实与仿真技术

专业班级:

计算机科学与技术11-2班

学号:

20112497

姓名:

谢云飞

实验一

一.实验名称

从3Dmax8中导出mesh并添加mesh到场景。

二.实验过程或实验程序(增加的代码及代码注解)

2.1启动3Dmax

1.在安装有3Dmax8的计算机上,可以使用两种不同的方法来启动3Dmax8:

(1)在桌面上双击“3Dmax8”图标

(2)点击“开始”菜单,在“程序”中的选择“3Dmax8”

2.观察3Dmax8主窗口的布局。

3Dmax8主要由若干元素组成:

菜单栏、工具栏、以及停靠在右边的命令面板和底部的各种工具窗口

2.2使用3Dmax8建模并导出mesh

2.2.1导出mesh的步骤如下:

1.启动3Dmax8

2.在停靠在右边的命令面板中,点击几何体按钮

3.选择标准几何体

4.在对象类型中选择对象(如:

长方体),在“前”视口中,通过单击鼠标左键,创建出模型

5.在工具栏中单击“材质编辑器”按钮

,通过上步操作,可开启“材质编辑器”对话框

6.在“材质编辑器”对话框中,点击漫反射旁方形按钮

,进入到“材质/贴图浏览器”

7.在“材质/贴图浏览器”中选择位图,鼠标左键双击位图

8.弹出选择位图图像文件对话框,从本地电脑中选择一张图片

9.选择好图片,在材质编辑器对话框中,点击将材质指令给选定对象

10.点击菜单栏上的oFusion按钮

,在弹出的菜单栏中选择ExportScene

11.选择文件夹并输入文件名qiu,点击保存,在弹出的对话框中勾选CopyTextures,点击Export按钮,此时mesh文件已成功导出

2.3导出的mesh文件放入到指定位置

1.找到mesh文件,把mesh文件放到当前电脑的OgreSDK的models中,以我的电脑为例,OgerSDK放在C盘中

2.打开C盘,找到OgreSDK,打开OgreSDK,找到media,打开media文件夹,找到models,打开models文件夹,将mesh文件复制到此文件夹中

3.将导出mesh文件附带的材质文件qiu.material放到OgreSDK的scripts(C:

\OgreSDK\media\materials\scripts)中

4.将导出mesn文件时同时导出的图片放到OgreSDK的textures(C:

\OgreSDK\media\materials\textures)中

2.4mesh文件导入到场景中

2.4.1mesh文件导入到场景中步骤:

1.启动vs2008

2.在“文件”菜单中选择“打开”,然后单击“项目/解决方案”

3.找到项目MFCOgre1,选择MFCOgre1.sln,点击打开按钮

4.打开MFCOgre1View.h,创建节点变量,SceneNode*node1(MFCOgre1View.h中的第55行),创建实体变量Entity*ent1(MFCOgre1View.h中的第57行);

5.打开MFCOgre1View.cpp,在MFCOgre1View.cpp的构造函数中对创建的节点和实体对象初始化node1(NULL)、ent1(NULL)(在MFCOgre1View.cpp的第37行和第39行)

6.获取根节点的子节点,并将其赋值给节点node1(MFCOgre1View.cpp的第225行)

7.给创建的实体对象ent1赋值(MFCOgre1View.cpp的第224行)

8.设置节点的位置(MFCOgre1View.cpp的第226行)

9.将实体附在节点上(MFCOgre1View.cpp的第227行)

voidCMFCOgre1View:

:

CreateEntity(void)

{

ent1=m_pSceneManager->createEntity("Sphere","qiu.mesh");//获取实体对象,第一个参数是实体的名字,第二个参数是要导入的mesh文件

node1=m_pSceneManager->getRootSceneNode()->createChildSceneNode();//创建结点

node1->translate(Vector3(-20,0,30));//设置实体的位置

node1->attachObject(ent1);//将实体附在节点上

ent1->setMaterialName("Examples/Chrome1");//设置实体的材质

2.5生成项目

使用“生成项目”功能可以将程序的源代码文件编译为可执行的二进制文件,方法十分简单:

在“生成”菜单中选择“生成解决方案”。

在项目生成过程中,“输出”窗口会实时显示生成的进度和结果。

如果源代码中不包含语法错误,会在最后提示生成成功,如下图所示:

如果源代码中存在语法错误,“输出”窗口会输出相应的错误信息(包括错误所在文件的路径,错误在文件中的位置,以及错误原因),并在最后提示生成失败。

此时在“输出”窗口中双击错误信息所在的行,OSLab会使用源代码编辑器打开错误所在的文件,并自动定位到错误对应的代码行。

可以在源代码文件中故意输入一些错误的代码(例如删除一个代码行结尾的分号),然后再次生成项目,然后在“输出”窗口中双击错误信息来定位存在错误的代码行,将代码修改正确后再生成项目。

2.6执行项目

在MFCOgre1中选择“调试”菜单中的“开始执行(不调试)”,可以执行刚刚生成的程序,运行出实验要求的结果。

三.实验结果(包括必要的截图)

3dmax中创建实体球模型:

 

添加mesh到场景中后:

 

注释:

由于增加了九个球体,所以相应代码有所改变。

具体如下(两例,其它七个相同):

ent3=m_pSceneManager->createEntity("Sphere1","qiu.mesh");//获取实体对象,第一个参数是实体的名字,第二个参数是要导入的mesh文件

node3=m_pSceneManager->getRootSceneNode()->createChildSceneNode();//创建结点

node3->translate(Vector3(-20,20,30));//设置实体的位置

node3->attachObject(ent3);//将实体附在节点上

ent3->setMaterialName("Examples/Chrome1");//设置实体的材质

ent4=m_pSceneManager->createEntity("Sphere4","qiu.mesh");//获取实体对象,第一个参数是实体的名字,第二个参数是要导入的mesh文件

node4=m_pSceneManager->getRootSceneNode()->createChildSceneNode();//创建结点

node4->translate(Vector3(-20,40,30));//设置实体的位置

node4->attachObject(ent4);//将实体附在节点上

ent4->setMaterialName("Examples/Chrome1");//设置实体的材质

四.实验体会

通过此次试验,不但复习了3dmax模型的创建过程,我还知道了对模型的导出,以及添加到ogre模型库中,并能通过看代码,自己添加实体模型到场景中,更改模型的材质。

另外,我对orge也有了一定的了解,知道了在VS里面配置库目录,能够把场景转到orge里面展示。

这只是实验的开始,我希望随着后面的学习能够对其有进一步的掌握。

实验二

一.实验名称

键盘输入控制摄像机的移动。

二.实验过程或实验程序(增加的代码及代码注解)

2.1添加按键消息响应

1.在菜单栏中选择视图

2.点击视图,在弹出的菜单窗口中,选择类视图

3.在类视图中,选择类MFCOgre1View

4.再次选择菜单栏中的视图,在菜单的菜单窗口中,选择其他窗口

5.在其他窗口中,选择属性窗口

6.在属性窗口中,点击消息按钮

7.找到WM_KEYDOWN,添加OnKeyDown()消息响应函数

2.2在OnKeyDown()消息响应函数中,添加按键控制

1.找到MFCOgre1View.cpp的onKeyDown()(MFCOgre1View.cpp的第296行)

2.创建一个3维变量Vector3trans=Vector3:

:

ZERO;

3.使用switch语句,判断用户按下的按键

4.如果用户按下的是A键,将变量trans的x坐标减10,然后将摄像机移动到当前的trans坐标处(注:

按键消息获取的都是大写字母),则摄像机向左移动,代码如下:

case'A':

trans.x-=10;

m_pCamera->moveRelative(trans);

break;

5.如果用户按下的是D键,将变量trans的x坐标加10,然后将摄像机移动到当前的trans坐标处(注:

按键消息获取的都是大写字母),则摄像机向左移动

case‘D':

trans.x+=10;

m_pCamera->moveRelative(trans);

break;

6.实现其它移动和旋转的代码如下:

case'G':

trans.y-=10;

m_pCamera->moveRelative(trans);//向下移动

break;

case'T':

trans.y+=10;

m_pCamera->moveRelative(trans);//向上移动

case'W':

trans.z-=10;

m_pCamera->moveRelative(trans);//向前移动

break;

case'S':

trans.z+=10;

m_pCamera->moveRelative(trans);//向后移动

break;

case'M':

CreateAnimation("MyAnimation");//模型曲线移动

break;

case'Q':

*pdegree=0.1;

m_pCamera->yaw(*pdegree);//Y旋转

break;

case'E':

*pdegree=0.1;

m_pCamera->pitch(*pdegree);//X旋转

break;

case'R':

*pdegree=0.1;

m_pCamera->roll(*pdegree);//Z旋转

break;

2.3生成项目

使用“生成项目”功能可以将程序的源代码文件编译为可执行的二进制文件,方法十分简单:

在“生成”菜单中选择“生成解决方案”。

在项目生成过程中,“输出”窗口会实时显示生成的进度和结果。

如果源代码中不包含语法错误,会在最后提示生成成功,如下图所示:

如果源代码中存在语法错误,“输出”窗口会输出相应的错误信息(包括错误所在文件的路径,错误在文件中的位置,以及错误原因),并在最后提示生成失败。

此时在“输出”窗口中双击错误信息所在的行,OSLab会使用源代码编辑器打开错误所在的文件,并自动定位到错误对应的代码行。

可以在源代码文件中故意输入一些错误的代码(例如删除一个代码行结尾的分号),然后再次生成项目,然后在“输出”窗口中双击错误信息来定位存在错误的代码行,将代码修改正确后再生成项目。

2.4执行项目

在MFCOgre1中选择“调试”菜单中的“开始执行(不调试)”,可以执行刚刚生成的程序,运行出实验要求的结果

三.实验结果(包括必要的截图)

通过控制相应的按键。

可以按要求实现摄像机的视角的转变。

 

四.实验体会

本次实验主要是通过修改代码改变摄像机的视角,使之可以左右移动。

首先需要对其坐标的情况掌握,这是基础。

然后才能修改代码。

由于左右移动实现起来比较简单,后面又做了上下前后一起围绕三个坐标的旋转移动。

通过此次实验我对ogre以及其下的编程有了更进一步的把握,顿感收获颇丰。

实验三

一.实验名称

按下M键,控制实体球沿着一条直线运动。

二.实验过程或实验程序(增加的代码及代码注解)

2.1添加动画

1.在MFCOgreView1.h中创建voidCreateAnimation(Ogre:

:

StringMyAnimation);(MFCOgreView1中第77行)

2.创建一个全局变量AnimationState*as(MFCOgreView1.cpp中第17行)

3.实现voidCreateAnimation(Ogre:

:

StringMyAnimation);(MFCOgre1View.cpp中第319行)

4.判断动画是否存在,如果动画存在,删除已有的动画

5.使用sceneManager来创建一个animation,同时指定动画的名字和帧的长度

6.设置该段动画的关键帧间帧的插值方式,这里使用线性

7.使用animation创建为每个要驱动的node创建一个track,比如这里我们只想让一个结点(node,比如它上面挂着摄像机)运动,就只为他创建一个track就行了,第一个参数是这个track的编号

8.对于每个track创建它的每个关键帧

9.设置该帧的时间点

10.设置该帧处这个结点的位置和其他几何状态

11.设置动画运动状态

12.在项目解决方案资源管理器中,找到MFCOgre1

13.右击MFCOgre1,在弹出的界面中,选择添加类

14.选择MFC类,点击添加,在类名中输入MyFrameListener

15.在MyFrameListener.h中类MyFrameListener继承FrameListener

16.在MyFrameListener.h中添加virtualboolframeStarted(constFrameEvent&evt);(在MyFrameListener.h的第12行)

17.在MyFrameListener.cpp中重写frameStart()函数(在MyFrameListener.cpp第14行),代码如下:

boolMyFrameListener:

:

frameStarted(constFrameEvent&evt)

{

if(NULL!

=as)

{

as->addTime(evt.timeSinceLastFrame);

}

returntrue;

}

18.在MFCOgre1View.cpp的构造函数中创建关联监听类对象(m_pRoot->addFrameListener(newMyFrameListener());)(在MFCOgre1View.cpp第50行)

19.找到MFCOgre1View.cpp的onKeyDown()(MFCOgre1View.cpp的第296行)使用switch语句,判断用户按下的按键,代码如下:

case'M':

CreateAnimation("MyAnimation");

break;

2.2生成项目

使用“生成项目”功能可以将程序的源代码文件编译为可执行的二进制文件,方法十分简单:

在“生成”菜单中选择“生成解决方案”。

在项目生成过程中,“输出”窗口会实时显示生成的进度和结果。

如果源代码中不包含语法错误,会在最后提示生成成功,如下图所示:

如果源代码中存在语法错误,“输出”窗口会输出相应的错误信息(包括错误所在文件的路径,错误在文件中的位置,以及错误原因),并在最后提示生成失败。

此时在“输出”窗口中双击错误信息所在的行,OSLab会使用源代码编辑器打开错误所在的文件,并自动定位到错误对应的代码行。

可以在源代码文件中故意输入一些错误的代码(例如删除一个代码行结尾的分号),然后再次生成项目,然后在“输出”窗口中双击错误信息来定位存在错误的代码行,将代码修改正确后再生成项目。

2.3执行项目

在MFCOgre1中选择“调试”菜单中的“开始执行(不调试)”,可以执行刚刚生成的程序,运行出实验要求的结果

3.实验结果(包括必要的截图)

 

注释:

由于实现了曲线运动,所以相应代码如下,每个球的曲线运动轨迹相同,故只实现了下面的两个球体。

/*判断动画是否存在,如果动画存在,删除已有的动画*/

if(m_pSceneManager->hasAnimation(MyAnimation))

{

m_pSceneManager->destroyAnimation(MyAnimation);

}

//使用sceneManager来创建一个animation,同时指定动画的名字和帧的长度

Animation*pAni=m_pSceneManager->createAnimation(MyAnimation,Real(5));

//设置该段动画的关键帧间帧的插值方式,这里使用线性

pAni->setInterpolationMode(Animation:

:

IM_SPLINE);

/*使用animation创建为每个要驱动的node创建一个track,

比如这里我们只想让一个结点(node,比如它上面挂着摄像机)运动,

就只为他创建一个track就行了,第一个参数是这个track的编号*/

NodeAnimationTrack*pTrankOne=pAni->createNodeTrack(0,node1);

NodeAnimationTrack*pTrankOne1=pAni->createNodeTrack(1,node3);

//对于每个track创建它的每个关键帧

TransformKeyFrame*pKeyFrame=NULL;

TransformKeyFrame*pKeyFrame1=NULL;

//设置该帧的时间点

pKeyFrame=pTrankOne->createNodeKeyFrame(0);

pKeyFrame1=pTrankOne1->createNodeKeyFrame(0);

//设置该帧处这个结点的位置和其他几何状态

pKeyFrame->setTranslate(Vector3(-20,0,30));//起点坐标

pKeyFrame=pTrankOne->createNodeKeyFrame

(1);

pKeyFrame->setTranslate(Vector3(20,10,30));

pKeyFrame=pTrankOne->createNodeKeyFrame

(2);

pKeyFrame->setTranslate(Vector3(20,20,-30));

pKeyFrame=pTrankOne->createNodeKeyFrame(3);

pKeyFrame->setTranslate(Vector3(-20,30,30));

pKeyFrame=pTrankOne->createNodeKeyFrame(4);

pKeyFrame->setTranslate(Vector3(-20,0,30));//终点坐标

pKeyFrame1->setTranslate(Vector3(-20,20,30));//起点坐标

pKeyFrame1=pTrankOne1->createNodeKeyFrame

(1);

pKeyFrame1->setTranslate(Vector3(20,30,30));

pKeyFrame1=pTrankOne1->createNodeKeyFrame

(2);

pKeyFrame1->setTranslate(Vector3(20,40,-30));

pKeyFrame1=pTrankOne1->createNodeKeyFrame(3);

pKeyFrame1->setTranslate(Vector3(-20,50,30));

pKeyFrame1=pTrankOne1->createNodeKeyFrame(4);

pKeyFrame1->setTranslate(Vector3(-20,20,30));//终点坐标

4.实验体会

本次实验主要是控制模型的移动路线,由于要求直线运动比较简单,所以后面改成了曲线运动。

要知道的是,在ogre里面没有可以直接调用的曲线函数,所以只能通过折线运动来模拟曲线运动。

如上代码所示,起点和终点之间的点越多,运动越接近曲线。

实验四

1.实验名称

Pathfinder软件实验

2.实验过程或实验程序(增加的代码及代码注解)

●CreateGeometry

1.OntheViewmenu,clickUnitsandselectENtodisplaymeasurementsusingtheEnglishsystem.

Tospecifysnapgridspacing:

1.OntheViewmenu,clickEditSnapGrid....

2.IntheSpecifysnapgridspacingmenu,type2.0.Bydefault,lengthunitswillbeinfeet,however,youcantypeavaluefollowedbyaunit(e.g.:

"in"or"m")andthelengthwillbeconvertedtofeet.

3.ClickOK.

Todefinethedefaultfloorheight:

1.IntheFloorHeightbox(ontheaboveToolbar),type12.0.

Tocreatetheroom:

1.IntheViewtoolbar,clickTopView(

).

2.IntheToolstoolbar,clickAddaRectangularRoom(

).

3.IntheZPlanebox,type0.0.

4.Inthecoordinateboxesenterthefollowingvalues:

X1:

0.0,Y1:

0.0,X2:

60.0,Y2:

40.0.

5.ClickCreate.

Replicatetheroomtocreatethreefloors.

1.IntheViewtoolbar,clicktheSelectionToolicon

.

2.Selecttheroom.

3.IntheToolstoolbar,clicktheMoveObjectsicon

.

4.SelectCopyMode.

5.IntheCopiesboxtype2.

6.IntheMoveZbox,type12.0.

7.ClickCopy/Move.

8

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1