利用Java3D实现三维图像
副标题#e#
Java3D用其本身界说的场景图和调查模式等技能结构了3D的上层布局,实现了在Java平台利用三维技能。本文在道理上着重先容Java3D特有的两个重要观念:场景图(Scene Graph)、调查模式(View Model)。在接口利用上的先容分为两部门:实例说明如何利用Java3D接口;说明如何将Java3D技能与Java原有的Web技能(JSP、Serverlet)相团结,在网页上实现三维显示。
1. 关于Java3D
1.1 Java3D简介
Java3D API是Sun界说的用于实现3D显示的接口。3D技能是底层的显示技能,Java3D提供了基于Java的上层接口。Java3D把OpenGL和DirectX这些底层技能包装在Java接口中。这种全新的设计使3D技能变得不再繁琐而且可以插手到J2SE、J2EE的整套架构,这些特性担保了Java3D技能强大的扩展性。
Java3D成立在JAVA2(JAVA1.2)基本之上,JAVA语言的简朴性使JAVA3D的推广有了大概。它实现了以下三维显示可以或许用到的成果:
生成简朴或巨大的形体(也可以挪用现有的三维形体)
使形体具有颜色、透明结果、贴图。
在三维情况中生成灯光、移动灯光。
具有行为的处理惩罚判定本领(键盘、鼠标、按时等)。
生成雾、配景、声音。
使形体变形、移动、生成三维动画。
编写很是巨大的应用措施,用于各类规模如VR(虚拟现实)。
J2SE在其尺度开拓包中并不提供Java3D的API,Java3D是一个独立的可选组件,可以单独下载。Java3D此刻(截至到2003年5月)提供的正式版本是1.3.0,可以在 http://java.sun.com/products/java-media/3D/download.html 下载该开拓东西包。
Java3D 1.3有7个差异的可下载版本:
Java3D for Windows(DirectX version)SDK for JDK(include Runtime);
Java3D for Windows(OpenGL version)SDK for JDK(include Runtime);
Java3D for Solaris/SPARC Runtime for JDK(include Runtime);
Java3D for Windows(DirectX version)Runtime for JRE;
Java3D for Windows(OpenGL version)Runtime for JRE;
Java3D for Solaris/SPARC SDK for JRE;
Java3D for Solaris Runtime 64 bit support;
个中前三个版本是开拓包。第4、5、6个版本是Java3D运行期支持措施包。最后一个是支持Solaris 64 bit操纵平台运行Java3D的措施包。前三个的开拓包包括了各自对应的运行期支持包。Java语言自己具有跨平台特性,无论利用上述哪个版本的开拓包,观念和实现代码城市保持完全一致。这里我们利用Java3D for Windows(OpenGL version)SDK for JDK(include Runtime);版本作为我们接头、实现Java3D的东西包。留意在安装此版本SDK前要担保下列情况:
Java 2 (Runtime or SDK) version 1.3.1 或更后的版本
OpenGL 1.1 或更后的版本,而且是Microsoft支持的显卡厂商
Windows NT 4.0 only: Service Pack 3 或更后的版本(Window2000、WindowXP)
#p#副标题#e#
1.2 Java3D与其他三维技能的较量
JAVA3D可应用在三维动画、三维游戏、机器CAD等多个规模。但作为三维显示实现技能,它并不是独一选择并且是一个新面目。在Java3D之前已经存在许多三维技能,这些三维技能在实现的技能、利用的语言以及合用的环境上各有差异,我们主要先容与Java3D又密切干系的三种技能:OpenGL、DIRECT3D、VRML
OpenGL是业界最为风行也是支持最遍及的一个底层3D技能,险些所有的显卡厂商都在底层实现了对OpenGL的支持和优化。OpenGL同时也界说了一系列接口用于编程实现三维应用措施,可是这些接口利用C(C++)语言实现而且很巨大。把握针对OpenGL的编程技能需要耗费大量时间精神。
DIRECT3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程。浩瀚优秀的三维游戏都是由这个接话柄现。与OpenGL一样,Direct3D的实现主要利用C++语言。
VRML2.0(VRML97)自1997年12月正式成为国际尺度之后,在网络上获得了遍及的应用,这是一种比BASIC、JAVASCRIPT等还要简朴的语言。剧本化的语句可以编写三维动画片、三维游戏、计较机三维帮助解说。它最大的优势在于可以嵌在网页中显示,但这种简朴的语言成果较弱(如今朝没有形体之间的碰撞查抄成果),与JAVA语言等其它高级语言的毗连较难把握,因而逐渐被沉没在竞争剧烈的网络三维技能中。
表1是Java3D与其它三维技能的较量图,可以从中直观的看出他们彼此间的区别:
技能 | 实现条理 | 开拓技能(难度) | 扩展性 | 最适合应用规模 |
Java3D | 中层(JVM) | Java(较易) | J2SE尺度扩展(好) | 网上三维显示实现… |
OpenGL | 底层(显卡) | C\C++(难) | 各大厂商支持(较好) | 三维设计软件… |
Direct3D | 底层(操纵系统) | C++(较难) | Windows平台(差) | 三维游戏… |
VRML | 上层(网页) | 标志语言(容易) | 安装插件支持(一般) | 网上虚拟现实… |
表1:3D技能对招表
2 Java3D的场景图布局
#p#分页标题#e#
Java3D实际上是Java语言在三维图形规模的扩展,与Java一样,Java3D有纯粹的面向工具布局。Java3D的数据布局回收的是Scene Graphs Structure(场景图),就是一些具有偏向性的差池称图形构成的树状布局(图1)。
我们在一个Java3D应用措施看到的传神三维场景从措施的角度看来,实际就是由Java3D界说的一系列的工具,这些工具不是混乱无序,工具之间也不是毫无干系。假如想让三维图像正常显示,必需在这两点上遵循Java3D场景图的划定。调查图1,Java3D场景图的树布局由各类百般的工具构成:
在图中呈现的这些工具都实现了Java3D中有重要的意义的类,从逻辑上我们将它们分为三类:
根节点(Root):Virtual Universe Object
节点(Node):Local Object、Branch Group Nodes、Behavior Node、Shape3D Node…
叶子节点(Leaf):Appearance、Geomery..
图1:在应用中的Java3D场景图
场景图中线和线的交汇点称为节点(Node),这些节点都是Java3D类的实例(Instance of Class),节点之间的线暗示各个实例之间的干系。
Virtual Universe是根节点,每一个场景图的Virtual Universe是独一的。
在Virtual Universe下面是Locale节点,每个措施可以有一个或多个Locale,但同时只能有一个Locale处于显示状态,就好象一个三维世界很是大,有许多个景点,但我们同时只能在一个景点举办调查。Java3D答允从一个Locale跳到另一个Locale,不外绝大大都措施只有一个Locale。
每一个Locale可以拥有多个BranchGroup节点。所有三维形体的其位置信息(Transform Group Nodes)都成立在BranchGroup节点之上。
TransformGroup Node用来设定Shape3D在Virtual Universe中的位置。
Spape3D Node是三维图形节点,这个节点的实体放映在最后的显示画面中,就是三维世界中的每个形体。包罗正方体、球体以及任何形状和外观的三维形体。
位于场景图最基层的是两个叶子节点:三维体的外观(Appearance)和几许信息(Geometry),这两个节点界说了一个三维体的显示结果。
View Platform位于图1的另一个分枝上,与前面所有描写三维体的性质的观念差异,View Platform和View都是用来界说调查者的信息。
上面所列的观念许多,可是对付成立一个简朴的Java3D措施,我们至少需要相识三个观念:虚拟宇宙(Virtual Universe)、场景(Locale)、坐标系统。
2.1 虚拟宇宙(Virtual Universe)
在Java3D中,虚拟宇宙被界说为团结一系列工具的三维空间。虚拟宇宙被用作最大的聚积体表示单元,同时也可被看作一个数据库。不管是在物理空间照旧逻辑内容,虚拟宇宙都可以很大。实际上在大大都环境下,一个虚拟宇宙就可以满意一个应用措施所有的需求。
虚拟宇宙是各自独立的个别,原因是在任何时候一个结点工具都不能在高出一个的虚拟宇宙中存在。同样的,在一个虚拟宇宙中的结点工具也不能在其他的虚拟宇宙中可见可能与其他的工具团结。
对付一个Java3D应用措施,必需界说一个虚拟宇宙才可以在这个"宇宙"中显示三维图像。
2.2 Java3D的坐标系统
默认环境下,Java3D的坐标系统是右旋的,用方位语义学来表明就是:正y偏向是当地重力的上,正x偏向是程度的右,正z是这对着调查者的偏向。默认的单元是米。
双精度浮点、单精度浮点甚至是定点来暗示的三维坐标都足够来暗示和显示富厚的3D场景。不幸的是,场景不是真实世界,更不必说整个宇宙了。假如利用单精度坐标,有大概呈现下列情景:
离原点仅有一百公里的间隔,被描画得相当量子化,所能到达的最好结果就是三分之一英寸,在实际应用中这样的精度比要求的粗拙的多。
假如要缩小到一个很小的尺寸(譬喻表示集成电路的巨细),甚至在离原点很近的处所就会呈现同坐标问题。
为了支持一个大型的连接虚拟宇宙,Java3D选择了有256位的高判别率坐标:
#p#分页标题#e#
Java3D高判别率坐标由三个256位的定点数构成,别离暗示x、y、z。定点被牢靠在第128位,而且值1.0被界说为真实的1米。这个坐标系统足够用来描写一个高出几百万光年间隔的宇宙,也可以界说小于一质子巨细(小于一普朗克长度)的工具。
在Java3D中,高判别率坐标仅仅用于将越发传统的浮点坐标系统嵌入更高判别率的底层系统。用这种要领,可以缔造出一个具有任意巨细和局限的在视觉上无缝的虚拟宇宙,并且可以不必担忧数字上的精度。(参看表2)
一个256位的定点数还具有可以或许直接暗示险些任何的公道适当的单精度浮点值。
Java3D用有标记的、两位补码的256位定点数字来暗示高分标率坐标。尽量Java3D保持内部高判别率坐标暗示的不透明,但用户用有八个整型变量的数组来暗示256位的坐标。Java3D把数组中从索引号由0到7别离看作高判别率坐标的从高到底位上的数。第128位上是二进制的小数点,也可以说在索引号为3和4的整数之间。高判别率坐标的1.0就是1米。
假如是"小"的虚拟宇宙(雷同于相比拟例的几百米),在虚拟宇宙工具下的(0.0,0.0,0.0)点成立一个带有高判别率坐标的Locale作为根节点就足够利用了;装入措施在装入进程中能自动构建结点,而在高判别率坐标下的点不需要任何外部文件的直接描写。
大一些的虚拟宇宙等候被构建为有如同计较机文件那样的条理,这意味着一个根宇宙要包括由外部文件引用的嵌入虚拟宇宙。就这样,文件引用的工具(用户指定的Java3D组或高判别率结点)界说了被读入现存虚拟宇宙的数据的位置。
Java 3D 高判别率坐标 | |
2n Meters | Units |
87.29 | Universe (20 billion light years) |
69.68 | Galaxy (100000 light years) |
53.07 | Light year |
43.43 | Solar system diameter |
23.60 | Earth diameter |
10.65 | Mile |
9.97 | Kilometer |
0.00 | Meter |
-19.93 | Micron |
-33.22 | Angstrom |
-115.57 | Planck length |
表2-1:Java 3D 高判别率坐标
2.3 场景(Locale)
为了支持大型虚拟宇宙,Java3D提出了"Locale"的观念。Locale把高判别率坐标作为发源。把高判别率坐标看作准确的定位,它在高判别率坐标的影响范畴之内利用精度较低的浮点坐标指定工具的位置。
一个Locale和与它团结的高判别率坐标一起构成了在虚拟宇宙之下的一个表示层。所有虚拟宇宙包括一个或多个高判别率Locale。而所有其他的工具都是附加在一个Locale上的。在整个别系中,高判别率坐标饰演的是上层的仅供翻译的转换结点。譬喻,附加到一个特定Locale的所有工具的坐标城市与这个Locale位置的高判别率坐标有关。(图2)
图2:高判别率坐标指定场景
假如一个虚拟宇宙与传统的计较机图像的观念临近,给定的虚拟宇宙大概会变得太大。所以在凡是环境下最好把一个场景图看作是一个高判别率坐标场景的子结点。
结构一个三维场景,措施员必需运行一个Java3D措施。这个Java3D应用措施必需首先建设一个虚拟宇宙工具而且至少把一个Locale工具附加之上。然后,构建出需要的场景图像,它由一个分支组结点开始而且包罗至少一个调查平台工具,而场景图就是附加于这个调查平台。当一个包括场景图的调查工具被附加于一个虚拟宇宙,Java3D的渲染轮回就开始事情。这样,场景就会和它的调查工具一起被绘制在画布上。
2.4 编程实现一个三维世界
这一部门描写奈何挪用VirtualUniverse、Locale和HiResCoord工具的编程接话柄现成立一个完整的"三维世界"。留意,这个三维世界有原点、坐标,是实现三维显示措施的第一步。
VirtualUniverse工具有下列结构函数:
public VirtualUniverse()
这个函数结构了一个新的VirtualUniverse工具,这个工具可以用来建设Locale工具。
Locale工具有下列构建器:
public Locale(VirtualUniverse universe)
public Locale(VirtualUniverse universe, int x[], int y[], int z[])
public Locale(VirtualUniverse universe, HiResCoord hiRes)
#p#分页标题#e#
这三个构建器在指定的VirtualUniverse中建设了一个新的高判别率Locale工具。个中第一个形成了一个在(0.0,0.0,0.0)的Locale工具。其他的两个构建器在指定的坐标上成立了Locale工具。在第二种形式里,参数x,y,z是含八个32位整数的数组,这些数组指定了各自的高判别率坐标。
HiResCoord工具界说了一个利用三个高判别率坐标的点,而每一个坐标又由三个定点数构成。每个高判别率坐标数共有256位,第128位是二进制小数点。Java3D利用长度为八的整数数组来界说或提取一个256位的坐标值。Java3D用数组内的第一个整数来暗示高32位,最后一个整数来暗示低32位。
HiResCoord 工具有以下的构建函数:
public HiResCoord(int x[], int y[], int z[])
public HiResCoord(HiResCoord hc)
public HiResCoord()
第一个结构函数从输入的三个长度为八的整数数组生成高判别率坐标。整数数组界说了与其同名坐标工具的值。第二个结构函数通过复制别的一个坐标建设一个新的坐标。第三个结构函数建设了一个值为(0.0,0.0,0.0)的坐标。
所有Java3D措施城市首先成立VirtualUniverse和Locale工具,也就是说城市包括表3所示的代码。为了利便利用,Java3D为最原始的VirtualUniverse建设了几个子类:SimpleUniverse 、ConfiguredUniverse,这些子类担保了可以将三维图像等闲的在通过Canvas3D的工具在Applet或Frame中显示。个中最常用到的是SimpleUnivese工具,这个类位于包com.sun.j3d.utils.universe中。
u = new SimpleUniverse(v,viewer);
u.getViewingPlatform();
ViewingPlatform viewingPlatform = u.getViewingPlatform();
例1 初始化VirtualUniverse和Locale代码
3 Java3D的调查模式
Java3D引入了一种新的调查模式,这种模式使Java编写的显示结果切合"编写一次,到处运行"的原则。Java3D还把这种成果推广到显示设备或六品级自由度输入外部设备,譬喻跟踪摄像头。这种新的调查模式的"一次编写,到处调查"的特性意味着用Java3D调查模式编写的应用措施和Applet可以遍及应用于各类百般的显示设备。在不修改场景图的条件下,图像可以在包罗尺度电脑显示、多放射显示空间和安装摄像头设备的显示设备上被渲染。这也意味着在不需要修改场景图的环境下,同一个应用措施既可以或许渲染立体情形,还能通过摄像头的输入节制渲染过的调查图。
Java3D的调查模式通过完全疏散虚拟和现实世界来实现这种多成果性。这种模式区分了以下两种环境:
一个应用措施通过节制调查平台的位置和偏向在虚拟宇宙中对一个调查台工具(ViewPlatform)定位、定向和设定比例尺;
渲染器利用已知位置和偏向计较出要利用的调查工具,对终端用户物理情况的描写确定用户在物理情况中的位置和偏向。
3.1 为什么利用一个新的模式
在底层的编程接口中可以找到基于拍照机的调查模式,开拓者通过它可以节制所有渲染图的参数。它可以应付处理惩罚通例的应用措施,可是处理惩罚有更辽阔的适应性的系统的时候就显得力有未逮,这些系统包罗:把整个世界作为一个单位装入和显示的调查器或欣赏器、可供终端用户调查、哄骗、显示、甚至与虚拟世界交互的系统。
基于拍照机的调查模式仿效在虚拟世界中安排一个拍照机而不是一小我私家。开拓者必需一连从头设置一个拍照机来模仿"在虚拟世界中有一小我私家"。
Java3D调查模式直接和跟踪摄像头团结。在有摄像头的环境下,用户会有仿佛他们是真实的存在在谁人虚拟世界的错觉,而开拓者可以不做任何附加的事情就可觉得用户带来这种结果。
在没有摄像头而且只是用来表示一个单一的尺度显示的环境下,Java3D调查模式表示得更像传统的基于拍照机的调查模式,只是加上了可以或许发生立体透视图的成果。
在一个需要由物理情况划定一些调查参数的系统中,让应用措施来节制所有的调查参数并不公道。
例子就是:一个带有摄像头的显示设备可以用其光系统直接抉择应用措施中的调查规模。差异的设备有差异的光系统,措施开拓者硬绑定这样的参数或答允终端用户改变这样的参数都是不公道的。
#p#分页标题#e#
别的一个例子是:一个可以由用户当前的头部位置自动计较出调查参数的系统。只有一个对世界的说明和一条预先界说的轨迹大概不会严密的界说一个终端工具的调查。对付有摄像头设备用户,他们大概会等候在沿着一条牢靠的蹊径前进的时候可以或许看到他们阁下两旁的物体。就仿佛在一个游乐场中,旅客乘坐参观车凭据牢靠的蹊径旅行游乐场,可是在这进程中,旅客可以一连动弹他们的头。
由于依靠终端用户的详细物理情况,调查的各个参数,尤其是调查和投影的基体变革很大。影响调查和投影基体的因素包罗显示设备的物理尺寸,显示设备的安装要领(在用户的桌面或用户的头顶上),计较机是否知道用户的头在三维空间的位置,头顶装置真实的调查规模,显示设备上每平方英寸的像素数,尚有其他雷同的参数。
Java3D成立的调查模式完全可以满意上述所有的需求。
3.2 疏散物理和虚拟
Java3D疏散了虚拟情况和物理情况:应用措施在虚拟情况中凭据必然干系安排工具,而用户存在在物理情况之中,看计较机显示器并哄骗输入设备。
Java3D也界说了用户地址的物理世界和图像措施地址的虚拟世界之间最根基的通信。这种"物理到虚拟世界"的通信界说了一个单一的民众空间,在这个空间顶用户的行动影响虚拟世界中的工具,而在虚拟世界中的任何勾当城市影响最终用户的调查。
虚拟世界是虚拟工具存在的通用空间。虚拟世界的坐标系统相对付每个Locale工具的高判别率坐标存在,它界说了所有附加于这个Locale的虚拟世界坐标原点。包括当前勾当的调查平台工具的Local界说了用来画图的虚拟世界坐标。Java3D最后把所有图像单位的坐标转换到通用的虚拟世界空间中。
物理世界就是指真实的世界。这是真实的用户存在和移动他(她)的头和手的空间。这也是利用任何物理追踪仪可以界说他们的局部坐标和几个尺度的坐标系统被描写的空间。
物理世界是一个空间,而不是Java3D差异的措施执行实例之间的通用坐标系统。所以当两个差异的计较机活着界上两个差异的处所同时运行同一个措施的时候,Java3D中没有直接来描写它们在物理世界坐标系统中相对位置的机制。因为尺度问题,内地的跟踪系统仅仅界说了特定的Java3D应用措施实例的物理坐标系统。
3.3 Java3D顶用来界说调查的工具
Java3D通过几个工具来宣布它的调查模式。出格是View工具和与它相关的组件工具:PhysicalBody工具、PhysicalEnvironment工具、Canvas3D工具、Screen3D工具。图3描写了View工具的中心脚色和组件工具的帮助脚色。
调查有关的工具都在图3中,它们起的浸染如下:
ViewPlatform(调查平台):一个view用一个叶子结点来在场景图为本身定位。调查平台的起始结点指定了它的位置、偏向和在虚拟世界中的比例尺。
View(调查):主要的调查工具包括了许多调查的状态。
Canvas3D:抽象窗口东西箱中画布工具的3D版本。它描画了一个可以让Java3D在上面绘图像的窗口。它包罗了一个对Screen3D工具的引用和描写一个Canvas3D要用到的尺寸、形状和位置信息。
Screen3D:一个包括描写显示荧屏物理属性信息的工具。Java3D把显示荧屏信息别离放在单独的工具中,这样做可以防备在每一个Canvas3D工具中差异的显示屏幕信息共享一个屏幕。
PhysicalBody:一个包括刻度信息的工具,它描写了用户的物理身体。
PhysicalEnvironment:一个包括刻度信息的工具,它描写了物理世界。主要的信息描写了情况的六自由度硬件。
图3:View和它的组件工具以及它们的彼此接洽
这些工具一起描写调查的几许体胜于大白的提供调查或投影基体。Java3D的表示东西用这个信息来结构适合的调查和投影基体。这些调查工具的几许中心为发生一个调查提供了更大的弹性,这种弹性需要支持可以选择的显示设置。
3.4 ViewPlatform: 在虚拟世界中的位置
一个Viewplatform结点界说了一个坐标系统。这样,在虚拟世界中就有了一个有原点或参考点的参考系。调查平台是一个附加在调查工具的点而且作为抉择描画东西调查的基本。
图4暗示了一个场景图的一部门,它包罗一个调查平台结点。直接在调查平台之上的结点抉择了它在虚拟世界中的位置和偏向。应用措施和或行为通过修改直接在调查平台之上任何与TransformGroup结点团结的Tramsform3D工具可以在虚拟世界中任意移动VierPlatform。一个简朴的应用措施大概直接在一个调查平台上界说一个TransformGroup结点。
#p#分页标题#e#
一个虚拟宇宙大概有许多差异的调查平台,可是一个特定的View工具只能附加于一个单一的调查平台之上。这样,每个画在Canvas3D上的图画都是从一个单一的调查平台开始。
图4:包括调查平台的一部门场景图
3.5 如安在虚拟世界中移动
应用措施通过修改调查平台的上级TransformGroup在虚拟世界中飞行。修改一个调查平台的位置和偏向的应用措施的例子包罗:欣赏器、提供飞行节制的阅读器、做修建预设计的措施、甚至是搜寻和破坏游戏。
节制调查平台工具能发生很有趣和有用的功效。我们可以界说一个简朴的场景图,这个措施的目标是在窗口的正中画了一个工具而且绕本身的中心动弹。
我们不管在中心的工具,而让ViewPlatform在虚拟世界中绕圈。假如形体结点包罗一个地球模子,这个措施大概发生一个雷同于绕地球的远航员调查工具。
假如在这个世界中插手更多的工具,这个场景图答允经过行为结点来欣赏整个虚拟世界。
图5:一个由调查节制的简朴场景图
应用措施和行动通过TransformGroup的可会见要领哄骗它。这些要领答允应用措施获得和配置组结点的Transform3D工具。Transform3D结点有setTransform和getTransform两个要领。
3.6 加载于喜欢的处所
一个场景图大概包罗多个调查平台工具。假如用户把一个调查工具从一个调查平台疏散,然后把这个调查工具附加到别的一个差异的调查平台上。显示屏上的图像此刻就要重新的调查平台上的调查点绘图了。
在Java3D的画图机制中,真实的调查由当前附加调查平台的调查附加计策抉择。调查平台界说了配置和获得调查附加计策的要领:
public void setViewAttachPolicy(int policy)
public int getViewAttachPolicy()
这些要领配置和获得在虚拟世界计策中的共存中心。默认的附加计策是View.NOMINAL_HEAD。调查平台的附加调查计策抉择了Java3D奈何在调查平台中安倾轧射点。这个计策可以是以下的几个值之一:
View.NOMINAL_HEAD:担保终端用户在物理世界名义上的眼睛位置对应于在虚拟世界中虚拟眼睛的位置。本质上,这个计策汇报Java3D要用同一种要领把虚拟出射点和调查平台原点及物理出射点和物理世界的原点相对安排。物理世界中出射点的偏向和位置与原点的背离会发生相应的虚拟出射点的偏向和位置在虚拟世界中的背离。
View.NOMINAL_FEET:担保终端用户的虚拟世界中的脚一直打仗虚拟地面,这个计策汇报Java3D要以这种约束计较物理-虚拟世界的通信。为到达之一目标,Java3D通过移动终端用户的眼睛位置和物理高度。Java3D用在PhysicalBody工具中的nominalEyeHeightFromGround参数来执行这个计较。
View.NOMINAL_SCREEN:答允应用措施老是拥有一个和"感乐趣的点"保持"可调查"间隔的出射点。这个计策也抉择了Java3D计较"物理到虚拟世界"通信的要领。这个要领担保措施按照PhysicalBody工具界说nominalEyeOffsetFromNominalScreen参数来配置虚拟出射点与要表示的点之间的间隔。
3.7 在三维世界中成立、移动调查点
形体移动的实现历来都是三维实现的难点和巨大之处,传统三维技能的实现多是注重模仿三维物体的真实移动。而Java3D除了提供传统的方案,还可以在一个存在的三维世界中移动一个调查点,借助调查点的移动模仿物体的移动。如同物理所学的切割磁力线发电,转子和静子原来就是一对可以互逆的工具,功效都是把动能转化为电能。例2的代码显示了在Virtual Universe中成立Viewer、ViewPlatForm、和如何通过绑定OrbitBehavior实现移动ViewPlatform。
setLayout(new BorderLayout());
Canvas3D c = new Canvas3D(null);
add("Center", c);
Viewer viewer = new Viewer(c);
Vector3d viewpoint = new Vector3d(0.0,0.0,2.41);
//初始调查点位置
Transform3D t = new Transform3D();
t.set(viewpoint);
ViewingPlatform v = new ViewingPlatform( );
v.getViewPlatformTransform().setTransform(t);
u = new SimpleUniverse(v,viewer);
u.getViewingPlatform();
ViewingPlatform viewingPlatform = u.getViewingPlatform();
OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
BoundingSphere bounds =
new BoundiBoundingSpherengSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
orbit.setSchedulingBounds(bounds);
viewingPlatform.setViewPlatformBehavior(orbit);
….
例2 成立、移动调查点代码
4 将Java3D与Java平台技能的团结
#p#分页标题#e#
Java3D可以很容易的与Java平台的其他技能相团结,如Applet、JSP、Serverlet、JDBC、EJB等。100%的纯Java实现是Java3D可以与如此多的Java平台技能团结的基础原因:
同是Java平台担保Java3D可以在Applet中实现;
Applet使Java3D可以等闲的在网页中显示;
JSP、Serverlet技能担保将动态网页技能用于Java3D显示;
Serverlet自己就是J2EE平台的焦点技能,这使得Java3D可以搭建于J2EE平台。更可以利用所有J2EE的其他技能:JDBC、EJB、JMS…
4.1 在网页上显示3D图形
Java3D一个最大的特性是可以利用Applet作为显示容器,例3和例4的代码别离显示了如安在Applet中显示3D图形和在网页文件中(HTML)嵌入该Applet。
Public class HelloUniverse extends Applet {
例3 Applet实现Java3D
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
….
return objRoot;
}
public void init() {
Canvas3D c = new Canvas3D(config);
add("Center", c);
….
u.addBranchGraph(scene);
}
….
}
<HTML>
<HEAD>
<TITLE>Hello, Universe!</TITLE>
</HEAD>
<BODY BGCOLOR="#000000">
<applet align=middle code="HelloUniverse.class" width=256 height=256>
</applet>
</BODY>
</HTML>
例4 在网页嵌入显示3D Applet
4.2 动态网页技能与Java3D
通过Jsp和Serverlet,可以使Java3D在网页中"动"起来。固然Java3D自己就有三维动画的成果,可是这里的"动"指得是赋予了措施编写人员对Java3D动态的节制本领。改革上面的HelloUniverse,例5 的jsp代码可以实现节制旋转的正方体巨细的成果。通过每次Random工具生成的随机数,立方体的巨细也是随即改变,这段程执行的结果,如图6、7所示。
<%@ page contentType="text/html; charset=GBK" %>
<HTML>
<HEAD>
<TITLE>Hello, Universe!</TITLE>
</HEAD>
<BODY BGCOLOR="#000000">
<%int i=300;%>
<%float j=i*(new java.util.Random()).nextFloat();%>
<applet align=middle code="HelloUniverse.class" width=<%=j%> height=<%=j%>>
</applet>
</BODY>
</HTML>
例5实现可以动态调解三位物体巨细的jsp代码
图6 Jsp显示结果1
图6 Jsp显示结果2
4.3 J2EE平台对Java3D的支持
上面的例子只是通过动态设定Applet巨细来节制Java3D的显示,实际上可应通过更多的要领实现Jsp、Serverlet对Java3D显示结果的节制,甚至可以将Java3D置于J2EE平台的显示层,实现对EJB、JDBC的挪用。
实现Java3D操作J2EE平台资源的要领许多,甚至可以直接在Java3D的实现类中直接挪用EJB。可是从J2EE平台的设计模式出发,把对EJB挪用放到Jsp中,而将返回的功效作为参数传入实现Java3D的Applet类中是一个更好的模式。详细代码见例6。
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="javax.ejb.*" %>
<%@ page import="java.rmi.*"%>
<%@ page import="javax.rmi.PortableRemoteObject"%>
<%@ page import="javax.naming.*"%>
<%@ page import="java.util.Properties"%>
<HTML>
<HEAD>
<TITLE>Hello, Universe!</TITLE>
</HEAD>
<BODY BGCOLOR="#000000">
<% try{
Properties properties = null;
Context context = new InitialContext(properties);
Object ref = context.lookup("Customer");
EJBHome home= (EJBHome)PortableRemoteObject.narrow(ref,CustomerHome.class);
CustomerHome home=(CustomerHome)home;
Customer customer= home.findByPrimaryKey("1000000");
String data = customer.getData();
}
catch(Exception e){e.printStackTrace();}
%>
<applet align=middle code="HelloUniverse.class" width=200 height=200>
<param name="Data" value=<%=data%>>
</applet>
</BODY>
</HTML>
例6挪用EJB作为Java3D参数代码
上面的代码首先会见JNDI名为"Customer"的EJB,然后将返回值作为参数传入实现Java3D的Applet。
#p#分页标题#e#
Java3D与J2EE是彼此支持的干系:Java3D富厚、强化了J2EE的显示模式,使略显枯燥的J2EE客户端鲜明多彩;J2EE平台为Java3D提供了支持,成果强大的Server端处理惩罚本领为三维显示所需的巨大计较和大数据量提供了有力的支持。
我们可以想象下面的两幅场景:
通讯卫星将全国所有阶梯、修建信息录入大型数据库;EJB实现应用逻辑并将之陈设到AppServer上;所有支持JVM的手机、PDA、车载GPS可以通过挪用EJB显示与真实世界一模一样的周围情况。
地动局按照实际勘探到的地表等高线信息绘制二维矢量图,存为FDX文件;将二维图像转为三维实现的巨大算法放到EJB中实现;Jsp页面挪用EJB后可以在Appet上实现三维GIS的显示。
有了Java3D和Java,这一切都不可是空想。