标题：java3d
Java3D简介
JAVA 3D从高层次为开发者提供对三维实体的创建、操纵和着色，使开发工作变得极为简单。同时，JAVA 3D的低级API是依赖于现有的三维图形系统的，如Direct 3D、OpenGL、QuickDraw 3D和XGL等，它可以帮助我们：
A. 生成简单或复杂的形体（也可以直接调用现有的三维形体） 
B. 使形体具有颜色、透明效果、贴图。 
C. 可以在三维环境中生成灯光、移动灯光。 
D. 可以具有行为（Behavior）的处理判断能力（键盘、鼠标、定时等） 
E. 可以生成雾、背景、声音等。 
F. 可以使形体变形、移动、生成三维动画。 
G. 可以编写非常复杂的应用程序，用于各种领域如VR
JAVA 3D的这种体系结构既可以使其开发的程序“到处运行”，又使其能充分利用系统的三维特性。就因为JAVA 3D拥有如此的强大的三维能力，使得它在网络世界，特别是在游戏中能大展姿彩。
JAVA3D功能应用
JAVA3D可用在三维动画、三维游戏、机械CAD等领域。 可以用来编写三维形体，但和 VRML不同，JAVA3D没有基本形体，不过我们可以利用JAVA3D所带的UTILITY生成一些基本形体如立方体、球、圆锥等，我们也可以直接调用一些软件如ALIAS、LIGHTWARE、3DS MAX生成的形体，也可以直接调用VRML2.0生成的形体。 
可以和VRML一样，使形体带有颜色、贴图。  
可以产生形体的运动、变化，动态地改变观测点的位置及视角。  
可以具有交互作用，如点击形体时会使程序发出一个信号从而产生一定的变化。  
可以充分利用JAVA语言的强大功能，编写出复杂的三维应用程序。  
JAVA3D具有VRML所没有的形体碰撞检查功能。  
作为一个高级的三维图形编程API，JAVA3D给我们带来了极大的方便，它包含了VRML2.0所提供的所有功能。
GL4Java、VRML、JAVA3D的比较
由于 OPENGL的跨平台特性，许多人利用OPENGL编写三维应用程序，不过对于一个非计算专业的人员来说，利用OPENGL编写出复杂的三维应用程序是比较困难的，且不说C/C++语言和java的掌握需要花费大量时间精力，当我们需要处理复杂问题的时候，我们不得不自己完成大量非常繁琐的工作。当然，对于编程高手来说，OPENGL是他们发挥才能的非常好的工具。 
VRML2.0(VRML97)自1997年12月正式成为国际标准之后，在网络上得到了广泛的应用，编写VRML程序非常方法（VRML语言可以说比BASIC、JAVASCRIPT等语言还要简单），同时可以编写三维动画片、三维游戏、用于计算机辅助教学，因而其应用前景非常广阔尤其适合在中国推广应用。不过由于VRML语言功能目前还不是很强（如目前没有形体之间的碰撞检查功能），与JAVA语言等其它高级语言的连接较难掌握，因而失去了一些计算机高手的宠爱。但我们认为，我们可以让大学里的文理科学生利用VRML编写多媒体应用程序，让学生很快地对编写程序感兴趣，从而使国内的计算机水平得到提高。DIRECT3D是Microsoft公司推出的三维图形编程API，它主要应用于三维游戏的编程，目前相关的学习资料难于获得，由于它一般需要VC等编程工具进行编程，需要编程人员具有较高的C++等高级语言的编程功底，因而难以普及。 
JAVA3D是建立在 JAVA2（JAVA1.2)基础之上的，JAVA语言的简单性使JAVA3D的推广有了可能。OPENGL和JAVA3D之间的比较可以看成汇编语言与 C语言之间的比较，一个是低级的，一个是高级的（也许这样比较不太恰当）。JAVA3D给我们编写三维应用程序提供了一个非常完善的API，它可以帮助我们： 
生成简单或复杂的形体（也可以直接调用现有的三维形体）  
使形体具有颜色、透明效果、贴图。  
可以在三维环境中生成灯光、移动灯光。  
可以具有行为（Behavior）的处理判断能力（键盘、鼠标、定时等）  
可以生成雾、背景、声音等。  
可以使形体变形、移动、生成三维动画。  
可以编写非常复杂的应用程序，用于各种领域如VR。
Java3D总体介绍
引　言
Java3DAPI是用来开发三维图形和开发基于Web的3D应用程序(applet)的编程接口.目前用于开发三维图形软件的3DAPI(OpenGL、Direct3D)都是基于摄像机模型的思想,即通过调整摄像机的参数来控制场景中的显示对象,而Java3D则提出了一种新的基于视平台的视模型和输入设备模型的技术实现方案,即通过改变视平台的位置、方向来浏览整个虚拟场景.它不仅提供了建造和操作三维几何物体的高层构造函数,而且利用这些构造函数还可以建造复杂程度各异的虚拟场景,这些虚拟场景大到宇宙天体,小到微观粒子.
Java3D是JavaMediaAPIs中的一部分,可广泛地应用于各种平台,而且用Java3DAPI开发的应用程序和基于Web的3D小应用程序(applet),还可以访问整个Java类,且可以与Internet很好地集成,即如果在浏览器中安装了Java3D的浏览插件,在网上也可浏览Java3D所创建的虚拟场景.Java3DAPI还汲取了已有图形APIs的优点,即Java3D的底层图形构造函数不仅综合了底层APIs(Direcrt3D、OpenGL)最好的绘制思想,而且它的高层图形绘制还综合了基于场景图的思想,同时,它又引入了一些通用的图形环境所未考虑的新概念(如3D立体声),这样将有助于提高用户在虚拟场景的沉浸感.本文将着重介绍Java3D针对VR应用所提出的基于视模型和输入设备模型的新思想,在此基础上又讨论了如何利用Java3D来开发VR应用程序及其实现方法,并设计实现了一个应用实例.
1.适于VR应用开发的Java3DAPI众所周知,开发VR应用程序是一件很繁琐的工作,其开发人员必须编写应用程序可能遇到的各种输入和显示设备的接口程序,或者依赖专为VR应用开发而设计的应用程序编程接口(API),且典型的VR应用必须跟踪用户的头部位置和方向,以生成与头部位置方向相一致的虚拟场景图.
另外,还需要先跟踪身体的其它部位(手、臂或腿部),然后通过身体各部位在虚拟场景中的虚拟视点与场景中的对象进行交互,而应用程序也必须具有能够利用跟踪输入设备在视点内放置物体,并标明其在生成的三维图象中的位置和方向的功能.同时,面向VR的应用程序开发接口(API)必须能支持3D图形生成、处理跟踪器的输入,并能将跟踪信息反馈到图形绘制中.
Java3DAPI可自动将头部跟踪器的输入集成到图形生成中,并具有通过访问其它跟踪器信息来控制其它特征的功能,但它是通过一种新的视模型(viewmodel)技术来实现的.该视模型是将用户真实的物质环境与计算机生成的虚拟环境相互独立,并建立它们之间的通信桥梁.该API也明确定义了用来探测Java3D物体六自由度(6DOF)传感器的返回值,并将其应用于显示场景图中.总之,这种新的视模型和输入设备模型可以很方便地将交互式的3D图形应用程序转化为VR应用程序.
Java3D视模型
2.1　新的视模型概念(viewmodel)基于摄像机的视模型是模仿虚拟环境中的摄像机,而不是虚拟环境中人的“替身”,而且它是通过控制摄像机与视点的相关参数来控制所显示的场景,但这种方法,在用户物质环境确定某些视参数的系统中是不合理的,例如在头盔显示器(HMD)系统中,HMD的光学性能就直接确定了应用程序所显示的视域.由于不同的HMD有不同的光学特性,因此如果允许终端用户随意改变光学参数显然是不合理的.这里视参数的值将随终端用户物质环境的不同而不同,而影响视参数的主要因素有显示器大小、显示器的位置(戴在头上,还是放在桌子上)、三维空间中用户的头部位置、头盔显示器的实际显示视域、每英寸的显示象素等.由于Java3D的视模型直接提供了头部跟踪的功能,因而使用户产生了真实存在于虚拟环境中的错觉.
Java3D不仅提出了新的基于视平台的视模型概念,同时将其推广到包括显示设备和6DOF外围输入设备(如头部跟踪器等)的接口支持中,而且新的视模型继承了Java的“writeonce,vieweverywhere”本质.这意味着由Java3D视模型开发的应用程序或applet可广泛地应用于各种显示环境.这种显示环境可以是标准的计算机显示屏、多元显示空间,也可以是头盔显示器.Java3D视模型是通过将虚拟环境和物质环境完全独立的方式来实现上述功能的,且该视模型可将虚拟环境中视平台的位置、方向和大小,与Java3D绘制的与视平台位置、方向相一致的虚拟场景相区分.一般应用程序控制视平台的位置和方向,而绘制着色系统则依据终端用户的物质环境以及用户在物质环境中的位置和方向来确定显示场景.
2.2　视模型的组成
Java3D视模型由虚拟环境和物质环境两部分组成,其中,虚拟环境由ViewPlatform对象来表示,它是虚拟对象存在的空间;而物质环境则由View对象以及和它相关的对象来表示.这里,View对象和它的相关对象就描述了用户所处的显示和操纵输入设备环境.虽然视模型将虚拟环境和物质环境相互独立,但可通过一一对应关系来建立两种世界之间相互通信的桥梁,这样将使得终端用户的行为会影响虚拟环境中的对象,同时虚拟环境中的对象行为也会影响终端用户的视点.
Java3D可通过几个对象来定义视模型参数.这些对象包括View对象及其相关对象、PhysicalBody对象、Canvas3D对象、PhysicalEnvironment对象、Screen3D对象.视模型相关的对象(如图1所示)其作用如下:ViewPlatform用来标志场景图中视点位置的节点.其父节点则指明了视平台在虚拟环境中的位置、方向和大小.View用于指定需要处理场景图的信息.Canvas3D定义了Java3D绘制图象的窗口,它提供了Canvas3D在Screen3D对象中的大小、形状和位置信息.Screen3D用于描述显示屏幕的物理属性.PhysicalBody用于封装那些与物质体相关的参视模型的组成及其相互关系数(如左、右眼的位置等).PhysicalEnvironment用于封装那些与物质体环境相关的参数(如,用于头状物体或头盔式跟踪器的校验信息).
2.3　虚拟环境中的视平台(ViewPlatform)
鉴于视平台定义了一坐标系统,于是虚拟环境中的原始点和参考点就有了一参考坐标系.这里视平台代表与视对象相关的一个点,并充当确定绘制图象的基础.图2显示了包括视平台节点场景图的一部分.由图2可见,视平台的父节点确定了视平台在虚拟环境中的位置和方向.若通过修改与TransformGroup节点相关的Transform3D对象,就可以在虚拟场景中随意移动视平台.虽然虚拟环境中可以有许多不同的视平台,但特定的视对象只能与一个视平台相关联,于是在Canvas3D对象中所绘制的场景均来自于一个视平台的视点.这样应用程序就可通过修改视平台的TransformGroup节点,在虚拟环境中漫游.图2　包括视平台的局部场景图3　Java3D的输入设备模型Java3D除了支持通用的键盘、鼠标输入外,还能给各种不间断的输入设备,如6DOF跟踪设备和操纵杆提供支持.由于不同的跟踪输入设备其工作原理不同,因而计算机与其交互的方式也不同.为了给不同的6DOF输入设备提供支持,Java3D还提供了一个输入设备接口,而且该输入设备接口还定义了一个抽象的输入设备,虽然用其可以实现对一特定设备的驱动,但输入设备接口的实现必须实现接口所定义的所有方法(如设备开、关、读取操作、状态设置及查询等).Java3D的输入设备列表就用这些方法同特定的设备进行交互.
一般Java3D环境中,可能包括许多输入设备,而且这些输入设备不一定是实际的物理设备,也可能是虚拟设备,例如通过软件的方法将鼠标的运动参数转化为6DOF虚拟跟踪球的参数,来模拟虚拟跟踪球的输入.由于所有的输入设备都由许多传感器对象组成,因此每一种输入设备都与一定数量的传感器对象相关,且每一种传感器都与其传感器设备6DOF数据的一个数据源相关.当输入设备驱动的数据改变时,传感器对象的数据也会相应改变,而且传感器对象由读取传感器对象组成.由于缓冲区中记录了各传感器最近N个读取传感器对象的值,因此可以对传感器数据进行平均,以及对传感器输入值的趋势进行预测等处理,但应用程序的开发并不直接使用输入设备.Java3D是通过一个传感器数组将输入设备抽象化,传感器对象数组是物质环境对象的一个子类,该数组是由与输入设备相关的对象指针组成.Java程序可以直接从传感器数组中获取传感器的值,并将其用到场景图中,或按任意方式对其进行处理。
2.4　用Java3D开发VR应用程序利用
Java3D开发的VR应用程序或者applets程序,可建造一个虚拟场景,并能将一个或多个场景图插入到虚拟场景中,虚拟场景由超结构对象集组成,对象集则包括一个世界对象(Universeobject)、一个或多个场所对象(Localeobjects)和按树状结构排列的由节点物体组成的一个或多个场景图(Scenegraphs).该场景图又称为分枝图(Branchgraph),它包括绘制对象节点、光照节点、行为节点和声音节点等,其中,包含内容节点的分枝图称为内容分枝,包含视平台对象的分枝图称为视分枝,视平台对象用来确定用户的位置和方向.图3表示了具有多分枝图的Java3D场景.图3　应用程序场景图由于这种分枝图只描述了场景所要绘制的对象,并不确定对象的绘制次序,因此图中节点的次序和位置与对象的绘制次序无关,而图中的父节点和子节点的直线路径就唯一确定了子节点的图形范围.由于绘制次序的不确定性,因而使得Java3D能横越场景图的任何次序,且它能从左到右,从顶部到底部穿过场景图;或者从右到左,甚至并行遍历整个场景图.Java3D的分支图为树状结构,且图中的每一个节点只有一个父节点.这样通过辅助的场景图机制就可以实现通用场景图的共享,而且具有连接属性的叶节点可以连接到共享子图.分枝图中的节点分为群节点(groupnode)和叶节点(leafnode)两类,其中,群节点按照粘贴的原理来组织场景图单元。
群节点的层次结构图一般群节点包括:BranchGroup、TransformGroup、Switch、OrderGroup、DecalGroup和ShareGroup节点,其中,BranchGroup是分枝图的根节点;而TransformGroup用来指明所有子节点的位置和方向;Switch则用于实现一个或多个子图的转换;OrderGroup用于使它的子节点按照特定的次序绘制;DecalGroup是OrderGroup的一个子集;ShareGroup跟BranchGroup一样,是一个场景图的根节点.虽然共享图作为Java3D场景图的一部分从不直接出现,但是连接节点可以引用.另外群节点还可以包含各种子节点以及所包含对象的群节点或叶节点.这些子节点用一个关联索引属性来允许对特定的子节点进行操作.如果没有指明特定的顺序群节点,Java3D还可以按照任意指定的顺序来绘制群节点的子节点.虽然叶节点是场景图的抽象类,它没有子节点,但叶节点包括了Java3D的各种信息.叶节点由Shape3D、ViewPlatform、Sound、Light以及用户定义的行为节点等组成,Shape3D和ViewPlatform节点在Java3D的视模型和输入模型中扮演着重要的角色,因为它描述了图形系统的两个重要方面,其中,Shape3D描述了场景中对象的几何形状,而ViewPlatform则标定了用户或其视点在虚拟环境中的方向或位置.
另外,应用程序还可像操纵分枝图中的任意对象一样,来操纵ViewPlatform,而且应用程序还可平移、旋转和缩放ViewPlatform,即通过改变ViewPlatform的位置和方向,ViewPlatform将随同用户的视点一起移动,来浏览整个虚拟环境.虽然ViewPlatform是按照事先规定的路线浏览场景,但不会限制用户视点的移动和向不同方向浏览场景.
结语与展望
Java3D API的出现为Java在VR和Internet的应用和开发注入了新的活力,因为Java3D所提出的全新的基于视平台的视模型和输入设备模型技术,不仅可实现对头盔显示和多输入6DOF跟踪设备的支持,而且可针对不同的应用方便灵活地开发自己的VR应用系统,由于Java3D是基于Internet的软件开发平台,同时它能将图形功能与Internet很好地集成在一起,因此,利用它来开发基于网络的VR系统将会有巨大的潜力.可以预见,不久的将来,各种面向网络的VR应用(如电子商场、远程教学和远程医疗等)将会把人们带入复杂逼真的虚拟场景中.