Java3D 实现三维显示(4)Java3D 的观察模式
- UID
- 1066743
|
Java3D 实现三维显示(4)Java3D 的观察模式
Java3D 引入了一种新的观察模式,这种模式使 Java 编写的显示效果符合"编写一次,随处运行"的原则。Java3D 还把这种功能推广到显示设备或六等级自由度输入外部设备,例如跟踪摄像头。这种新的观察模式的"一次编写,随处观察"的特性意味着用 Java3D 观察模式编写的应用程序和 Applet 可以广泛应用于各种各样的显示设备。在不修改场景图的条件下,图像可以在包括标准电脑显示、多放射显示空间和安装摄像头设备的显示设备上被渲染。这也意味着在不需要修改场景图的情况下,同一个应用程序既能够渲染立体景象,还能通过摄像头的输入控制渲染过的观察图。
Java3D 的观察模式通过完全分离虚拟和现实世界来实现这种多功能性。这种模式区分了以下两种情况:
- 一个应用程序通过控制观察平台的位置和方向在虚拟宇宙中对一个观察台对象(ViewPlatform)定位、定向和设定比例尺;
- 渲染器使用已知位置和方向计算出要使用的观察对象,对终端用户物理环境的描述确定用户在物理环境中的位置和方向。
3.1 为什么使用一个新的模式 在底层的编程接口中可以找到基于照相机的观察模式,开发者通过它可以控制所有渲染图的参数。它可以应付处理常规的应用程序,但是处理有更广阔的适应性的系统的时候就显得力不从心,这些系统包括:把整个世界作为一个单元装入和显示的观察器或浏览器、可供终端用户观察、操纵、显示、甚至与虚拟世界交互的系统。
基于照相机的观察模式仿效在虚拟世界中放置一个照相机而不是一个人。开发者必须持续重新配置一个照相机来模拟"在虚拟世界中有一个人"。
Java3D 观察模式直接和跟踪摄像头结合。在有摄像头的情况下,用户会有好像他们是真实的存在在那个虚拟世界的错觉,而开发者可以不做任何附加的工作就可以为用户带来这种效果。
在没有摄像头并且只是用来表现一个单一的标准显示的情况下,Java3D 观察模式表现得更像传统的基于照相机的观察模式,只是加上了能够产生立体透视图的功能。
在一个需要由物理环境规定一些观察参数的系统中,让应用程序来控制所有的观察参数并不合理。
例子就是:一个带有摄像头的显示设备可以用其光系统直接决定应用程序中的观察领域。不同的设备有不同的光系统,程序开发者硬绑定这样的参数或允许终端用户改变这样的参数都是不合理的。
另外一个例子是:一个可以由用户当前的头部位置自动计算出观察参数的系统。只有一个对世界的说明和一条预先定义的轨迹可能不会严密的定义一个终端对象的观察。对于有摄像头设备用户,他们可能会期待在沿着一条固定的路线前进的时候能够看到他们左右两旁的物体。就好像在一个游乐场中,游客乘坐观光车按照固定的路线参观游乐场,但是在这过程中,游客可以持续转动他们的头。
由于依靠终端用户的具体物理环境,观察的各个参数,尤其是观察和投影的基体变化很大。影响观察和投影基体的因素包括显示设备的物理尺寸,显示设备的安装方法(在用户的桌面或用户的头顶上),计算机是否知道用户的头在三维空间的位置,头顶装置真实的观察领域,显示设备上每平方英寸的像素数,还有其他类似的参数。
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 结点。
一个虚拟宇宙可能有很多不同的观察平台,但是一个特定的 View 对象只能附加于一个单一的观察平台之上。这样,每个画在 Canvas3D 上的图画都是从一个单一的观察平台开始。
图 4. 包含观察平台的一部分场景图 |
|
|
|
|
|