版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告实验课名称:头盔、数据手套人机交互实验 院(系)名称xxx 学 号xxx 学生姓名xxx 联系电话xxx2014年 11月13日头盔、数据手套人机交互实验一、实验名称头盔、数据手套人机交互实验二、 实验内容1. 使用MultiGen Creator软件设计一个房屋模型,包括房屋主体结构的建立、颜色与材质的使用及添加纹理图案;2. 生成模型文件(.flt文件),并转化成.vt文件,最后在Vtree程序中导入;3. 搭建头盔、数据手套人机交互系统平台;4. 通过编程实现一套虚拟现实环境室内漫游虚拟手控制,从而理解虚拟现实,感受虚拟现实的基本特征(3I):沉浸感(Immersion)、交互性
2、(Interaction)、想象性(Imagination)。三、 实验设备实验中所使用的设备为三维交互设备包括:头盔立体显示器、数据手套、三维跟踪传感器、声音及系统集成设备、网络分频器和计算机等。1. 计算机:三台通用PC机2. 网络/通信设备:10/100M自适应网卡/交换机3. 监视器:两台通用PC机显示器4. 头盔式显示器,V6,LCD 双通道头盔显示器一个,全彩色,分辨率为 640*4805. 数据手套一只,右手,18个传感器,不带触觉与力反馈和手势识别6. 6自由度(DOF)运动跟踪传感器:Flock 六自由度电磁位置跟踪器一套。四、实验所用硬件及软件4.1 实验硬件系统的基本结构
3、如图1所示:图1 系统基本结构图如系统基本结构可知,实验中使用的硬件主要包括:三台通用PC机、网络/通信设备、监视器、头盔式显示器、数据手套一只和6自由度(DOF)运动跟踪传感器六大部分。PC1:中心控制计算机(服务器)PC2:左眼成像计算机(客户端1)PC3:右眼成像计算机(客户端2)三台计算机组成一个局域网,IP地址分别为192.168.0.13。监视器:两台通用PC机显示器。左右两台监视器的图像分别对应头盔左右两个通道。通过监视器可以在不带头盔的情况下,从外部监视图像的生成是否正确。头盔式显示器(Head Mount Display,简称HMD):Virtual Research V6,
4、LCD双通道头盔显示器一个,全彩色,分辨率为640×480。数据手套(Data Glove):Virtual Technologies公司的CyberGlove手套一只,右手,18个传感器,不带触觉、力反馈和手势识别,该手套用来测量右手18个关节的角度。6自由度(DOF)运动跟踪传感器:Ascension Technology 公司的 Flock of Birds六自由度电磁位置跟踪器一套,配有二个接收器,采用主从结构,其中装有发射器的一方为主,另一方为从。用一根RS232接口电缆从主接收器连接到中心控制计算机。各部分实物图如图2所示:图2 系统硬件实物图4.2 实验软件操作系统:M
5、icrosoft Windows 2000 Professional开发平台:1. MultiGen Creator用于建模(三维图像制作),OpenFlight数据格式是一种分层结构的景观描述数据库,生成的文件为*.flt 。2. CG2 VTreeÔ/OpenGLÔ,用于文件类型转换,模型处理等。3. Microsoft Visual C+用于运行所建模型,实现人机交互操作。4. 底层开发工具:Virtual Hand Suit。5. 自研VRLabHome、VRLabPiano、VRLabFit动态链接库。其中本次实验使用的主要开发工具为Multigen Creato
6、r三维建模软件系统,应用该软件设计制作房屋的三维模型,生成.flt文件,并转化为.vt文件,最终在Vtree程序中导入测试。Creator提供了非常强大的建模工具。通过平面图形、几何体等工具箱中的多边形绘制、圆的绘制、墙体、平移旋转等工具,制作出虚拟场景的基本几何模型。而且,考虑到整个系统的实时显示性能,保证虚拟现实系统的交互性,在保证模型基本框架的基础上,尽量减少多边形数量,优化模型结构。如图3所示,可以使用Creator的工具条、建模工具箱、菜单命令,在数据库窗口内完成创建模型、调整视图、编辑模型等多种操作。工具窗口的图表列于主窗口的左侧,通过点击可以打开工具窗口,并可以利用鼠标任意拖动到
7、屏幕上的任何位置。VTree的功能为:1、模型建立后,利用实时三维视景系统软件(VTree)使模型在已建立的场景中动起来,即在Visual C+ 6.0的界面上,使用VTree的语句实现;2、在Creator里面建立的虚拟模型,其输出格式为.flt,而在实时仿真软件VTree里面以及之后Visual C+中编程实现系统功能时候,所要用到的文件格式为.vt,所以需要通过VTree工具将所建立的模型文件.flt转换为.vt。图3 MultiGen Creator软件界面五、 实验目的及原理5.1 实验目的1. 通过在实验平台上的硬件设备和软件环境,学习头盔式显示器和数据手套的基本功能和基本工作原理
8、。2. 通过在实验平台上的硬件设备和软件环境,学习头盔式显示器和数据手套的基本功能和基本工作原理。3. 学习建模方法和建模步骤,并利用头盔显示器和数据手套及相关的其它硬件设备建立一个小型的虚拟现实环境。5.2 实验原理虚拟现实 (VR) 是一种可以创建和体验虚拟世界的计算机系统。虚拟环境是由计算机生成的,通过看、听、触觉等作用于用户,使之产生身临其境感觉的交互式视景仿真。虚拟现实(VR)具有三个最突出的特征,即三“ I ”特征:交互性、沉浸感、想象性。本实验是虚拟现实技术的一个应用实例,系统的原理图如图4所示:图4 系统原理图其中:1. FLOCK:通过RS232串口电缆将数据输入到中心控制计
9、算机(PC1)中进行处理;2. HUB集线器:网络连接设备,将三台计算机组成局域网,一发多收,主计算机发,左右眼计算机收,通过局域网将手的运动和姿态信息、位置信息以及两眼点的位置信息、视线方向信息发送给成像计算机PC2 、PC3;3. 分频器:将PC机的视频输出分给两个设备:显示器和头盔;4. 控制盒:将左眼计算机与右眼计算机的输出合成给头盔,将两幅略有差别的图像在头盔显示器中叠加后,便会产生立体的显示效果;5. 监视器:即计算机的显示器。原计算机输出直接给显示器,现在计算机输出给了分频器,由分频器再分别给显示器和控制盒;6. T发送机:发送电磁场信号;7. R接收机:头盔和手套上带有传感器,
10、感受头盔所在位置(图中虚线表示),接收机接收到的位置信号传给FLOCK,再传给主计算机,由主计算机进行计算;8. FBB(Fast Bird Bus),Flock-of-Bird(简称Flock):电磁运动跟踪系统之间连接线,是一种串口数据传送;9. 头盔:位于头盔显示器顶部和数据手套腕部的运动跟踪传感器测量头部和手部的位置与姿态;10. 手套:数据手套测量手部各关节的姿态。系统由3台通用计算机(PC1,PC2,PC3)和相应的VR设备组成。计算机通过基于TCP/IP协议的100 M HUB相连。PC1(服务器)为中心控制计算机,主要完成数据手套和6自由度运动跟踪传感器信号的采集、计算,网络数
11、据的管理,头盔显示器的双眼同步等任务。两台成像计算机PC2 、PC3分别完成左、右眼三维图像的实时生成任务,并将生成的视频信号输出到头盔显示器。头盔显示器顶部和数据手套腕部的运动跟踪传感器测量头部和手部的位置与姿态,数据手套测量手部各关节的姿态;数据手套连接传感器和头盔显示器分别连接接收器,都通过RS232电缆将数据输入到中心控制计算机中进行处理。然后,通过局域网将头部与手的2个传感器的位置及角度信息、手掌及各关节的角度信息发送给两台成像计算机。2台成像计算机分别根据这些信息生成左右眼的显示画面以及虚拟手的图像,传送给双通道头盔显示器并显示出来。六、 实验具体步骤6.1头盔、数据手套人机交互系
12、统平台搭建1、将传感器1固定于数据手套的腕部(测量手的位置姿态信息),与从接收器相连。将传感器2固定于头盔显示器的顶部(测量头部的位置姿态信息),与主接收器相连。将发射器置于实验者前方1米距离内,其电缆线方向背离实验者,发射器信号的有效范围约为以发射器中心为球心,半径为0.91米的球体空间。主从接收器通过FBB线连接,主接收器通过RS232串口线与计算机PC1串口COM1连接。2、连接数据手套线路,将其RS232串口线与计算机PC1串口COM2连接(传送手套各关节角度信息)。3、连接头盔线路,通过两个分频器分别将左眼显示器与计算机PC2显示器对应,右眼与计算机PC3显示器对应。4、通过Wind
13、ows 2000网上邻居属性或ipconfig命令查看各台计算机IP设置,再通过网上邻居或ping命令检验三台计算机是否正常连接。方法如下:开始->程序->附件->命令提示符, 这时屏幕显示为:5、开通各设备电源,在计算机PC1运行VRServer.exe程序,在PC2和PC3各自运行VRClient.exe程序,若一切正常,则可看到虚拟现实实验的完整实现,戴上头盔和数据手套,体验虚拟现实的震撼效果。若不正常,检验以上各步骤,直到正确。6.2 房屋模型建立6.2.1 定制数据库参数(1) 新建一个名为Farm.flt的文件,拖动窗口分割栏将窗口分为透视视图和模型结构视图两部分
14、。(2) 设置默认数据单位为英尺(feet),打开视图面板,根据需要设置栅格显示状态。(3) 在模型结构视图中,将g2节点设为当前父节点,重命名为House,如图5所示。图5 定制数据库参数6.2.2 建立地基(1) 选择体模式为当前建模模式。(2) 打开面工具箱选择矩形工具,以(-15,-13)和(+16,+10)作为两个参数点建造地基的地面,如图6所示:图6 使用矩形工具建造地基的地面(3) 打开体工具箱选择柱体工具,将底面沿Z轴方向提升1.3单位长,如图7所示:图7 使用柱体工具提升底面6.2.3 检查模型结构视图中的数据组织结构(1) 在模型结构视图中,此时House节点下有一个体节点
15、,将其改名为Foundation。(2) 将House节点设为当前父节点,打开创建工具箱,选择创建组节点工具,在House节点下新建一个组节点,命名为Walls,如图8所示:图8 创建新的主节点6.2.4 建造房屋的墙壁(1) 重新定位跟踪面将Walls设为当前父节点,使用视图面板中的以面定位跟踪面工具(FAC),将跟踪面定位到地基的表面上,如图9所示,再使用以点定位跟踪面工具(VTX),把跟踪面栅格中心点调整到地基表面的左下角,如图10所示。图9 使用以面定位跟踪面工具定位跟踪面图10 使用以点定位跟踪面工具调整跟踪面栅格中心位置(2) 绘制墙壁的底面使用多边形工具绘制墙壁的底面,各点坐标为
16、(0,4),(14,4),(14,9),(31,9),(31,23),(0,23)。(3) 提升墙体选中刚刚绘制的底面,使用主体工具提升12各单位长,如图11所示。图11 提升墙体6.2.5 对屋顶建模(1) 创建山墙在Face模式下,选中墙的侧面,使用点工具箱里的中心点工具,标出侧面的中心,如图12所示,然后使用FAC工具把跟踪面定位到侧面墙上,并使用CTR工具将跟踪面的的栅格中心定位到侧面的中心,再使用多边形工具绘制出山墙的轮廓,如图13所示。图12 定位侧面墙的中心点图13 绘制山墙轮廓(2) 做另一侧的山墙通过复制的形式,将上一步绘制好的山墙轮廓复制到墙的另一个侧面,复制后,还需要翻转
17、面的朝向。(3) 创建正面的山墙重复(1)创建山墙的过程,创建正面的山墙,如图14所示。图14 创建正面的山墙(4) 提升山墙创建了三个山墙后,使用跟踪面偏移工具和投影工具将三个山墙提升到相同的高度,首先设置当前建模模式为点模式,单击视图面板的XY按钮,将跟踪面恢复到XY平面,然后设置跟踪面在Z方向上的偏移量为20个单位长,再选中三个山墙的上顶点,打开体工具箱选择投影工具,是选中的点都投影到跟踪面上,即三个山墙具有相同的高度,如图15所示。图15 使用投影工具提升山墙到同一高度6.2.6 制作屋顶(1) 将House节点设为当前父节点,打开创建工具箱,选择创建组节点工具,创建一个新的组节点,并
18、命名为Roof。(2) 将跟踪面定位到侧面山墙上,使用多边形工具绘制屋顶的横截面。(3) 选中上一步绘制的截面,使用柱体工具进行拉伸,如图16所示。图16 制作屋顶横截面并拉伸(4) 将跟踪面定位到屋顶表面,在模型结构视图中选中构成屋顶的所有多边形,打开调整工具箱选择缩放工具,使屋顶两边伸出一个单位长,形成屋顶的外悬效果。(5) 创建正面屋顶的横截面,并向外拉伸一个单位长,然后使用缩放工具,沿Y轴将屋顶延长到房屋后面,如图17所示。(6) 使用FAC工具将跟踪面定位在较长的屋顶面上,打开体修改工具箱选择切割工具,沿着跟踪面将Y轴方向的屋顶分为两部分,然后删除不需要的部分。图17 延长正面屋顶(
19、7) 删除轮廓点将当前模式改为点(Vertex)模式,选择红色轮廓点,使用Edit/Clear Construction菜单命令删除,删除后选择面模式。6.2.7 制作门窗(1) 制作子面在透视视图中,以FAC工具定位正面的墙上,再以CTR工具将栅格中心置于墙的左下角,然后选择绿色为当前面颜色,将正面的墙设为当前父节点,使用矩形工具创建一个窗户面(子面),两个参数点为(4,2),(9,5)。(2) 把窗户嵌入墙中首先选择父面,然后选择Edit/Cut Subfaces菜单命令,就可以取消父面和子面的结构,即将窗户嵌入墙中。(3) 按上述方法,制作剩下的窗户和门。6.2.8 制作走廊(1) 将跟
20、踪面定位于地基的上表面,并将栅格中心定位于地基上表面的左下角,将House节点设为当前父节点,创建一个名为Porch的新组,再将其设为当前父节点,将建模模式改为体模式。(2) 选择红色作为当前主色,用矩形工具绘制一个正方形,两点坐标分别为(0,0)和(1,0)。(3) 使用柱体工具将廊柱提升8单位长,然后复制三个廊柱,调整好位置,如图18所示。图18 创建廊柱(4) 将跟踪面定位到廊柱顶端面上,绘制走廊顶的截面,拉伸一个单位长,如图19所示。图19 创建走廊顶6.2.9 制作烟囱(1) 设置House节点为当前父节点,创建一个名为Chimney的新组,设置当前建模模式为体模式,把跟踪面定位到X
21、Z坐标平面上。(2) 将Chimney节点设为当前父节点,使用多边形工具绘制出半个烟囱截面的轮廓,如图20所示。图20 半个烟囱的截面(3) 在体工具箱中选择回转体工具,以烟囱的中心线为轴,输入回转角度360°,设置Steps为4,结果如图21所示,再删除上一步所创建的面。图21 使用回转体工具制作烟囱(4) 将跟踪面定位于XY坐标平面,使用调整工具箱中的绕点旋转工具,绕烟囱的下底面中心旋转45°,调整烟囱的位置。(5) 将跟踪面定位于较长的屋顶上,选择整个烟囱,打开体修改工具箱选择植入工具(Plant),将烟囱放置在屋顶上,如图22所示。图22 使用植入工具将烟囱于屋顶连
22、为一体6.2.10 优化模型结构最后给模型添加颜色、材质和纹理。添加颜色时,点击快捷键“Current Primary Color”选择相应的颜色,然后在模型中选择要改变颜色的区域,选择“Edit/Insert Color”即可;添加材质时,点击快捷键“Current Material”选择相应的材质,然后在模型中选择要改变颜色的模块,选择“Edit/Insert Material”即可;纹理的添加过程比较繁琐,首先要准备好纹理图案,本实验中使用的图案格式为.jpeg格式;然后点击快捷键“Current Texture”,在弹出的对话框中双击黑色区域或者选择菜单“File/Read Patte
23、rn”,并在接下来的打开对话框中选择之前准备好的图片,点击“打开”按钮;最后选择要插入的纹理图案,并将其插入到对应的位置即可。最终的效果图如图23所示。图23 房屋模型效果图6.3 建立虚拟场景(在客户端PC2或PC3进行)此部分建立进行虚拟现实人-机交互实验的场景,用到的类vrScene,vrScene类可以从外部文件加载场景,并对场景进行设置,如位置、灯光、观察场景的方向等。(1) 模型文件的建立,运行Multigen Creator,打开Farm.flt文件,观察房间及灯罩模型,查看坐标原点位置,实验的场景将基于这个模型。(2) 运行VTree中的OpenFlight2VTree应用程序
24、,将上述home.flt、lampshade.flt文件转换为home.vt、lampshade.vt文件,这个文件格式适用于我们的软件编程,以便在VC+下调用。(3) 启动Visual C+6.0,使用AppWizard新建一个基于单文档的MFC AppWizard工程(在此假设该工程命名为MyVr),建立过程中请选中Windows Sockets,方便以后进行网络编程。将以下文件添加到此工程所在目录下:Farm.vt、1.wav、VRLabHome.dll、VRLabHome.lib、VRLab_Home.h。为了使用VRLabHome.dll动态链接库,对工程做以下设置:打开Projec
25、t Settings对话框(通过菜单Project/Settings),选择C/C+标签页:1) 在C/C+标签页的Category下拉菜单中选择general,在Preprocessor definition中原来基础上添加VTREE_INC_ALL;2) 在C/C+标签页的Category的下拉菜单中选择C+ Language,选中RTTI;3) 在C/C+标签页的Category的下拉菜单中选择Preprocessor,在Additional include directories中添加*cg2vtree4include;选择Link标签页,在Category下拉菜单中选择general
26、,在Object/library modules中添加VTree.lib VRLabHome.lib;下拉菜单中选择input,在Additional library path中添加*cg2vtree4lib。(4) 利用Visual C+6.0的主菜单View中ClassWizard为CmyVrView视图类建立消息响应函数OnInitialUpdate(),为CmyVrApp应用程序类建立消息响应函数OnIdle(),客户端的所有软件编程都将在这两个函数中进行。(5) 初始化场景在OnInitialUpdate()函数中调用vrScene:InitScene()函数初始化场景类对象(假设对
27、象名为MyVrScene)。其函数原型如下:void InitScene(HWND m_vrhwnd);参数m_vrhwnd是建立场景所需要的窗口句柄,在此即这个应用程序的m_hWnd。(6) 加载场景在OnInitialUpdate()函数中调用vrScene:LoadFromFile()函数从*.vt文件加载场景。其函数原型如下:void LoadFromFile(CONST int Filenum,CONST char *Filename),第一个参数是要加载的文件个数,第二个参数是各个文件名。如:CONST char *filename1;filename0="Farm.vt
28、";myapp->MyvrScene.LoadFromFile(1,filename); /加载场景文件(7) 设置场景在OnInitialUpdate()函数中调用vrScene:SetScene()设置场景,其函数原型如下:virtual void SetScene(vtVector Pos);参数Pos为各文件对应的模型原点在世界坐标系中的位置,默认设置为将各模型放在世界坐标系原点。此函数中设置场景位置,还设置灯光等(若实验者自行设置,可重载此函数)。世界坐标系是一个右手坐标系,其X轴为沿屏幕水平向右,Y轴为沿屏幕垂直向上,Z轴则为垂直屏幕面向外指向用户。Pos设置方法如
29、下:vtVector vec2;vtSet(vec0,0.0f,0.0f,0.0f);vtSet(vec1,0.0f,0.0f,0.0f);函数vtSet详情请参看VTree Users Manual(PDF 格式)(8) 显示场景以上已经建立并设置了场景,下面将其显示出来。方法是在OnIdle()函数中添加语句:MyvrScene.vtreeApp->Window(0)->Render();/渲染MyvrScene.vtreeApp->Window(0)->Frame();/切换(9) 动态观察场景在OnIdle()中利用vrScene:LookFromTo()函数不
30、断改变观察位置和角度,达到动态观察场景的效果。此函数原型如下:void LookFromTo(const vtVector from,const vtVector to,const vtVector up);void LookFromTo(float fx, float fy, float fz, float tx, float ty, float tz, float ux, float uy, float uz);void LookFromTo(pos_head pos);观察位置在“from”,观察方向为“from”到“to”,观察者头顶方向为“up”。在此实验者可按一定的规律改变参数值,
31、在以后的实验中此参数将由传感器的数据获得。6.4数据采集及转换(在服务器PC1进行)此部分用到的类有vrGlove、vrTracker和结构体recdata。vrGlove为数据手套类,采集数据手套各关节角度信息;vrTracker为跟踪器类,采集头部和腕部位置及角度信息,并进行数据的格式转换;recdata定义如下:typedef struct float receiver144;float receiver244;recdata;此结构体存储vrTracker格式转换后两个传感器的数据。1)启动Visual C+6.0,使用AppWizard新建一个基于对话框的MFC AppWizard工
32、程(在此假设该工程命名为dlgserve),建立过程中请选中Windows Sockets,方便以后进行网络编程。对工程的设置与前相同,另外在Link标签页Object/library modules中添加libVHTCore.lib libVHTVClip.lib libVClip.lib libQHull.lib libdemoBase.liblibVHTDevice.lib libRegistry.lib vtidmCoreImp.lib user32.lib gdi32.lib libSolid.lib libVHTSolid.lib。运行Device Manager(*Virtual
33、HandSuiteApplicationsvtidmwinnt_386master.exe),以启动数据手套。2)利用Visual C+6.0的ClassWizard为CDlgservedlg类建立定时器消息响应函数OnTimer(),服务器的所有软件编程都将在这个函数与OnInitDialog()中进行。在OnInitDialog()中进行必要的初始化及对象创建工作,在OnTimer()中不断采集数据并进行数据转换。3)在OnInitDialog()中利用SetTimer()函数设定定时器的定时时间,通常做如下设置SetTimer(1,20,NULL);其中20为定时时间(单位ms),但其定
34、时精度为30毫秒,即OnTimer()函数每30毫秒运行一次。关于SetTimer()函数的详细使用请参看MSDN。4)采集数据手套各关节数据。在OnTimer()中利用vrGlove:GeJointAngle()采集手套各关节欧拉角数据。其函数原型如下:void GetJointAngle()函数采集到的数据存储于vrGlove成员变量double joint6 4。5)启动跟踪器。由于Flock of Birds需要计算机通过串口发送命令字对其进行必要的设置及启动,因此在OnInitDialog()中利用vrTracker:TrackerStart()函数初始化设置并启动跟踪器。其函数原型
35、为:BOOL TrackerStart();若初始化设置成功并正常启动则函数返回TRUE,同时vrTracker布尔型成员变量StrartFlag为TRUE;若失败则返回FALSE。6)采集传感器位置及角度数据,并进行格式转换。在OnTimer()中首先判断StrartFlag标志是否为TRUE,若为TRUE,则利用vrTracker:GetTrackerData()函数获得传感器数据,其函数原型如下:unsigned char* GetTrackerData();函数返回值为通过串口进入计算机的unsigned char数组bird50(其实质是二进制数据,对此实验者不必深究)。然后利用函数
36、vrTracker:DataConvert()对以上的unsigned char数组进行格式转换,转换结果为recdata型数据,其中receiver144存储头部传感器位置和角度数据,receiver244存储腕部传感器位置和角度数据。存储方式为4*4矩阵,关于其如何表达位置及角度数据请参看计算机图形学中关于齐次坐标变换知识。DataConvert()函数原型如下:recdata DataConvert(unsigned char* pridata)其参数为利用GetTrackerData()函数得到的数据,返回值为转换后的recdata型数据。此部分实验要求实验者编辑对话框用户界面,显示最
37、终的手套角度数据及跟踪器的4*4矩阵数据。6.5三台PC机进行网络传输(在服务器与客户端同时进行)此部分用到的类有vrServerSock(服务器方)、vrClientSocket(客户端)。VrServerSock继承自MFC中用于网络编程的CSocket类,用来对客户端的连接请求进行侦听,并向客户端发送以上采集转换后的数据,同时接收客户端的反馈数据以对客户端成象进行同步控制。vrClientSocket类同样继承自MFC中用于网络编程的CSocket类,作用是连接服务器,并接收数据,同时向服务器提供数据已正常接收的反馈信息。1)服务器建立Socket。在服务器OnInitDialog()中
38、利用CSocket:Create()函数创建socket,并对连接请求进行侦听,通常方法为(假设头文件中已声明vrServerSock* mySock;):mySock=new vrServerSock;if(!mySock->Create(8000)AfxMessageBox("Creat Failed");mySock->Listen();其中8000为端口号,函数原型为BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = N
39、ULL );详细解释请参看MSDN。 vrServerSock类的成员变量ConnectNum存储连接个数,若侦听到连接请求,则ConnectNum>0,否则ConnectNum=0。2)在服务器OnTimer()中将以前得到的跟踪器和手套角度数据打包为socketdata型数据,用做网络传输,此结构体定义如下:typedef struct float receiver144;float receiver244;double angles6 4;socketdata;即将以前的数据合并到一起。3)服务器发送数据。在服务器OnTimer()中首先判断ConnectNum是否大于0,若是则表
40、明与客户端成像计算机建立了连接,于是利用vrServerSock:SendSocksData()发送数据,其函数原型如下:void SendSocksData(socketdata allmat);参数为2)中的socketdata型数据。4)客户端建立Socket,并接收数据。在客户端OnInitialUpdate()中利用CSocket:Create()函数创建socket,并用CAsyncSocket:Connect()连接服务器,通常方法如下(假设对象名为MySocket):MySocket.Create();MySocket.Connect("223.1.1.161&quo
41、t;,8000);其中"223.1.1.161"为服务器IP地址,由实验者所用服务器确定,8000为服务器的断口号,由1)中服务器socket决定。关于Create()和Connect()函数详细说明请参看MSDN。接收数据将由vrSocket类的vrSocket:OnReceive()函数通过MFC的消息映射机制自行完成,无须实验者调用。接收到的数据存储在成员变量sockall中,其结构为socketdata型。6.6虚拟人的实现(在客户端PC2或PC3进行)这部分将实现人在虚拟场景中漫游的功能,即当实验者带上头盔,在距离发射器约1米范围内活动时,实验者随着自己位置的变动
42、,将在虚拟的场景内体验到身临其境的感觉。方法是在客户端利用接收到的跟踪器数据不断更新观察场景的位置和方向。用到的类有vrScene类、vrHuman类。vrScene类前面已接触过,vrHuman类中包括传感器tracker、虚拟手hand,此类可以设置头部参数,如头顶跟踪器与眼睛的高度差、水平距离,跟踪器方向与视线方向的角度差,两只眼睛的瞳孔距离,并可通过实时更新数据将传感器数据转换为左眼或右眼相对应的数据。1)在OnInitialUpdate()中利用vrHuman:SetHMDPara()函数对头部参数进行设置,vrHuman的成员变量将存储这些设置,其函数原型为:void SetHMD
43、Para(vtFloat dist,vtFloat height,vtFloat away,vtFloat angle)第一个参数为瞳孔距离,第二个参数为头顶跟踪器与眼睛的高度差,第三个参数为头顶跟踪器与眼睛的水平距离,第四个参数为跟踪器方向与视线方向的角度差。前三个参数由实验者根据自己配带头盔的情况用卷尺测量(单位为米),第四个参数一般取-0.436(单位为弧度),若不用此函数进行设置,则默认值依次为0.066、0.07、0.07、0.175、-0.436(单位为米)。另外一种设置方式是利用vrHuman的构造函数直接设置。2)在左眼计算机PC2的OnIdle()中利用vrHuman:UpL
44、Humandata()函数更新数据,此函数利用以上的设置将传感器数据转换为左眼对应的数据。其函数原型为:void UpLHumandata(socketdata rec,vtGMatrix viewmat);第一个参数为从服务器接收到的数据,第二个参数为World-to-Eye矩阵。用法如下(设对象名为myhuman):myhuman.UpLHumandata(MySocket.sockall,MyvrScene.view->ViewMat();与上类似在右眼计算机PC3中利用vrHuman:UpRHumandata()函数做以上工作。3)在OnIdle()中利用vrScene:Look
45、FromTo()函数更新观察位置和角度,此函数前面已讲,不再赘述,只需注意在此将其参数设为myhuman.headpos。6.7虚拟手控制的实现(在客户端PC2或PC3进行)这部分将通过虚拟手按下开关,来对屋内的动态物体进行控制,包括门的开启与关闭、电扇的开启与关闭及速度控制、灯光的控制。其关键是进行碰撞检测并响应碰撞,这是虚拟现实的一个重要内容。方法是首先添加碰撞实体(即开关),然后将虚拟手加入到碰撞对象中(因为虚拟手要参与碰撞),并运行碰撞检测引擎,最后将含有虚拟手的碰撞对象加入到场景中,在检测到碰撞后运行场景中的动态物体。用到的类有vrCollision类、vrScene类、vrHuma
46、n类。后两个类前已介绍,vrCollision类作用是添加碰撞实体(如控制开关、钢琴键),添加手作为碰撞实体,进行碰撞检测,启动碰撞引擎。1)添加用于碰撞的实体在OnInitialUpdate()中利用vrCollision:AddCollEntity()函数添加开关作为碰撞实体,其函数原型为virtual void AddCollEntity()。2)将虚拟手加入到碰撞环境在OnInitialUpdate()中利用vrCollision:AddHandToCol()函数将虚拟手加入到碰撞中。其函数原型为:void AddHandToCol(vhtHumanHand* hand);参数设为vr
47、Human类中的成员变量hand(虚拟手)。3)运行碰撞引擎在OnInitialUpdate()中利用vrCollision:RunColEngine()运行碰撞引擎,其函数原型为:virtual void RunColEngine()。4)将碰撞加入到场景中在OnInitialUpdate()中利用vrScene:AddAuxGroup()函数将以上得到的碰撞类的对象作为场景的辅助组加入到场景中来。其函数原型为:virtua void AddAuxGroup (void *aux);由于从一般化角度考虑,其参数被设计为void类型,因此需对碰撞类进行强制类型转换,如可用:MyvrScene.AddAuxGroup(void *)(& MyCollision)。5)碰撞检测在OnIdle()中利用vrC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- KIN1148-Standard-生命科学试剂-MCE
- T-CNEA 249.1-2024 核工业用锆及锆合金化学分析方法 第1部分:碳量的测定 高频燃烧红外吸收法
- 2026年坚持自己测试题及答案
- 2026年工商管理测试题及答案
- 2026年工程面试测试题及答案
- 2026年centos8测试题及答案
- 2026年心动网络测试题及答案
- 2026年如何弄心理测试题及答案
- 2026年临床血液检验测试题及答案
- 2026年米与厘米测试题及答案
- 2023-2024学年贵州省遵义市仁怀市年小升初总复习语文测试卷含答案
- 《光伏发电工程工程量清单计价规范》
- 湘潭大学运动控制系统试题库
- 2024届上海市华二附中物理高二下期末质量检测试题含解析
- 初二家长学堂讲座课件(怎样和青春期的孩子相处)
- 安全生产管理制度执行情况评估表
- 温州职业技术学院教师招聘考试真题2022
- 高速公路工程质量管理体系及保证措施
- GB/T 16753-1997硅酸盐建筑制品术语
- 著作权法-法律保护
- 压型金属板安装检验批质量验收记录
评论
0/150
提交评论