VR编程技术VRToolkits虚拟现实编程工具包是面向对象功能扩展库,帮助VR的开发者;支持各种VR中常见的I/O设备(开发者不用写驱动程序);允许输入CAD模型(节省时间)、编辑形状、指定对象的层次结构,碰撞检测和多层次的细节,遮荫和纹理,运行时间管理;具有内置网络功能,用于多用户交互。虚拟现实工具包可分为:是否基于文本或图形化编程;所使用的语言和软件库大小的类型;支持I/O设备的类型;提供绘制的类型;一般目的还是特殊应用;是否专有(更多的功能,更好地记录文档)或公共领域(免费,少量文档和功能)在九十年代的虚拟现实工具包•RenderWare(Cannon),VRT3/Superscape(DimensionLtd.),CyberspaceDeveloperKit(Autodesk),CosmoAuthoringTool(SGI/Platinum/CA),Rend386及其它;允许任何基于文本的编程:(RenderWare,CDKandRend386),或者图形编程:(SuperscapeandCosmo);独立于平台,一般并不需要图形加速硬件;往往用“低端”I/O设备(鼠标),并支持平面着色,以保证快速绘制。Rend386场景本章讨论的VR软件工具包名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用yesC/C++3DGameStudio游戏引擎yesC++场景图:是物体的一个分层组织(可见或不可见)在虚拟世界中(或“宇宙”);场景图用树状结构表示,节点用枝连接;可见物体用外部节点表示,称为叶子(他们有没有子女)。例如节点F,G,H,I内部节点表示转变(即适用于所有的子女)ABCEDJFGHI根节点内部节点外部节点手掌场景球场景图表明球是场景的孩子节点场景图不是静态的手掌场景球场景已经被修改,球现在是手掌的孩子VC6.1onbookCD建模阶段模型几何设置定义并连接传感器定义动作函数定义场景图定义网络实时循环开始仿真更新物体(从传感器和智能行为)绘制场景(图形,声音,触觉)读传感器数据退出仿真每一帧循环名称应用专有语言库规模Java3D(SunMicrosystems)一般应用no用C完成用Java编程19工具包,275类VizardToolkitandPeoplePak(WorldViz)一般应用扩展精灵yesOpenGL-basedPythonscriptinglanguageGHOST(SensAbleTechnologies)Phantom触觉yesC++PeopleShop(BostonDynamics)军事/民用yesC/C++3DGameStudio游戏引擎yesC++本章讨论的VR软件工具包Java及Java3DJava面向对象的程序设计语言用于网络应用开发平台独立比C/C++慢Java3DJava类的层次,作为3D图形绘制和声音绘制系统的接口完美地集成了Java很强壮的面向对象的体系结构有利的3D图形应用程接口(API)Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D初始化建模几何建立传感器定义行为定义场景图网络Java3D几何:几何可以从各种文件格式导入(如.3DS,DXF,LWS,NFF,OBJ,VRT,VTK,WRL)能够作为图元产生(例如.sphere,cone,cylinder,…)用特定的类指定顶点、边、法向量、纹理坐标产生定制几何导入几何loader.load(“Hand.wrl)几何图元:newSphere(radius)定制几何:newGeometryArray(…)newLineArray(…)newQuadArray(…)newTriangleArray(…)Java3D物体外观:几何的外观用外观对象给定一个外观类对象存储有关材料(漫反射、镜面反射….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初始化建模几何建立传感器定义行为定义场景图网络Java3D节点类型:节点组叶子树枝组变换组选择背景行为雾光照3D形状Compilablesub-graphTransform+childnodesSelectwhichofthechildrenarevisible(usefulforLOD)Universebackground.CanbeacolororanimageActionstobeperformedbythesimulationFognodeLightnode.Specialderivedclasses:AmbientLight,PointLight,DirectionalLightGeometry+Appearance+BoundingBoxJava3D场景图节点从文件调入物体Java3D默认支持Lightwave和Wavefront模型文件其它格式的载入器可以免费从下列网址下载:载入器把读入文件的内容加到场景图中,作为一个独立的物体.然而,它们提供了访问单独子部件的函数全局根正方体球手拇指食指中指无名指小拇指SceneSc=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);把模型加入场景的图中访问导入模型的子零件部分Palm=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虚拟手的导入:Java3D虚拟手的层次: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初始化建模几何建立传感器定义行为定义场景图网络Java3D中的输入设备:Java3D中默认的输入设备是鼠标和键盘;目前VR应用中集成其它的输入设备(位置传感器,跟踪球,游戏杆…)完全由开发者的需要而决定;通常驱动程用C/C++写,使用人员可以使用Java重写驱动程序,也可以使用JNI(JavaNativeInterface)来调用C/C++版本的驱动程。后者是更加需要的.Java3D提供很好的通用输入设备接口,可以用于集成传感器.然而,开发人员还是选择传统的方法.Java3D通用传感器接口classPhysicalEnvironment-存储全部输入设备和仿真中的传感器的信息classInputDevice–输入设备驱动程序接口classSensor–提供实时数据的对象类物理环境输入设备传感器一个输入设别能提供一个或多个传感器一个传感器不需要和一个输入设备关联(VRML类型传感器)Java3D初始化建模几何建立传感器启动场景定义场景图网络Java3D–启动仿真Java3D提供控制仿真的Behavior对象一个Behavior对象包含一些列仿真中接受的动作一个刺激由WakeupCondition对象发出一些激活的类:WakeupOnCollisionEntryWakeupOnCollisionExitWakeupOnCollisionMovementWakeupOnElapsedFramesWakeupOnElapsedTimeWakeupOnSensorEntryWakeupOnSensorExitWakeupOnViewPlatformEntryWakeupOnViewPlatformExitJava3D–行为(B