Board logo

标题: Java3D 实现三维显示(2)Java3D 的场景图结构 [打印本页]

作者: look_w    时间: 2018-7-15 08:47     标题: Java3D 实现三维显示(2)Java3D 的场景图结构

Java3D 的场景图结构 Java3D 实际上是 Java 语言在三维图形领域的扩展,与 Java 一样,Java3D 有纯粹的面向对象结构。Java3D 的数据结构采用的是                Scene Graphs Structure(场景图),就是一些具有方向性的不对称图形组成的树状结构(图 1)。
我们在一个 Java3D 应用程序看到的逼真三维场景从程序的角度看来,实际就是由 Java3D                定义的一系列的对象,这些对象不是杂乱无序,对象之间也不是毫无关系。如果想让三维图像正常显示,必须在这两点上遵循 Java3D 场景图的规定。观察图                1,Java3D 场景图的树结构由各种各样的对象组成:
在图中出现的这些对象都实现了 Java3D 中有重要的意义的类,从逻辑上我们将它们分为三类:
图 1. 在应用中的 Java3D 场景图场景图中线和线的交汇点称为节点(Node),这些节点都是 Java3D 类的实例(Instance of                Class),节点之间的线表示各个实例之间的关系。
上面所列的概念很多,但是对于建立一个简单的 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




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0