基于java3d的网络三维技术的设计与实现—计算机毕业设计内容摘要:

没有抛弃 VRML, Shout Interactive 公司可以接受 VRML文件,并把它变成自己的文件格式, Blaxxun公司的软件可以直接运行 VRML。 当然, Shout3D 的小巧灵活并不是没有代价的:它简化了 VRML的功能, VRML的一些功能不能用小小 50K 的 Java 来实现。 可以说这两个公司最先在它们的产品中实现了核心的 X3D 技术。 使用这种 无插件技术 ( plugin)的 Shout 公司为 Macy39。 s and Excite web portal 网站制作了栩栩如生如生的 3D虚拟时装模特展示,观看者用菜单可以选择:展示的服装,模特的肤色,发型,步型,甚至于灯光都可以用菜单即刻更换。 观看者可以用鼠标变换视角,远近,从各个角度观看动态展示。 而所有的展示文件只有 1M2M,不需下载插件。 图像的质量较好,人物动画的动作流畅自然。 第二章 Java3D 技术的简介 Java3D 用其自己定义的场景图和观察模式等技术构造了 3D 的上层结构 ,实现了在 Java 平台使用三维技术。 本章将介绍 Java3D 特有的两个重要概念:场景图( Scene Graph)、观察模式( View Model)。 在接口使用上的介绍分为两部分:说明如何使用 Java3D 接口;说明如何将 Java3D 技术与 Java 原有的 Web 技术( JSP、 Serverlet)相结合,在网页上实现三维显示。 167。 Java3D 概述 Java3D 简介 Java3D API 是 Sun定义的用于实现 3D显示的接口。 3D 技术是底层的显示技术, Java3D 提供了基于 Java 的上层接口。 Java3D 把 OpenGL和 DirectX 这些底层技术包装在 Java 接口中。 这种全新的设计使 3D 技术变得不再繁琐并且可以加入到 J2SE、 J2EE 的整套架构,这些特性保证了 Java3D 技术强大的扩展性。 JAVA3D 建立在 JAVA2( )基础之上, JAVA 语言的简单性使 JAVA3D 的推广有了可能。 它实现了以下三维显示能够用到的功能: 1. 生成简单或复杂的形体(也可以调用现有的三维形体) 2. 使形体具有颜色、透明效果、贴图 3. 在三维环境中生成灯光、移动灯光 4. 具有行为的处理判断能力(键盘、鼠标、 定时等) 5. 生成雾、背景、声音 6. 使形体变形、移动、生成三维动画 7. 编写非常复杂的应用程序,用于各种领域如 VR(虚拟现实) Java3D 与其他三维技术的比较 JAVA3D 可应用在三维动画、三维游戏、机械 CAD 等多个领域。 但作为三维显示实现技术,它并不是唯一选择而且是一个新面孔。 在 Java3D 之前已经存在很多三维技术,这些三维技术在实现的技术、使用的语言以及适用的情况上各有不同,我主要介绍与 Java3D 又密切关系的三种技术: OpenGL、 DIRECT3D、VRML OpenGL OpenGL是 业界最为流行也是支持最广泛的一个底层 3D 技术,几乎所有的显卡厂商都在底层实现了对 OpenGL的支持和优化。 OpenGL同时也定义了一系列接口用于编程实现三维应用程序,但是这些接口使用 C( C++)语言实现并且很复杂。 掌握针对 OpenGL的编程技术需要花费大量时间精力。 DIRECT3D DIRECT3D 是 Microsoft 公司推出的三维图形编程 API,它主要应用于三维游戏的编程。 众多优秀的三维游戏都是由这个接口实现。 与 OpenGL一样, Direct3D 的实现主要使用 C++语言。 (VRML97) 自 1997 年 12 月正式成为国际标准之后,在网络上得到了广泛的应用,这是一种比 BASIC、 JAVASCRIPT 等还要简单的语言。 脚本化的语句可以编写三维动画片、三维游戏、计算机三维辅助教学。 它最大的优势在于可以嵌在网页中显示,但这种简单的语言功能较弱(如目前没有形体之间的碰撞检查功能),与 JAVA 语言等其它高级语言的连接较难掌握,因而逐渐被淹没在竞争激烈的网络三维技术中。 表 1 是 Java3D 与其它三维技术的比较图,可以从中直观的看出他们 相互间的区别: 技术 实现层次 开发技术(难 度) 扩展性 最适合应 用领域 Java3D 中层( JVM) Java(较易) J2SE标准扩展(好) 网上三维显示实现 … OpenGL 底层(显卡) C\C++(难) 各大厂商支持(较好) 三维设计软件 … Direct3D 底层(操作系统) C++(较难) Windows 平台(差) 三维游戏 … VRML 上层(网页) 标记语言(容 易) 安装插件支持(一 般) 网上虚拟现实 … 表 1: 3D 技术对招表 167。 Java3D 的场景图结构 Java3D 实际上是 Java 语言在三维图形领域的扩展,与 Java 一样, Java3D 有纯粹的 面向对象结构。 Java3D 的数据结构采用的是 Scene Graphs Structure(场景图),就是一些具有方向性的不对称图形组成的树状结构(图 1)。 实际由 Java3D 定义的一系列的对象,这些对象不是杂乱无序,对象之间也不是毫无关系。 如果想让三维图像正常显示,必须在这两点上遵循 Java3D 场景图的规定。 观察图 1, Java3D 场景图的树结构由各种各样的对象组成: 在图中出现的这些对象都实现了 Java3D 中有重要的意义的类,从逻辑上我将它们分为三类:  根节点( Root): Virtual Universe Object  节点( Node): Local Object、 Branch Group Nodes、 Behavior Node、 Shape3D Node…  叶子节点( Leaf): Appearance、 Geometry.. 图 1:在应用中的 Java3D 场景图 场景图中线和线的交汇点称为节点( Node),这些节点都是 Java3D 类的实例( Instance of Class),节点之间的线表示各个实例之间的关系。  Virtual Universe 是根节点,每一个场景图的 Virtual Universe 是唯一的。  在 Virtual Universe 下面是 Locale 节点,每个程序可以有一个或多个 Locale,但同时只能有一个 Locale 处于显示状态,就 好像 一个三维世界非常大,有很多个景点,但我同时只能在一个景点进行观察。 Java3D 允许从一个 Locale 跳到另一个 Locale,不过绝大多数程序只有一个 Locale。  每一个 Locale 可以拥有多个 Branch Group 节点。 所有三维形体的其位置信息( Transform Group Nodes)都建立在 Branch Group 节点之上。  Transform Group Node用来设定 Shape3D在 Virtual Universe 中的位置。  Spape3D Node 是三维图形节点,这个节点的实体放映在最后的显示画面中,就是三维世界中的每个形体。 包括正方体、球体以及任何形状和外观的三维形体。  位于场景图最下层 的是两个叶子节点:三维体的外观( Appearance)和几何信息( Geometry),这两个节点定义了一个三维体的显示效果。  View Platform位于图 1 的另一个分枝上,与前面所有描述三维体的性质的概念不同, View Platform和 View 都是用来定义观察者的信息。 对于建立一个简单的 Java3D 程序,我至少需要了解三个概念:虚拟宇宙( Virtual Universe)、场景( Locale)、坐标系统。 虚拟宇宙( Virtual Universe) 在 Java3D 中,虚拟宇宙被定 义为结合一系列对象的三维空间。 虚拟宇宙被用作最大的聚集体表现单位,同时也可被看作一个数据库。 不管是在物理空间还是逻辑内容,虚拟宇宙都可以很大。 实际上在大多数情况下,一个虚拟宇宙就可以满足一个应用程序所有的需求。 虚拟宇宙是各自独立的个体,原因是在任何时候一个结点对象都不能在超过一个的虚拟宇宙中存在。 同样的,在一个虚拟宇宙中的结点对象也不能在其他的虚拟宇宙中可见或者与其他的对象结合。 对于一个 Java3D 应用程序,必须定义一个虚拟宇宙才可以在这个 宇宙 中显示三维图像。 Java3D 的坐标系统 默认情况下, Java3D 的坐标系统是右旋的,用方位语义学来解释就是:正 y方向是本地重力的上,正 x方向是水平的右,正 z是这对着观察者的方向。 默认的单位是米。 双精度浮点、单精度浮点甚至是定点来表示的三维坐标都足够来表示和显示丰富的 3D 场景。 不幸的是,场景不是真实世界,更不必说整个宇宙了。 如果使用单精度坐标,有可能出现下列情景: 1. 离原点仅有一百公里的距离,被描绘得相当量子化,所能达到的最好效果就是三分之一英寸,在实际应用中这样的精度比要求的粗糙的多。 2. 如果要缩小到一个很小的尺寸(例如表现集成电路的大小), 甚至在离原点很近的地方就会出现同坐标问题。 为了支持一个大型的邻接虚拟宇宙, Java3D 选择了有 256 位的高分辨率坐标: Java3D 高分辨率坐标由三个 256 位的定点数组成,分别表示 x、 y、 z。 定点被固定在第 128 位,并且值 被定义为真实的 1 米。 这个坐标系统足够用来描述一个超过几百万光年距离的宇宙,也可以定义小于一质子大小(小于一普朗克长度)的对象。 在 Java3D 中,高分辨率坐标仅仅用于将更加传统的浮点坐标系统嵌入更高分辨率的底层系统。 用这种方法,可以创造出一个具有任意大小和规模的在视觉上无缝的虚 拟宇宙,而且可以不必担心数字上的精度。 (参看表 2) 一个 256 位的定点数还具有能够直接表示几乎任何的合理适当的单精度浮点值。 Java3D 用有符号的、两位补码的 256 位定点数字来表示高分标率坐标。 尽管 Java3D 保持内部高分辨率坐标表示的不透明,但用户用有八个整型变量的数组来表示 256 位的坐标。 Java3D 把数组中从索引号由 0 到 7 分别看作高分辨率坐标的从高到底位上的数。 第 128 位上是二进制的小数点,也可以说在索引号为3 和 4 的整数之间。 高分辨率坐标的 就是 1 米。 如果是 小 的虚拟宇宙(类似于相对比例 的几百米),在虚拟宇宙对象下( ,)点建立一个带有高分辨率坐标的 Locale 作为根节点就足够使用了;装入程序在装入过程中能自动构建结点,而在高分辨率坐标下的点不需要任何外部文件的直接描述。 大一些的虚拟宇宙期待被构建为有如同计算机文件那样的层次,这意味着一个根宇宙要包含由外部文件引用的嵌入虚拟宇宙。 就这样,文件引用的对象(用户指定的 Java3D 组或高分辨率结点)定义了被读入现存虚拟宇宙的数据的位置。 Java 3D 高分辨率坐标 2n Meters Units Universe (20 billion light years) Galaxy (100000 light years) Light year Solar system diameter Earth diameter Mile Kilometer Meter 3 Micron 2 Angstrom 115.57 Planck length 表 2: Java 3D 高分辨率坐标 场景 ( Locale) 为了支持大型虚拟宇宙, Java3D 提出了 Locale的概念。 Locale 把高分辨率坐标作为起源。 把高分辨率坐标看作精确的定位,它在高分辨率坐标的影响范围之内使用精度较低的浮点坐标指定对象的位置。 一个 Locale 和与它结合的高分辨率坐标一起组成了在虚拟宇宙之下的一个表现层。 所有虚拟宇宙包含一个或多个高分辨率 Locale。 而所有其他的对象都是附加在一个 Locale 上的。 在整个体系中,高分辨率坐标扮演的是上层的仅供翻译的转换结点。 例如,附加到一个特定 Locale 的所有对象的坐标都会与这个 Locale 位置的高分辨率坐标有关。 (图 2) 图 2:高分辨率坐标指定场景 如果一个虚拟宇宙与传统的计算机图像的概念相近,给定的虚拟宇宙可能会变得太大。 所以在通常情况下最好把一个场景图看作是一个高分辨率坐标场景的子结点。 构造一个三维场景,程序员必须运行一个 Java3D 程序。 这个 Java3D 应用程序必须首先创建一个虚拟宇宙对象并且至少把一个 Locale 对象附加之上。 然后,构建出需要的场景图像,它由一个分支组结点开始并且包括至少一个观察平台对象,而场景图就是附加于这个观察平台。 当一个包含场景图的观察对象被附加于一个虚拟宇宙, Java3D 的渲染循环就开始工作。 这样,场景就会和它的观察对象一起被绘制在画布上。 167。 实现三维世界 Java3D 的观察模式 Java3D 引入了一种新的观察模式,这种模式使 Java 编写的显示效果符合 编写一次,随处运行 的原则。 Java3D 还把这种功能推广到显示设备或六等级自由度输入外部。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。