




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VR编程技术VR编程技术1VRToolkitsVRToolkits2虚拟现实编程工具包
是面向对象功能扩展库,帮助VR的开发者;支持各种VR中常见的I/O设备(开发者不用写驱动程序);允许输入CAD模型(节省时间)、编辑形状、指定对象的层次结构,碰撞检测和多层次的细节,遮荫和纹理,运行时间管理;具有内置网络功能,用于多用户交互。虚拟现实编程工具包3虚拟现实工具包可分为:是否基于文本或图形化编程;所使用的语言和软件库大小的类型;支持I/O设备的类型;提供绘制的类型;一般目的还是特殊应用;是否专有(更多的功能,更好地记录文档)或公共领域(免费,少量文档和功能)虚拟现实工具包可分为:4在九十年代的虚拟现实工具包
RenderWare(Cannon),VRT3/Superscape(DimensionLtd.),CyberspaceDeveloperKit(Autodesk),CosmoAuthoringTool(SGI/Platinum/CA),Rend386及其它;允许任何基于文本的编程:(RenderWare,CDKandRend386),或者图形编程:(SuperscapeandCosmo);独立于平台,一般并不需要图形加速硬件;往往用“低端”I/O设备(鼠标),并支持平面着色,以保证快速绘制。在九十年代的虚拟现实工具包5Rend386场景Rend386场景6本章讨论的VR软件工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用
yesC/C++3DGameStudio游戏引擎
yes
C++本章讨论的VR软件工具包名称应用专有语言库规模7场景图:是物体的一个分层组织(可见或不可见)在虚拟世界中(或“宇宙”);场景图用树状结构表示,节点用枝连接;可见物体用外部节点表示,称为叶子(他们有没有子女)。例如节点F,G,H,I内部节点表示转变(即适用于所有的子女)ABCEDJFGHI根节点内部节点外部节点场景图:ABCEDJFGHI根节点内部节点外部节点8手掌场景球场景图表明球是场景的孩子节点场景图不是静态的手掌场景球场景图表明球是场景的孩子节点场景图不是静态的9手掌场景球场景已经被修改,球现在是手掌的孩子VC6.1onbookCD手掌场景球场景已经被修改,球现在是手掌的孩子VC6.110建模阶段模型几何设置定义并连接传感器定义动作函数定义场景图定义网络建模阶段模型几何设置定义并连接传感器定义动作函数定义网络11实时循环开始仿真更新物体(从传感器和智能行为)绘制场景(图形,声音,触觉)读传感器数据退出仿真每一帧循环实时循环开始仿真更新物体绘制场景退出仿真每一帧循环12名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用
yesC/C++3DGameStudio游戏引擎
yes
C++本章讨论的VR软件工具包名称应用专有语言库规模Java313Java及Java3DJava面向对象的程序设计语言用于网络应用开发平台独立比C/C++慢
Java3D
Java类的层次,作为3D图形绘制和声音绘制系统的接口完美地集成了Java很强壮的面向对象的体系结构有利的3D图形应用程接口(API)Java及Java3D14Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D建模几何建立传感器定义行为网络15Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D建模几何建立传感器定义行为网络16Java3D几何:几何可以从各种文件格式导入(如.3DS,DXF,LWS,NFF,OBJ,VRT,VTK,WRL)能够作为图元产生(例如.sphere,cone,cylinder,…)用特定的类指定顶点、边、法向量、纹理坐标产生定制几何导入几何loader.load(“Hand.wrl")几何图元:newSphere(radius)定制几何:newGeometryArray(…)newLineArray(…)newQuadArray(…)newTriangleArray(…)Java3D几何:导入几何几何图元:定制几何:17Java3D物体外观:几何的外观用外观对象给定一个外观类对象存储有关材料(漫反射、镜面反射….diffuse,specular,shininess,opacity)和纹理Mat=newMaterial();Mat.setDiffuseColor(r,g,b);Mat.setAmbientColor(r,g,b);Mat.setSpecularColor(r,g,b);TexLd=newTextureLoader(“checkered.jpg”,...);Tex=TexLd.getTexture();Appr=newAppearance();Appr.setMaterial(Mat);Appr.setTexture(Text);Geom.setAppearance(Appr)Java3D物体外观:Mat=newMateria18Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D初始化建模几何建立传感器定义行为网络19Java3D节点类型:节点组叶子树枝组变换组选择背景行为雾光照3D形状Compilablesub-graphTransform+childnodesSelectwhichofthechildrenarevisible(usefulforLOD)Universebackground.CanbeacolororanimageActionstobeperformedbythesimulationFognodeLightnode.Specialderivedclasses:AmbientLight,PointLight,DirectionalLightGeometry+Appearance+BoundingBoxJava3D节点类型:节点组叶子树枝组变换组选择背景20Java3D场景图节点Java3D场景图节点21全局根正方体球手拇指食指中指无名指小拇指全局根正方体球手拇指食指中指无名指小拇指22SceneSc=loader.load(“Hand.wrl”);BranchGroupBg=Sc.getSceneGroup();RootNode.addChild(Bg);Java3D模型导入
SceneSc=loader.load(“Hand.wrl”);BranchGroupBg=Sc.getSceneGroup();Thumb=Bg.getChild(0);Index=Bg.getChild(1);Middle=Bg.getChild(2);Ring=Bg.getChild(3);Small=Bg.getChild(4);把模型加入场景的图中访问导入模型的子零件部分SceneSc=loader.load(“Hand.w23Palm=loader.load("Palm.wrl").getSceneGroup();ThumbProximal=loader.load("ThumbProximal.wrl").getSceneGroup();ThumbDistal=loader.load("ThumbDistal.wrl").getSceneGroup();IndexProximal=loader.load("IndexProximal.wrl").getSceneGroup();IndexMiddle=loader.load("IndexMiddle.wrl").getSceneGroup();IndexDistal=loader.load("IndexDistal.wrl").getSceneGroup();MiddleProximal=loader.load("MiddleProximal.wrl").getSceneGroup();MiddleMiddle=loader.load("MiddleMiddle.wrl").getSceneGroup();MiddleDistal=loader.load("MiddleDistal.wrl").getSceneGroup();RingProximal=loader.load("RingProximal.wrl").getSceneGroup();RingMiddle=loader.load("RingMiddle.wrl").getSceneGroup();RingDistal=loader.load("RingDistal.wrl").getSceneGroup();SmallProximal=loader.load("SmallProximal.wrl").getSceneGroup();SmallMiddle=loader.load("SmallMiddle.wrl").getSceneGroup();SmallDistal=loader.load("SmallDistal.wrl").getSceneGroup();Java3D虚拟手的导入:
Palm=loader.load("Palm.wrl")24Java3D虚拟手的层次:
Palm.addchild(ThumbProximal);ThumbProximal.addchild(ThumbDistal);Palm.addchild(IndexProximal);IndexProximal.addchild(IndexMiddle);IndexMiddle.addchild(IndexDistal);Palm.addchild(MiddleProximal);MiddleProximal.addchild(MiddleMiddle);MiddleMiddle.addchild(MiddleDistal);Palm.addchild(RingProximal);RingProximal.addchild(RingMiddle);RingMiddle.addchild(RingDistal);Palm.addchild(SmallProximal);SmallProximal.addchild(SmallMiddle);SmallMiddle.addchild(SmallDistal);Java3D虚拟手的层次:Palm.addchild(25Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D初始化建模几何建立传感器定义行为网络26Java3D中的输入设备:Java3D中默认的输入设备是鼠标和键盘;目前VR应用中集成其它的输入设备(位置传感器,跟踪球,游戏杆…)完全由开发者的需要而决定;通常驱动程用C/C++写,使用人员可以使用Java重写驱动程序,也可以使用JNI(JavaNativeInterface)来调用C/C++版本的驱动程。后者是更加需要的.Java3D提供很好的通用输入设备接口,可以用于集成传感器.然而,开发人员还是选择传统的方法.Java3D中的输入设备:27Java3D通用传感器接口classPhysicalEnvironment-存储全部输入设备和仿真中的传感器的信息classInputDevice–输入设备驱动程序接口classSensor–提供实时数据的对象类物理环境输入设备传感器一个输入设别能提供一个或多个传感器一个传感器不需要和一个输入设备关联(VRML类型传感器)Java3D通用传感器接口classPhysicalEn28Java3D初始化建模几何建立传感器启动场景定义场景图网络Java3D初始化建模几何建立传感器启动场景网络29Java3D–启动仿真
Java3D提供控制仿真的Behavior对象一个Behavior对象包含一些列仿真中接受的动作一个刺激由WakeupCondition对象发出
一些激活的类:
WakeupOnCollisionEntryWakeupOnCollisionExitWakeupOnCollisionMovementWakeupOnElapsedFramesWakeupOnElapsedTimeWakeupOnSensorEntryWakeupOnSensorExitWakeupOnViewPlatformEntryWakeupOnViewPlatformExitJava3D–启动仿真30Java3D–行为(Behavior)的使用WakeupOnElapsedFramesWup=newWakeupOnElapsedFrames(0);Bhv.wakeupOn(Wup);全局根节点我们定义一个行为Bhv,它按照1度旋转球;我们想让这个行为每一帧都被调用,以便球能够转动VC6.3onbookCDVC6.4onbookCDJava3D–行为(Behavior)的使用Wakeu31Java3D的View对象描述仿真中的图形显示,和用户位置(由跟踪器给出的)View模型提供了由ViewPlatform节点提供的虚拟世界和用于交互的I/O设备的分离;一些被跟踪的用户可以映射到虚拟世界的相同的位置;这对应几个Views和一个ViewPlatformJava3D的View对象描述仿真中的图形显示,和用户位32相反,一个用户能够控制几个ViewPlatforms;这些对应几个Views,因为ViewPlatform有自己的View;这样一个用户可以有几个Views与虚拟世界对应,它们之间可以通讯.Viewplatform1Viewplatform2相反,一个用户能够控制几个ViewPlatforms;V33Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D初始化建模几何建立传感器定义行为网络34Java3DsimulationJavaApplicationJava3DsimulationJavaAppletJava3DsimulationJavaApplicationJava3D–网络
Java3D不提供内置的网络虚拟环境的解决方案然而,它允许开发者集成使用Java提供的强大的网络特征Java3D应用程序能够像标准的应用程序一样运行。Java3DsimulationJavaAppletServerJava3DsimulationJavaApplicat35Java3D与VRMLVRML提供了在虚拟世界中定义对象并启动对象的可能图形用户接口(APIs),例如Java3D或WTK从VRML文件载入模型的静态信息,而忽略了传感器、路径和脚本等信息;Java3D与VRML36第6章虚拟现实的编程技术课件37Java3D和WTK的比较Java3d(版本1.3beta1)和WTK(Release9)之间的比较进行了研究;运行于双PentiumIII933MHzPC(Dell),512M字节内存RAM,Wildcat4110图形加速器,64M字节RAM;I/O接口是theRutgersMasterII力反馈手套;场景包括几个球(每个球420个多边形)和虚拟手(2,270个多边形);球绕任意轴不断地旋转,手或者是转动的,或者是有用户驱动的.Java3D和WTK的比较Java3d(版本1.3b38Java3D–WTK比较实验中用的图形场景Java3D–WTK比较实验中用的图形场景39Java3D与WTK比较
用于判断性能的仿真变量:图形模式(非立体的,立体的),绘制模式(线框,Gouraud,纹理);场景复杂度(多边形数目5,000–50,000);光照(光源数目1,5,10);交互(无交互,手输入,力反馈)Java3D与WTK比较40Java3D–WTK比较Java3d平均比WTK快,Java3D–WTK比较Java3d平均比WTK快,41Java3D–WTK比较Java3d版本3.1Beta1比WTKRelease9具有较小延迟Java3D–WTK比较Java3d版本3.1Be42但Java3d在场景绘制时间上变化较快但Java3d在场景绘制时间上变化较快43WTK不会偶尔出现峰值,不会出现偶尔的冻结WTK不会偶尔出现峰值,不会出现偶尔的冻结44本章讨论的VR工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用
yesC/C++3DGameStudio游戏引擎
yes
C++本章讨论的VR工具包名称应用专有语言库规模45Vizard特征:使用Python,它是可升级和跨平台的;它是面向对象的,很容易集成C/C++运行于Unix,Windows,Mac和其它平台;使用一个4-window“工作台”,允许变成人员写并执行代码,检查3Dmodels,拖放对象,发出命令同时绘制场景.脚本栈–当输入的时候,错误用高亮度标记交互窗口–输入命令资源窗口–文本列表3D窗口–开发每个物体Vizard特征:使用Python,它是可升级和跨平台的46Workbench的使用:图标菜单用鼠标开发场景导入物体Workbench的使用:图标菜单用鼠标开发场景导入物47importviz
importhand
viz.go()
#Identifythe5DTglove'sport.
PORT_5DT_USB=0
#Addthe5DTsensor
sensor=viz.add('5dt.dls')
#Createahandobjectfromthedataglove
glove=hand.add(sensor,hand.GLOVE_5DT)
#Placethehandinfrontoftheuser
glove.translate(0,1,5)
glove.rotate(180,-90,180)#nowwhenyourunthescriptthegloveshouldbemovingVizard虚拟手:
importviz
importhand
viz.go(48
importviz
viz.go()
logo=viz.add('logo.wrl')#addvizardlogoandplaceitinfrontofuserlogo.translate(0,2,4)
tex1=viz.add('gb_noise.jpg')#addtwotexturesthatwillthenbeappliedtothelogo#tex2=viz.add('brick.jpg')
logo.texture(tex1)#appliesthefirsttexturelogo.texture(tex2,'',1)#appliesthesecondtexturetothelogoblend=viz.add('multitexblend.fp')#indicatehowtoblendthetwotextureslogo.apply(blend)Vizard多纹理:
importviz
viz.go()
logo=49Vizard仿真服务器:多于一个用户存在同一个环境中,每个用户需要运行Vizard.Aftertheworldissetup当虚拟世界建立后,每个用户必须建立两个“mailboxes”.一个接收来自其它用户的信息。User2User1PositionisthepropertyBallistheobjectactioninformationVizard仿真服务器:User2User1Posit50Vizard网络举例:ImportvizViz.go()Ball=viz.add(‘ball.wrl’)#createaBallobjectthatiscontrolledbytheotheruser#addtheworldthatwillbedisplayedonyourcomputer#Useaprompttoasktheotheruserthenetworknameofhiscomputer.
target_machine=viz.input('Enterthenameoftheothermachine').upper()
#Addamailboxfromwhichtosendmessagestotheotheruser.Thisisyouroutbox.
target_mailbox=viz.add(viz.NETWORK,target_machine)#Addanidforthetimer.
BROADCAST=1
#Addthetimer.
defmytimer(num):
ifnum==BROADCAST:
#Retrieveyourcurrentposition.
position=viz.get(viz.HEAD_POS)
#Sendthedatatothetargetmailbox.Alltherecipientwillget
youryaw,xandzcoordinates.
target_mailbox.send(position[0],position[1],position[2])Vizard网络举例:Importviz51Vizard网络举例:#Thisfunctionwilldealwithincomingmessages.
defmynetwork(message):
#message[0]iswhosentthemessage,message[1]isadescriptionofwhathe
#sentandmessage[2]andgreaterarethemessagesthemselves.
x=message[2]
y=message[3]
z=message[4]
ball.translate(x,y,z)
#Callbackthenetworkfunctiontoawaitincomingmessages.
viz.callback(viz.NETWORK_EVENT,mynetwork)
#Callbackthetimer.
viz.callback(viz.TIMER_EVENT,mytimer)
#Startthetimer.
viz.starttimer(BROADCAST,0.01,-1)
Vizard网络举例:#Thisfunctionwill52本章讨论的VR工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用
yesC/C++3DGameStudio游戏引擎
yes
C++本章讨论的VR工具包名称应用专有语言库规模53PHANToM的GHOST软件包提供真实感的触觉交互;提供并使触觉交互更直观提供触觉交互的场景图,利用3D图形APIs提供触觉交互技术的扩展环境;与PHANTOM点触觉交互
;基于用户定义的力模型几何;对力反应的几何运动xyz(0,0,0)PHANToMDesktopmodelPHANToM的GHOST软件包提供真实感的触觉交互;54GHOST–应用交互xyz(0,0,0)应用处理触觉加工场景产生碰撞检测碰撞反映触觉状态更新结束触觉绘制触觉循环30fps场景绘制1000HzGHOST–应用交互xyz(0,0,0)应用处理触觉加55GHOST触觉场景图xyz(0,0,0)应用处理触觉加工场景产生碰撞检测碰撞反映触觉状态更新结束触觉绘制触觉循环30fps场景绘制1000HzGHOST触觉场景图xyz(0,0,0)应用处理触觉加工场56触觉场景图提供一种构造触觉场景的结构化方法,包括几何和动态的;自顶向下遍历(与WTK不同);每个节点只被遍历一次(每个子节点只有一个双亲节点)触觉场景图提供一种构造触觉场景的结构化方法,包括几何和动态57GHOST节点类3DsupportStaticNodesDynamicNodesUtilityClassesGHOST节点类3Dsupport58GHOST九个节点类GHOST九个节点类59GHOST九个节点类(continued)GHOST九个节点类(continued)60GHOST九个节点类(continued)GHOST九个节点类(continued)61场景图举例yxzHeadyxzLeftShoulderyxzRightShoulderyxzRightElbowyxzLeftElbowyxzTorsoyxzBody场景图举例yxzHeadyxzLeftShouldery62静态场景图–仅仅分离的和几何节点作为叶子静态场景图–仅仅分离的和几何节点作为叶子63GHOST代码举例:
#include<stdlib.h>#include<gstBasic.h>#include<gstSphere.h>#include<gstPHANToM.h>#include<gstSeparator.h>#include<gstScene.h>Main()gstScene*scene=newgstScene;gstSeparator*root=newgstSeparator;gstSphere*sphere=newgstSphere;Sptere->setRadius(20);gstPHANToM*phantom=newgstPHANToM(``PHANToMname``);Root->addChild(phantom);Root->addChild(sphere);Scene->setRoot(root);Scene->startServoLoop();While(!scene->getDoneServoLoop())//endapplicationbycallingscene->stopServoLoop();GHOST代码举例:#include<stdlib.64力计算和动力学xyz(0,0,0)应用处理触觉加工场景产生碰撞检测碰撞反映触觉状态更新结束触觉绘制触觉循环30fps场景绘制1000Hz力计算和动力学xyz(0,0,0)应用处理触觉加工场景产生碰65碰撞检测与反应场景图包含至少一个通过gstPHANToM表示的触觉接口的节点(一个触觉场景中有四个触觉接口);碰撞检测用gstShape节点进行;当碰撞检测存在时,gstPHANToM_SCP被加入到场景图中,这个节点应该加入到相同双亲的下面,作为gstPHANToM节点。碰撞检测与反应场景图包含至少一个通过gstPHANToM表66NormalForce(dependsonspringanddampercoefficients)FrictionForce(dependsonstaticanddynamicfrictioncoefficients)碰撞检测下,计算力;通过动态效果进行碰撞反应(活动节点,动态固体);如果必要通知应用系统(用户定义的).碰撞检测与反应NormalForce67动态节点
gstDynamic节点对于其下面的节点加上运动能力,在gstDynamic下面的子树表示一个物力的动态物体;由gstPHANToM节点与物体碰撞产生的力被加入到gstDynamic节点的状态之中;变换(旋转、平移)总是应用到gstDynamic节点;具有四个派生类:gstDial,gstButton,gstSlider和gstRigidBody.动态节点gstDynamic节点对于其下面的节点加上运动能68动态节点(continued)当一个gstDynamic节点改变状态时,一个调用用户定义的函数的事件产生.例如–如果gstButton从pressed状态变为released状态时,应用程序退出。gstButton行为举例动态节点(continued)当一个gstDynami69更新应用xyz(0,0,0)应用处理触觉加工场景产生碰撞检测碰撞反映触觉状态更新结束触觉绘制触觉循环30fps场景绘制1000Hz更新应用xyz(0,0,0)应用处理触觉加工场景产生碰撞检70图形及回调函数用户需要确定哪一个节点用回调函数,需要发送给回调函数的信息是什么。应用程序通过调用回调函数更新信息。这些节点具有调用返回的定义,并具有一个更新的状态,上次调用的updateGraphics将把他们的当前的状态拷贝到所定义的数据结构中。回调函数把来自GHOST触觉过程的场景触觉节点的信息传递给应用过程。例如,用户产生一个表示节点gstPHANToM当前位置的回调函数,在碰撞之后就应该改变回调gstPHANToM_SCP,这样用户可以看到物体上接触点的位置。图形及回调函数用户需要确定哪一个节点用回调函数,需要发送给71将用户映射到触觉场景中Phantom工作空间用户工作空间将用户映射到触觉场景中Phantom工作空间用户工作空72摄像机映射到PHANToM工作台CameraPhantomworkspacez-axisPhantomworkspaceCameraPhantomworkspacephantomSep变换MrotationphantomSep变换McameraphantomSep变换MzaxisOffset摄像机映射到PHANToM工作台CameraPhantom73缩放摄像机和PHANToM工作空间摄像机工作空间太大摄像机工作空间太小摄像机工作空间适当CameraPhantomworkspaceCameraPhantomworkspaceCameraPhantomworkspace缩放摄像机和PHANToM工作空间摄像机工作摄像机工作摄74缩放摄像机和PHANToM工作空间CameraDxmaxDphantomxmax规模因子依赖于从焦距到可视平截头体(frustum)的距离从非规模的PHANTOM工作空间中心到面的边缘的距离Dphantomxmax必须是确定的规模因子为Sfrustum=Dxmax/Dphantomxmax缩放摄像机和PHANToM工作空间CameraDxmax75缩放摄像机和PHANToM工作空间为了维持触觉的逼真度,gstShape节点的物理属性(柔性和阻尼)也需要进行同样的缩放;
SurfaceKspringnew=SurfaceKspringcurrent/Sfrustum
SurfaceKdampingnew=SurfaceKdampingcurrent/Sfrustum其中SurfaceKspring和SurfaceKdamping分别是gstShape的柔性参数和阻尼参数缩放摄像机和PHANToM工作空间为了维持触觉的逼真度76本章讨论的VR工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用yesC/C++3DGameStudio游戏引擎
yes
C++本章讨论的VR工具包名称应用专有语言库规模77BDIPeopleShop/DI-Guy特点提供了一种在实时场景中模拟人物的使用方法;是一种任务层次的变成环境,结合基于菜单的图形用户接口(GUI)任务映射到预先定义好的实时插值的关联运动之中;非常适合分布式交互仿真(DIS)。因为低带宽需求和预测;起初为军事而设计,现在用于民用,例如,事件回放、建筑漫游、仿真驱动、警察训练。BDIPeopleShop/DI-Guy特点提供了一种78连接的对象库,可以运行于SGI,IntelPCs,和其它平台;库具有实时动作引擎模块、图形显示模块、运动数据、3D图形模型、纹理和用于DIS的网络接口;运行于OpenGL,Direct3D,Sense8WTK,MakStealth和其它软件包;建议的硬件是Intel>200MHz,64MBRam,和图形加速器、(OpenGL,OpenGVSorDirect3D).BDIPeopleShop/DI-Guy特点-续连接的对象库,可以运行于SGI,IntelPCs,79PeopleShop初始化场景几何定义传感器定义行为定义人物路径定义网络PeopleShop场景几何定义传感器定义行为定义网络80PeopleShop初始化场景几何定义传感器定义行为定义人物路径定义网络PeopleShop场景几何定义传感器定义行为定义网络81PeopleShop人物具有54自由度(DOF),11连接点(links)的关节多边形结构;车也作为人物;不同人物具有不同的动作;每一种类型人物具有用户选择的外观(例如,人物的车可以是坦克或警车)人物使用纹理增加真实感,并减少多边形的数量。PeopleShop人物具有54自由度(DOF),182人物选择人物类型决定可以接受的动作(可以选择的菜单)人物选择人物类型决定可以接受的动作(可以选择的菜单)83外观选择Bob_shortsJoe_blueBridget_skirtDiane_teen人物外观(可选的菜单)外观选择Bob_shorts84BDI软件包Characterlevel-of-detailsegmentationbasedondistancetovirtualcameraimprovesreal-timeperformance(uptoabout100characterscanbeinascene)38polygons2500polygonsSupplementalbdi.DI-Guy-LOD.mpgBDI软件包Characterlevel-of-deta85PeopleShop初始化场景几何定义传感器定义行为定义人物路径定义网络PeopleShop场景几何定义传感器定义行为定义网络86PeopleShop指定路径路径途中点SlopeAdjuster初始路径扩展路径加入的途中点PeopleShop指定路径路径途中点Slope初始87BDI软件包ActionbeadEndbeadStackedactionbeadsLastactionbeadBDI软件包ActionEnd88编辑行为VC6.6onbookCD编辑行为VC6.689VC6.5onbookCDVC6.590PeopleShop初始化场景几何定义传感器定义行为定义人物路径定义网络PeopleShop场景几何定义传感器定义行为定义网络91BDI软件包传感器边缘当士兵进入到传感器区域时,系统会发现察觉-这会触发士兵B向A开枪SoldierASoldierBBDI软件包传感器边缘当士兵进入到传感器区域时,系统会发现92PeopleShop传感器传感器是用户定义的体,在其中当人进入时被发觉(PeopleShopUser’sManual)SensorboundarySupplementalbdi.farmhouse.mpgPeopleShop传感器传感器是用户定义的体,在其中当人93PeopleShop初始化场景几何定义传感器定义行为定义人物路径定义网络PeopleShop场景几何定义传感器定义行为定义网络94PeopleShop行为
行为可以反射(基于传感器接收的信号);行为也可以用决策键(decisionbeads)给出;决策键(decisionbeads)可以放置在人物的路径上(红颜色);决策键(decisionbeads)的两个参数是距离distance和长度length;距离distance表明从决策键起始点的距离;长度length表明决策键活动区的起始点距离决策可以转换为脚本script:PeopleShop行为行为可以反射(基于传感器接收95BDI软件包决策语句(IF/THEN/ELSE)BDI软件包决策语句(IF/THEN/ELSE)96PeopleShop实时性PeolpeShop初始化交互训练沉浸训练想定可视化用户用户用户PeopleShop实时性交互训练沉浸训练想定可视化用户97PeopleShop实时性PeolpeShop初始化交互训练沉浸训练想定可视化用户用户用户PeopleShop实时性交互训练沉浸训练想定可视化用户用98BDIPeopleShop软件包用户使用游戏杆或鼠标与仿真实时交互,菜单限制控制和沉浸VC6.7BDIPeopleShop软件包用户使用游戏杆或鼠标与仿99PeopleShop实时性PeolpeShop初始化交互训练沉浸训练想定可视化用户用户用户PeopleShop实时性交互训练沉浸训练想定可视化用户100BDIPeopleShop–实时模式用户使用跟踪器和传感器与仿真实时交互Omni-directionaltreadmillSensorizedweaponBDIPeopleShop–实时模式用户使用跟踪器和传101PeopleShop初始化场景几何定义传感器定义行为定义人物路径定义网络PeopleShop场景几何定义传感器定义行为定义网络102PeopleShop网络在DIS环境中修改人物的外形需要更高的带宽;车具有较小的自由度,而具有40个关节的人物以20Hz更新就需要800包/秒;人们仅仅在任务级(动作、位置、速度)上更新,而不更新每个节点。这样产生平滑仿真需要大约2包/秒;对于参与者数量多的仿真效果很好,例如军事训练;使用实况定位(livereckoning)和推算定位(deadreckoning)
PeopleShop网络在DIS环境中修改人物的外103BDI软件包用推算预测的DISBDI软件包用推算预测的DIS104BDI软件包使用实况定位的DIS人在循环中DI-GuymodelDI-Guymodel任务级的改变(动作,方向,速度)(fromKoechlingetal.,1997)BDI软件包使用实况定位的DIS人在循环中DI-Guy105PeopleShop“TopGun”(courtesyBostonDynamicsInc.)PeopleShop“TopGun”106本章讨论的VR工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用yesC/C++3DGameStudio游戏引擎yesC++本章讨论的VR工具包名称应用专有语言库规模1073DGameStudio人物使用A6游戏引擎,提供了简单的快速的编程构造虚拟世界的方法;一种任务级编程环境和基于菜单的图形接口(GUI)的结合,脚本编程更灵活;适合多用户仿真通过局域网(LANs)和广域网(WAN)(TCP/IP及UDP);最初为游戏设计,现在扩展为VR编程,性能好,价格可以接受($500)
3DGameStudio人物使用A6游戏引擎,提供1083DGameStudio人物3D引擎允许多用户(多个虚拟像机),建立在DirectX9图形流水线;具有剪切的优化;深入的通过几何LOD和纹理细节的优化;表面可以变形,物体可以是动态的人物动画通过骨骼框架表示。3DGameStudio人物3D引擎允许多用户(1093DGameStudio几何的产生我们可以导入大的模型库,或用另外的建模软件(3DStudioMax)建好的模型物体可以用WorldEditor(WED)3Deditor产生3DGameStudio几何的产生我们可以导入大的模1103DGameStudio纹理凸凹不平纹理光照映射和多纹理3DGameStudio纹理凸凹不平纹理光照映射和1113DGameStudio人物动画动画可以导入由Maya产生的,或者人物可以用modeleditor创建按照动作定义的帧3DGameStudio人物动画动画可以导入由May112物理与声音引擎具有碰撞检测功能,建立在多边形级别上,及物理行为重力、弹性和摩擦力
Cscript–C++的简单版本,用于产生物理行为,同过函数进行I/O编程(键盘、鼠标)静态、动态3D声音资源,可编程物理与声音引擎具有碰撞检测功能,建立在多边形级别上,及物理1133DGameStudio初始化3DGameStudio初始化1143DGameStudio初始化3DgameStudio游戏编程举例3DGameStudio初始化3DgameStudi1153DGameStudioOverview3DGameStudioOverview116PurposeQuickandeasycreationofinteractiverealtimeapplicationsSuitefor2Dand3Dmultimediaprojects,especiallycomputergamesPurposeQuickandeasycreation117Adevelopmentsystem3Dengine2DenginePhysicsengineLeveldesignModelandterraineditorsC-ScriptprogramminglanguageHugelibrariesof3DobjectsandartworkAdevelopmentsystem3Dengine118Whatcanbemade1stpersongames3rdpersongamesroleplayinggamesflightsimulatorssportsgamesvirtualrealityoranyother2Dor3DprojectyoucanimagineWhatcanbemade1stpersongam119用3DGameStudio开发的游戏用3DGameStudio开发的游戏120ComponentsLevel/WorldEditer–WEDObjects,Textures,Lights,Sounds…ModelEditer–MEDModel,TerrainScriptEditer–SEDC-ScriptComponentsLevel/WorldEditer121WorkflowandComponents
WorkflowandComponents122LevelEditer–WED
LevelEditer–WED123ModelEditer–MED
ModelEditer–MED124ScriptEditer–SED
ScriptEditer–SED125Demo-techdemo.wmpDemo-techdemo.wmp1263DGameStudioC-Script3DGameStudioC-Script127SyntaxSimilartoC/C++VeryLikeJavaScriptComment:/*----*///----Statementendedby“;”FunctionsandobjectsSyntaxSimilartoC/C++128VariablesOnlyonetype:varAsC/C++types:int,float,double,long,short,char,boolean...Syntax:varname;varname=number;Examples:vara;varb=1;varc=2.3;VariablesOnlyonetype:var129ArraySyntax:varname[n];varname[n]=value_1,value_2,...value_n;Example:vara[5]=0,10,20,30,40;ArraySyntax:130StringsSyntaxstringname; (variable
length)stringname[n]; (fixedlength)stringname="characters";stringname=<characters>;Examplestringhello="HelloWorld!";stringelements[10];StringsSyntax131Objectsentityfonttextsoundpanelbmapmaterial……Objectsentity132PointersPointersstorereferencestoobjectsorfunctionsentity*name;
entity*name=entity;string*name;
string*name=string;function*name;
function*name=function;PointersPointersstorerefere133FunctionsSyntax:functionname(parameter1,parameter2...);var=functionname(parameter1,parameter2...);Example:functionaverage(a,b)
{
return((a+b)/2);
}//iscalledthisway:
x=average(123,456);
FunctionsSyntax:134ControlLogicif-elseif(expression){instructions...}if(expression){instructions...} else{instructions...}if(((x+3)<9)||(y==0)){z=10;}
else{z=5;}whilewhile(expression){instructions...}while(x<100){x+=1;}ControlLogicif-else135EntityActionsCanbesetasbehaviorsofentitiesinWEDPropertiesentity.x entity.pan
entity.y entity.tilt
entity.z entity.rollExample:actionentity_rotate
{
while(1)
{
my.pan+=3;
wait(1); //wait1frame
}
}EntityActionsCanbesetasb136ScriptExample–DoorMakeadoorentityBuildalevelusingthedoorjustmadeAddascriptfileandopenitAddanaction“door1”Setdoor’sbehavioras“door1”CompileandrunScriptExample–DoorMakeado137FirstActionsounddoor_open=<door_op.wav>;sounddoor_close=<door_cl.wav>;actiondoor1{while(1){ent_playsound(my,door_open,66);while(my.pan<90){my.pan+=3*time;//rotatecounterclockwisewait(1);}sleep(1);ent_playsound(my,door_close,66);while(my.pan>0){my.pan-=3*time;//rotateclockwisewait(1);}sleep(1);}}FirstActionsounddoor_open=138InteractiveActionvarindicator=0;varmy_position[5];functionscan_me{my_position[0]=CAMERA.X;my_position[1]=CAMERA.Y;my_position[2]=CAMERA.Z;my_position[3]=CAMERA.PAN;my_position[4]=CAMERA.TILT;temp.PAN=120;temp.TILT=180;temp.Z=300;//scanrange-300Quantsindicator=1;//ScantoopenthedoorSCAN_ENTITY(my_position,temp);}ON_SPACE=scan_me;InteractiveActionvarindicato139InteractiveActionfunctiondoor_event{if(indicator!=1){return;}//mustberightkindofscanif(my.pan<90)//ifdoorwasclosed,openit{ent_playsound(MY,door_open,66);while(my.pan<90){my.pan+=3*TIME;//rotateclockwisewait(1);}my.pan=90;}
InteractiveActionfunctiondoo140else//otherwisecloseit{ent_playsound(MY,door_close,66);while(my.pan>0){my.pan-=3*TIME;//rotatecounterclockwisewait(1);}my.pan=0;}}actiondoor2{my.event=door_event;my.enable_scan=on;//makedoorsensitiveforscanning}else//otherwisecloseit141
VR编程技术VR编程技术142VRToolkitsVRToolkits143虚拟现实编程工具包
是面向对象功能扩展库,帮助VR的开发者;支持各种VR中常见的I/O设备(开发者不用写驱动程序);允许输入CAD模型(节省时间)、编辑形状、指定对象的层次结构,碰撞检测和多层次的细节,遮荫和纹理,运行时间管理;具有内置网络功能,用于多用户交互。虚拟现实编程工具包144虚拟现实工具包可分为:是否基于文本或图形化编程;所使用的语言和软件库大小的类型;支持I/O设备的类型;提供绘制的类型;一般目的还是特殊应用;是否专有(更多的功能,更好地记录文档)或公共领域(免费,少量文档和功能)虚拟现实工具包可分为:145在九十年代的虚拟现实工具包
RenderWare(Cannon),VRT3/Superscape(DimensionLtd.),CyberspaceDeveloperKit(Autodesk),CosmoAuthoringTool(SGI/Platinum/CA),Rend386及其它;允许任何基于文本的编程:(RenderWare,CDKandRend386),或者图形编程:(SuperscapeandCosmo);独立于平台,一般并不需要图形加速硬件;往往用“低端”I/O设备(鼠标),并支持平面着色,以保证快速绘制。在九十年代的虚拟现实工具包146Rend386场景Rend386场景147本章讨论的VR软件工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用
yesC/C++3DGameStudio游戏引擎
yes
C++本章讨论的VR软件工具包名称应用专有语言库规模148场景图:是物体的一个分层组织(可见或不可见)在虚拟世界中(或“宇宙”);场景图用树状结构表示,节点用枝连接;可见物体用外部节点表示,称为叶子(他们有没有子女)。例如节点F,G,H,I内部节点表示转变(即适用于所有的子女)ABCEDJFGHI根节点内部节点外部节点场景图:ABCEDJFGHI根节点内部节点外部节点149手掌场景球场景图表明球是场景的孩子节点场景图不是静态的手掌场景球场景图表明球是场景的孩子节点场景图不是静态的150手掌场景球场景已经被修改,球现在是手掌的孩子VC6.1onbookCD手掌场景球场景已经被修改,球现在是手掌的孩子VC6.1151建模
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代林业水土保持保障体系及保证措施
- 智慧城市建设工期进度计划及保证措施
- 学校实验室安全资金使用预算计划
- 人教版小学一年级数学上册同步教学计划
- 隧道电气工程施工方案与应急技术措施
- 水利工程主要施工机具与劳动力配备计划
- 2025年中国录音设备市场调查研究及行业投资潜力预测报告
- 口腔门诊业务总经理职责说明
- 2025年春季统编版四年级语文写作培优辅差计划
- 2025年中国流量阻尼器行业市场运行现状及投资战略研究报告
- 钢结构工程施工安全要点
- 停呼等三原则培训课件
- 水库安全管理防汛应急预案
- MT/T 1212-2024煤矿信息综合承载网通用技术规范
- 青年人才专项答辩模板
- 2025年6月四川高中学业水平合格考生物试卷真题(含答案详解)
- 2025年云南省中考英语试卷真题(含标准答案及解析)
- 留疆战士考试题库及答案
- 夏季高温作业安全生产专题知识培训课件
- 上海闵行区小学教师招聘教师资格证《教育心理学》考试模拟试卷及答案
- (完整版)A4作文格纸可直接打印使用
评论
0/150
提交评论