java3d官方教程1.pdf





《java3d官方教程1.pdf》由会员分享,可在线阅读,更多相关《java3d官方教程1.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、JavaJava 3D3D APIAPI 官方教程官方教程 翻译一翻译一 开始学习 Java3D API1第一章、入门本章目标:学习了本章之后,你能:能用一些基本术语解释什么是 Java3D能描述出 Java3D 程序的基本结构。能识别出 Java3D API 中的许多类。能编写出简单的 Java3D 动画程序。Java 3D API 是一个用于编写显示和交互操作三维图形对象的程序的接口。Java 3D 也是在 Java2 Java 开发包(JDK)上的标准扩展。这个 API 提供了用于创建和操纵 3D 图形的高端构成方法以及渲染该图形的一些数据结构。Java3D 提供了创建图片、可视化、动画
2、动画以及 3D 交互图形应用程序的函数。1.11.1 什么是什么是 JavaJava 3D3D API?API?Javae 3D API 是作为复杂三维图形和声音渲染系统的接口的一系列层次的 JAVA 类的统称。程序员可以用 Java3D 开发创建和操纵 3D 图形对象的高端应用。这个图形对象处于一个被渲染了的虚拟世界(Virtual Universe)中。这个 API就是用设计来用于灵活方便地创建精确的各种大小的虚拟环境,可以大到大空物体,小到比原子还小。除了这些功能之外,API 的使用也很直接,API 能自动处理渲染的细节,由于利用了 Java 线程机制的优势,所以 Java3D 的渲染器
3、的工作是并行进行的。并且渲染器也能自动地优化并提高渲染性能。一个 Java3D 程序创建了 Java3D 对象的实际,并将其置之于场景图数据结构中。在这个场景图中,所有 3D 对象用完全指定了虚拟世界内容和其如何被渲染的树形结构存储,Java3D 程序能写成能独立运行的应用程序,或者写成能嵌入在浏览器中运行的 Applets,或者二者兼备。1.21.2 JavaJava 3D3D APIAPI每一个 Java3D 程序至少部分地集成了来自 Java 类层次中的对象,这些对象的集合称做虚拟世界(virtual universe),这就是将要被渲染的对象。此 API在 javax.media.j3
4、d 包中定义了超过 100 多个类,这些类我们平常称做 Java3D核心类。在 Java3D API 中有数以百计的属性和方法。尽管如此,一个包含动画功能的简单的虚拟世界的构建仅仅需要几个类就行。本章讨论了用尽少的对象集合和交互来渲染一个简单虚拟世界。本章包含了一个简单但是完全的叫 HelloJava3D 的程序的开发过程,这个程序显示了一个能旋转的立方体,这个示例程序是逐步开发完成的,因此这个程 序用了很多版本来展示 Java 3D 编程过程中的每一部分。本教程中的所有程序都可以获得电子的版本。更多的信息请见前言中的获得本教程译者注:http:/ Java3D 核心包之外,Java3D 程序
5、设计也会用到其它的包,比如com.sun.j3d.utils,这个包通常称做 Java3D 工具类,核心类中仅仅包含了在Java3D 编程中必段的最底层的类,而工具类是对核心类方便而强大的补充。工具类主要分为四类:内容加载器、场景图构建辅助类、图形类和方便的一些工具类。将来还有一些功能,比如 nurbsnon-uniform rational B-spline,非均匀有理 B 样条,也会加到工具类,而不是 Java3D 核心包中。而一些工具类在 Java 3D API 将来的版本中也可能会移到核心包中去。利用工具类大大地减少了 Java3D 程序中的代码行数。除 Java3D 核心类和工具类包
6、之外,每一个 Java3D 程序还引用了 java.awt 包和 javax.vecmath 包中的类.java.awt 包就是 Abstract WindowingToolkit(AWT).AWT 类用于创建显示和渲染场景和窗口。而 javax.vecmath 包则定义了对点、矢量、矩阵以及其他数学对象进行数学运算的类。在余下的教程中,词汇可视对象(visual object)就是场景图中的对象比如一个立方体或者球体。对象(object)则是指一个类的实例。而内容(content)指的是一个场景图中全部的可视对象。1.31.3 构建场景图构建场景图一个 Java3D 的虚拟世界创建自一个场景
7、图,而场景图就是由 Java3D类的实例构建而成.场景图集成了定义图形、声音、光线、位置、方向以及可视物体 和声音对象的表面属性等对象。一个通常的图形定义是一个由结点和弧边组成的数据结构。一个结点是一个数据元素,而边则是数据元素之间的关系。场景图中的结点就是 Java3D 类的实例,而边展示了这些 JavaJava 3D 实例之间的两种关系。最为通用的关系是就是父子关系(parent-child relationship),一组结点可以有任意数目的孩子却只能有一个双亲。一个叶子结果可以有一个双亲但是没有孩子。另一个关系是引用(reference)。一个引用与场景图结点中的结点组件(NodeCo
8、mponent)对象相关联。结点组件定义了用于渲染可视对象的图形和表面属性。Java 3D 场景图就是由一堆具有父子关系的结点构建成的树形结构。在树形结构里,其中有且仅有一个结点是根结点,共他结点都可以顺着从根开始的弧边可以访问到,树形结构中的结点是没有回路的。一个场景图就是由植根于本地(Locale)对象的树而形成的。结点组件和引用弧边都不是场景图树的组成部分。在树形结构中,从根结点到叶子结点有且仅有一条路径,因此,从场景图的根到其每个叶子结点也仅有一条路径。从场景图根结点到到特点叶子结果的路径我们称之为该叶子结点的场景图路径(scene graph path)。因此,一条场景图路径恰恰只通
9、向了一个叶子结点。而在场景图中从根到每个叶子结点都有一条这样的路径。在 Java3D 场景图中的每一条场景图路径也完全地 定义了路径的叶子的状态信息。状态信息包括位置、方向、可视对象的大小。由此可见,每一个可视对象的可视属性仅仅由其场景图路私决定。Java3D 渲染利 用这点,以仅可能有效地按它所定义的顺序来渲染叶子对象。Java 3D 程序员一般情况下不用控制渲染对象的顺序。原注:Java3D 程序员仅仅可以用来控制渲染对象顺序的是OrderedGroup 类结点,在本教程教程中对此部分未加论述,请参见 Java3D APIAPI 规范文档在树形结构中,从根结点到叶子结点有且仅有一条路径,因
10、此,从场景图的根到其每个叶子结点也仅有一条路径。从场景图根结点到到特点叶子结果的路径我们称之为该叶子结点的场景图路径(scene graph path)。因此,一条场景图路径恰恰只通向了一个叶子结点。而在场景图中从根到每个叶子结点都有一条这样的路径。在 Java3D 场景图中的每一条场景图路径也完全地 定义了路径的叶子的状态信息。状态信息包括位置、方向、可视对象的大小。由此可见,每一个可视对象的可视属性仅仅由其场景图路私决定。Java3D 渲染利 用这点,以仅可能有效地按它所定义的顺序来渲染叶子对象。Java 3D 程序员一般情况下不用控制渲染对象的顺序。原注:Java3D 程序员仅仅可以用来
11、控制渲染对象顺序的是OrderedGroup 类结点,在本教程中对此部分未加论述,请参见 Java3D API 规范文档场景图的图形表示可以当作设计工具或者 Java3D 程序的文档。场景图一般用一些标准的图形标记来绘制,如图 1-1 所示。Java 3D 程序可能不止有包含场景图中的这些对象。可以用以上标志集合来设计一个 Java3D 虚拟世界场景图。等设计上的事情完成后,场景图的设计就是程序设计的规范。等到程序也设计完成,同一个场景图就是程序的精解表现(假设程序是依照设计的图来进行的话)。一个从已有程序绘制成的场景图可以做创建程序场景图的文档。可以用以上标志集合来设计一个 Java3D 虚
12、拟世界场景图。等设计上的事情完成后,场景图的设计就是程序设计的规范。等到程序也设计完成,同一个场景图就是程序的精解表现(假设程序是依照设计的图来进行的话)。一个从已有程序绘制成的场景图可以做创建程序场景图的文档。图 1-1 左边所示的每一个标记代表了场景图中的每一个对象,前两个标记代表特定的类的对象,即 VirtualUniversee 和 Locale 类的对象,下面的三个则常常用于标注特定对象译者注:Group 子类的对象等的子类,最后一个标记用于表示其它类的对象。实线箭头表示两个所连接的对象之间存在 父子关系。而虚线箭头则表求一个对象是另一个对象的引用。引用的对象可以供一个场景图中的不同
13、的分支所共享。一个简单的场景图的例子如图 1-2 所示。在平时,创建一个错误的场景图也是可能的,一个不合理的场景图的例子如图 1-3 所示.图 1-3 所描绘的场景图之所以不合理是因为它与有向无环图(Directed Acyclic Graph Or DAG)的规则相冲突.问题存在于两个TransformGroup 对象都以同样的 ShapE3D 叶 子对象作为其孩子。请记住,一个叶子结点只能一个双亲,也就是,从 Locale 对象到叶子结点只能有一条路径(或者从叶子结点到 Locale 对象只能有一 条路径)。你也许会认为,图 1-3 图所示的场景在虚拟世界中定义了三个可视对象。它看起来好像
14、是这个场景图通过重用图形右边的可视对象(Shape3D)而定义了两个对象。从概念上讲,每一个TransformGroup 对象都作为共享的那个 Shape3D 的双亲,这个 Shape3D 的可视化对象可以允许在不同地方放置一张图片。尽管如此,由于父子边之间的关系构不成树形结构,所以这个场景图是不合法的。在这个例子中,表现为 Shape3D对象有多于一个以上的双亲。对树形结构和有向无环图的讨论是正确的,然而,Java 3D 运行时系统会报告这类父子关系之间的错误。树形结构存在的限制是每一个 Shape3D 对象只能有一个双亲。从图 1-3 所示的例子看来,多亲异常会在运行时报告出来。图 1-4
15、中,展示了这种不合法场景图的解决办法,每一个 Shape3D 只有一个双亲。一个定义了不合理(法)场景图的 Java3D 程序可能通过编译,但是不会在运行时渲染。当一个定义了不合法场景图的 Java3D 程序运行时,Java3D系统会检测到这个问题,从而会报告一个异常。程序还会继续运行,但是结果是,应该被关闭,没有任何渲染好的图象生成。每一个场景图有一个唯一的VirtualUniverse,这个 VirtualUniverse 有一系列 Locale 对象。一个 Locale 对象,提供了虚拟世界中的一个参考点。可以把 Locale对象看作是在虚拟世界中定义可视对象位置的标志。一个 Java3
16、D 程序有多于一个的 VirtualUniverse 对象,技术上是可行的,因此,可以在虚拟世界中定义多个 Locale 对象,然而,在多个虚拟世界之间没有内在的沟通方 式,更进一步讲,一个场景图不能存于多个虚拟世界中。同时,我们强烈建议在一个 Java 3D 程序中只同时拥有有且仅有一个 VirtualUniverse。而一个 VirtualUniverse 可能在多个 Locale 对象中引用,但是更多的 Java 3D 程序只有一个 Locale 对象,每一个 Locale 对象,可以作为场景图中多个子图的根结点。参考图 1-2 作为场景图的例子,注意到图中的 Locale 对象有两个子
17、图分支。一个 BranchGroup 对象是子图的根结点,或者是分支图的根结点。场景子图可以分为两类,视图分支图(theview branch graph)和内容分支图(thecontent branch graph.)。内容分支图指定了虚拟世界的内容图形,表面,动作,位置,声音以及光线等。视图分支子图指定了视图参数比如观看位置和方向。总的来说,两类子图指定了很多渲染要完成的工作。1.3.11.3.1 高端高端 Java 3D API 的类层次的类层次图 1-5 显示了 Java 3D API 类层次中的前面三个层次。VirtualUniverse,Locale,Group,和 Leaf 类处
18、于类层次中的这部分。除了VirtualUniverse 和 Locale对象,场景图中余下的部分由 SceneGraphObject 对象构成。SceneGraphObject 几乎是 Java3D 类中每一个核心类和工具类的超类译者注:超类即上层类,可以是父类或者祖先类。SceneGraphObject 有两个子类:Node 类 NodeComponent.类,Node 子类提供了场景图中的绝大部分对象,一个 Node 对象可以是一个 Group,也可是一个 Leaf结点对象。Group 和 Leaf 是一系列类的超类。这里可以一目了然地看到 Node 类的子类,它有两个子类,而 NodeC
19、omponent 类,在这些背景知识介绍之后,在 Java3D 程序的构建中会解释到。NodeNode 类类Node 是 Group 和 Leaf 类的一个抽象超类.Node 为其子类定义了一些公共的重要的方法。某些方法的信息会在更多的背景知识介绍了之后提到。Node 的子类构成了子图。GroupGroup 类类Group 类是用于在虚拟世界中指定可视对象位置和方向的类的超类。Group 类的两个下层类是 BranchGroup 是 TransformGroup.在场景图的图形表现中,Group标记(用圆表示)。而其中 BranchGroups 注为 GB,TransformGroups 注为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java3d 官方 教程

限制150内