Java3D 实现三维显示
打印文档
文档提供:86VR | 虚拟无忌 2004-10-22
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)
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 语言等其它高级语言的连接较难掌握,因而逐渐被淹没在竞争激烈的网络三维
技术中。
2 Java3D 的场景图结构
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 位的高分辨率坐标:
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 组或高分辨率结点)定义了被读入现存虚拟宇宙的数据的位置。
投稿热线 - 友情链接 - 广告服务 - 网站地图 - 联系方式 - 关于我们
©Copyright by 86VR.COM, 2002-2005. All rights reserved.