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