logo资料库

Java3D实现三维显示.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
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.
分享到:
收藏