2.3 场景(Locale)为了支持大型虚拟宇宙,Java3D 提出了"Locale"的概念。Locale 把高分辨率坐标作为起源。把高分辨率坐标看作精确的定位,它在高分辨率坐标的影响范围之内使用精度较低的浮点坐标指定对象的位置。
一个 Locale 和与它结合的高分辨率坐标一起组成了在虚拟宇宙之下的一个表现层。所有虚拟宇宙包含一个或多个高分辨率 Locale。而所有其他的对象都是附加在一个 Locale 上的。在整个体系中,高分辨率坐标扮演的是上层的仅供翻译的转换结点。例如,附加到一个特定 Locale 的所有对象的坐标都会与这个 Locale 位置的高分辨率坐标有关。(图 2)
图 2. 高分辨率坐标指定场景如果一个虚拟宇宙与传统的计算机图像的概念相近,给定的虚拟宇宙可能会变得太大。所以在通常情况下最好把一个场景图看作是一个高分辨率坐标场景的子结点。
构造一个三维场景,程序员必须运行一个 Java3D 程序。这个 Java3D 应用程序必须首先创建一个虚拟宇宙对象并且至少把一个 Locale 对象附加之上。然后,构建出需要的场景图像,它由一个分支组结点开始并且包括至少一个观察平台对象,而场景图就是附加于这个观察平台。当一个包含场景图的观察对象被附加于一个虚拟宇宙,Java3D 的渲染循环就开始工作。这样,场景就会和它的观察对象一起被绘制在画布上。
2.4 编程实现一个三维世界这一部分描述怎样调用 VirtualUniverse、Locale 和 HiResCoord 对象的编程接口实现建立一个完整的"三维世界"。注意,这个三维世界有原点、坐标,是实现三维显示程序的第一步。
- VirtualUniverse 对象有下列构造函数:
1
| public VirtualUniverse()
|
这个函数构造了一个新的 VirtualUniverse 对象,这个对象可以用来创建 Locale 对象。
- Locale 对象有下列构建器:
1
2
3
| public Locale(VirtualUniverse universe)
public Locale(VirtualUniverse universe, int x[], int y[], int z[])
public Locale(VirtualUniverse universe, HiResCoord hiRes)
|
这三个构建器在指定的 VirtualUniverse 中创建了一个新的高分辨率 Locale 对象。其中第一个形成了一个在(0.0,0.0,0.0)的 Locale 对象。其他的两个构建器在指定的坐标上建立了 Locale 对象。在第二种形式里,参数 x,y,z 是含八个 32 位整数的数组,这些数组指定了各自的高分辨率坐标。
HiResCoord 对象定义了一个使用三个高分辨率坐标的点,而每一个坐标又由三个定点数组成。每个高分辨率坐标数共有 256 位,第 128 位是二进制小数点。Java3D 使用长度为八的整数数组来定义或提取一个 256 位的坐标值。Java3D 用数组内的第一个整数来表示高 32 位,最后一个整数来表示低 32 位。
- HiResCoord 对象有以下的构建函数:
1
2
3
| 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 中。
1
2
3
| u = new SimpleUniverse(v,viewer);
u.getViewingPlatform();
ViewingPlatform viewingPlatform = u.getViewingPlatform();
|
例 1 初始化 VirtualUniverse 和 Locale 代码
|