Java3D 实现三维显示(2)Java3D 的场景图结构
- UID
- 1066743
|
Java3D 实现三维显示(2)Java3D 的场景图结构
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 组或高分辨率结点)定义了被读入现存虚拟宇宙的数据的位置。
表 2-1. Java 3D 高分辨率坐标Java 3D 高分辨率坐标2n MetersUnits87.29Universe (20 billion light years)69.68Galaxy (100000 light years)53.07Light year43.43Solar system diameter23.60Earth diameter10.65Mile9.97Kilometer0.00Meter-19.93Micron-33.22Angstrom-115.57Planck length |
|
|
|
|
|