




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java 3D API官方教程翻译一开始学习Java3D API1第一章、入门本章目标:学习了本章之后,你能:?能用一些基本术语解释什么是 Java3D?能描述出Java3D程序的基本结构。?能识别出Java3D API中的许多类。?能编写出简单的Java3D动画程序。Java 3D API是一个用于编写显示和交互操作三维图形对象的程序的接口。Java 3D也是在Java2 Java开发包(JDK上的标准扩展。这个 API提供了 用于创建和操纵3D图形的高端构成方法以及渲染该图形的一些数据结构。Java3D提供了创建图片、可视化、 动画以及3D交互图形应用程序的函数。1.1 什么是 Java
2、3D API?Javae 3D API是作为复杂三维图形和声音渲染系统的接口的一系列层次的JAVA类的统称。程序员可以用Java3D开发创建和操纵3D图形对象的高端应用。这个图 形对象处于一个被渲染了的虚拟世界(Virtual Uni verse)中。这个API就是用设 计来用于灵活方便地创建精确的各种大小的虚拟环境,可以大到大空物体,小到比原子还小。除了这些功能之外,API的使用也很直接,API能自动处理渲染的细节,由 于利用了 Java线程机制的优势,所以Java3D的渲染器的工作是并行进行的。并 且渲染器也能自动地优化并提高渲染性能。一个Java3D程序创建了 Java3D对象的实际,并
3、将其置之于场景图数据结 构中。在这个场景图中,所有3D对象用完全指定了虚拟世界内容和其如何被渲 染的树形结构存储,Java3D 程序能写成能独立运行的应用程序, 或者写成能嵌入在浏览器中运 行的Applets,或者二者兼备1.2 Java 3D API每一个Java3D程序至少部分地集成了来自Java类层次中的对象,这些对象的 集合称做虚拟世界(virtual universe ),这就是将要被渲染的对象。此 API 在javax.media.j3d 包中定义了超过100多个类,这些类我们平常称做 Java3D 核心类。在Java3D API中有数以百计的属性和方法。尽管如此,一个包含动画功能
4、的 简单的虚拟世界的构建仅仅需要几个类就行。本章讨论了用尽少的对象集合和交互来渲染一个简单虚拟世界。本章包含了一个简单但是完全的叫HelloJava3D的程序的开发过程,这个程序显示了一个能旋转的立方体,这个示例程序是逐步开发完成的,因此这个程序 用了很多版本来展示Java 3D编程过程中的每一部分。本教程中的所有程序都可 以获得电子的版本。更多的信息请见前言中的"获得本教程"译者注: 。除了 Java3D核心包之外,Java3D程序设计也会用到其它的包,比如 com.sun.j3d.utils,这个包通常称做Java3D工具类,核心类中仅仅包含了在Java3D编程中必段的
5、最底层的类,而工具类是对核心类方便而强大的补充。工具类主要分为四类:内容加载器、场景图构建辅助类、图形类和方便的一 些工具类。将来还有一些功能,比如n urbs non-u niform ratio nal B-spli ne,非均匀有理B样条,也会加到工具类,而不是Java3D核心包中。而一些工具类 在Java 3D API将来的版本中也可能会移到核心包中去。利用工具类大大地减少了 Java3D程序中的代码行数。除Java3D核心类和工 具类包之外,每一个Java3D程序还引用了 java.awt包和javax.vecmath 包中 的类.java.awt 包就是 Abstract Wind
6、owingToolkit (AWT). AWT 类用于创建显 示和渲染场景和窗口。而javax.vecmath包则定义了对点、矢量、矩阵以及其他 数学对象进行数学运算的类。在余下的教程中,词汇可视对象(visual object )就是场景图中的对象比 如一个立方体或者球体。对象(object)则是指一个类的实例。而内容(content ) 指的是一个场景图中全部的可视对象。1.3构建场景图一个Java3D的虚拟世界创建自一个场景图,而场景图就是由Java3D类的实 例构建而成.场景图集成了定义图形、声音、光线、位置、方向以及可视物体 和 声音对象的表面属性等对象。一个通常的图形定义是一个由结
7、点和弧边组成的数据结构。一个结点是一个数据元素,而边则是数据元素之间的关系。场景图中的结点就是Java3D类的实例,而边展示了这些Java 3D实例之间的两种关系。 最为通用的关系是就是父子关系(parent-child relationship ), 一组结点可以 有任意数目的孩子却只能有一个双亲。 一个叶子结果可以有一个双亲但是没有孩 子。另一个关系是引用(referenee )。一个引用与场景图结点中的结点组件(NodeComponer)t对象相关联。结点组件定义了用于渲染可视对象的图形和表 面属性。Java 3D场景图就是由一堆具有父子关系的结点构建成的树形结构。在树形结构 里,其中有
8、且仅有一个结点是根结点,共他结点都可以顺着从根开始的弧边可以 访问到,树形结构中的结点是没有回路的。一个场景图就是由植根于本地(Locale )对象的树而形成的。结点组件和引用弧边都不是场景图树的组成部分。在树形结构中,从根结点到叶子结点有且仅有一条路径,因此,从场景图的根到其每个叶子结点也仅有一条路径。从场景图根结点到到特点叶子结果的路径我们 称之为该叶子结点的场景图路径(scene graph path )。因此,一条场景图路 径恰恰只通向了一个叶子结点。而在场景图中从根到每个叶子结点都有一条这样 的路径。在Java3D场景图中的每一条场景图路径也完全地定义了路径的叶子的状态信息。状态信息
9、包括位置、方向、可视对象的大小。由此可见,每一个可视 对象的可视属性仅仅由其场景图路私决定。Java3D渲染利用这点,以仅可能有 效地按它所定义的顺序来渲染叶子对象。Java 3D程序员一般情况下不用控制渲 染对象的顺序。原注:Java3D程序员仅仅可以用来控制渲染对象顺序的是 OrderedGroup类结点,在本 教程中对此部分未加论述,请参见 Java3D API规范 文档在树形结构中,从根结点到叶子结点有且仅有一条路径,因此,从场景图的根到其每个叶子结点也仅有一条路径。从场景图根结点到到特点叶子结果的路径我们 称之为该叶子结点的场景图路径(scene graph path )。因此,一条
10、场景图路 径恰恰只通向了一个叶子结点。而在场景图中从根到每个叶子结点都有一条这样 的路径。在Java3D场景图中的每一条场景图路径也完全地定义了路径的叶子的状态信息。状态信息包括位置、方向、可视对象的大小。由此可见,每一个可视 对象的可视属性仅仅由其场景图路私决定。Java3D渲染利用这点,以仅可能有 效地按它所定义的顺序来渲染叶子对象。Java 3D程序员一般情况下不用控制渲 染对象的顺序。原注:Java3D程序员仅仅可以用来控制渲染对象顺序的是 OrderedGroup类结点,在本教程中对此部分未加论述,请参见Java3D API规范文档场景图的图形表示可以当作设计工具或者 Java3D程
11、序的文档。场景图一般用一 些标准的图形标记来绘制,如图1-1所示。Java 3D程序可能不止有包含场景图 中的这些对象。可以用以上标志集合来设计一个 Java3D虚拟世界场景图。等设计上的事情完成 后,场景图的设计就是程序设计的规范。等到程序也设计完成,同一个场景图就 是程序的精解表现(假设程序是依照设计的图来进行的话)。一个从已有程序绘 制成的场景图可以做创建程序场景图的文档。可以用以上标志集合来设计一个 Java3D虚拟世界场景图。等设计上的事情完成 后,场景图的设计就是程序设计的规范。 等到程序也设计完成,同一个场景图就 是程序的精解表现(假设程序是依照设计的图来进行的话)。一个从已有程
12、序绘 制成的场景图可以做创建程序场景图的文档。图1-1左边所示的每一个标记代表了场景图中的每一个对象,前两个标 记代表特定的类的对象,即VirtualUniversee 和Locale类的对象,下面的三个 则常常用于标注特定对象译者注:Group子类的对象等的子类,最后一个标记 用于表示其它类的对象。实线箭头表示两个所连接的对象之间存在父子关系。而虚线箭头则表求一个对象是另一个对象的引用。引用的对象可以供一个场景图中的不同的分支所共享。一个简单的场景图的例子如图1-2所示。在平时,创建一个错误的场景图也是可能的,一个不合理的场景图的例子如 图1-3所示.图1-3所描绘的场景图之所以不合理是因为
13、它与有向无环图(DirectedAcyclic Graph Or DAG)的规则相冲突.问题存在于两个TransformGroup对象都 以同样的ShapE3D叶子对象作为其孩子。请记住,一个叶子结点只能一个双亲, 也就是,从Locale对象到叶子结点只能有一条路径(或者从叶子结点到Locale对象只能有一 条路径)。你也许会认为,图1-3图所示的场景在虚拟世界中定 义了三个可视对象。它看起来好像是这个场景图通过重用图形右边的可视对象(Shape3D 而定义了两个对象。从概念上讲,每一个 TransformGroup对象都 作为共享的那个Shape3D的双亲,这个Shape3D的可视化对象可以
14、允许在不同地 方放置一张图片。尽管如此,由于父子边之间的关系构不成树形结构,所以这个场景图是不合法的。在这个例子中,表现为Shape3C对象有多于一个以上的双亲。对树形结构和有向无环图的讨论是正确的,然而, Java 3D运行时系统会 报告这类父子关系之间的错误。树形结构存在的限制是每一个 Shape3D对象只 能有一个双亲。从图1-3所示的例子看来,多亲异常会在运行时报告出来。图1-4中, 展示了这种不合法场景图的解决办法,每一个Shape3D只有一个双亲。一个定义了不合理(法)场景图的Java3D程序可能通过编译,但是不会 在运行时渲染。当一个定义了不合法场景图的 Java3D程序运行时,
15、Java3D系统 会检测到这个问题,从而会报告一个异常。程序还会继续运行,但是结果是,应该被关闭,没有任何渲染好的图象生成。每一个场景图有一个唯一的 VirtualUniverse ,这个 VirtualUniverse有一系列 Locale 对象。一个Locale对象,提供了虚拟世界中的一个参考点。可以把Locale对象看作是在虚拟世界中定义可视对象位置的标志。一个Java3D程序有多于一 个的VirtualU ni verse对象,技术上是可行的,因此,可以在虚拟世界中定义多个Locale对象,然而,在多个虚拟世界之间没有内在的沟通方式,更进一步讲,一个场景图不能存于多个虚拟世界中。同时,
16、我们强烈建议在一个Java 3D程序中只同时拥有有且仅有一个 VirtualUniverse。 而一个VirtualUniverse可能在多个Locale对象中引用,但是更多的Java 3D程序只有一个Locale对象,每 一个Locale对象,可以作为场景图中多个子图的根结点。参考图 1-2作为场景 图的例子,注意到图中的Locale对象有两个子图分支。一个BranchGroup对象是子图的根结点,或者是分支图的根结点。场景子 图可以分为两类,视图分支图(the view branch graph )和内容分支图(the content branch graph.)。内容分支图指定了虚拟世界
17、的内容图形,表面,动作,位置,声音以及光线等。视图分支子图指定了视图参数比如观看位置和方 向。总的来说,两类子图指定了很多渲染要完成的工作。1.3.1高端Java 3D API的类层次图1-5显示了 Java 3D API类层次中的前面三个层次。VirtualUniverse. Locale, Group, 和Leaf 类处于类层次中的这部分。除了 VirtualUniverse 和Locale对象,场景图中余下的部分由 SeeneGraphObject对 象构成。SceneGraphObject几乎是Java3D类中每一个核心类和工具类的超类 译者注:超类即上层类,可以是父类或者祖先类。Sc
18、eneGraphObject 有两个子类:Node 类 NodeComponent类,Node子类提供了 场景图中的绝大部分对象,一个 Node对象可以是一个Group,也可是一个Leaf 结点对象。Group和Leaf是一系列类的超类。这里可以一目了然地看到 Node类的子类,它 有两个子类,而NodeComponent类,在这些背景知识介绍之后,在Java3D程序 的构建中会解释到。Node 类Node是Group和Leaf类的一个抽象超类.Node为其子类定义了一些公共的重 要的方法。某些方法的信息会在更多的背景知识介绍了之后提到。 Node 的子类 构成了子图。Group 类Group
19、类是用于在虚拟世界中指定可视对象位置和方向的类的超类。 Group类的 两个下层类是 BranchGroup 是 TransformGroup. 在场景图的图形表现中, Group 标记 ( 用圆表示 )。而其中 BranchGroups 注为 GB, TransformGroups 注为 TG, 等等。具体例子请见图 1-2 。Leaf 类Leaf 是用于指定虚拟世界中可视对象的形状,声音和,动作的类的超类。 Leaf 的一些子类如Shape3D, Light, behav 1 or,和Sou nd.这些对象不能有自己的孩 子,并且可能引用 NodeComponents对象。NodeComp
20、 onent 类NodeComponent类是用于指定Shape3D (Leaf)结点对象的图形,表面,纹理和 材质属性的类的超类。NodeComp onents不是场景图的组成部分,但是为其所引 用。一个NodeComponent对象可能为多个Shape3D对象所引用(译者注:就是 比如,同一个材质对象可以赋予多个 shape3D对象)。java 3D API 官方教程 :1.4 编写 Java3D 程序的一般步骤SeeneGraphObject类的子类就是集成构建场景图的模块,一个Java3D程序的开 发大略可以分为七步(把它们聚在一起,在 Java 3D API 规范中和这里称之为 步骤
21、(recipe ),具体如下列表所示,这些方法可用于装配许多的Java3D程序。1. 创建一个Canvas3D对象。2. 创建一个 VirtualUniverse 对象。3. 创建一个 Locale 对象,并使之与 VirtualUniverse 相关联。4. 构建一个视图子图。a. 创建一个 View 对象。b. 创建一个 ViewPlatform 对象。c. 创建一个 PhysicalBody 对象。d. 创建一个 PhysicalEnvironment 对象。e. 把 ViewPlatform, PhysicalBody, PhysicalEnvironment, 和 Canvas3D
22、对象与 View 对象相关联。5. 构建一个或多个内容子图。 6. 编译所有子图。7. 把子图加到 Locale 对象中。表 1-1 编写 Java3D 程序的一般步骤这些步骤忽略了细节但是解释了Java 3D 编程中的基本概念。创建场景图中的子图是编程的主要部分。但我们并没有展开这些步骤详细讨论,本教程的下一部分解释了一种用更少 的代码更容易的手段来构建一个非常简单的场景图的方法。1.4.1 编写 Java 3D 程序的一个简单方法 用 基本方法编写具有视图分支图的 Java 3D programs 程序的结构有其唯一性, 构建视图分支子图结构的规则可以通过 SimpleUniverse 工
23、具类来实现 . SimpleUniverse 的实例承担了构建场景图的基本步骤中的第 2, 3 以及第 4 步 利用 SimpleUniverse 类来进行 Java3D 编程,可以大大减少创建视图分支图的 时间和精力,从而,程序员可以有更多的时间来构 建内容分支子图,这才是真 正与 Java3D 程序事关重大的。SimpleUniverse 类对于 Java 3D 编程而言真是一个很好的起点,因为它允许程 序员暂时忽略视图子图的存在 . 尽管如此, SimpleUniverse 中也不允许同一个 虚拟世界存在多个视图。本 教程的所有例子程序都用到了 SimpleUniverse 类,因此,如
24、果程序员想获 得更多的关于 View, ViewPlatform, PhysicalBody, 和 PhysicalEnvironment 类的信息请参考其它参考资料,附录 B 有详细的参考资料列表。SimpleUniverse 类SimpleUniverse 对象的构造函数创建了包含 VirtualUniverse 、Locale 对象 以及一个完整的视图子图在内的场景图, SimpleUniverse 创建的视图子图是用 了 ViewingPlatform 和 Viewer 便利类的实例来代替了其它核心类来创建视图 子图。注意到 SimpleUniverse 仅仅是没有直接用到 Java3
25、D 核心类中的 View 和 ViewPlatform 对象的。SimpleUniverse 对象提供了图1-7中大方框中的所有功 能。 com.sun.j3d.utils.universe 包包括了 SimpleUniverse,ViewingPlatform, 和 Viewer convenience 工具类利用一个SimpleUniverse对象可以使构造 Java3D程序的基本步骤更加简单,表1-2展示了简单的方法。这是用 SimpleUniverse对象之后构建 Java3D程序所需的步骤,上文所提 到的基本步骤的第2, 3,和4步已经被本方法的第 2步所替代。1. 创建一个Canv
26、as3D对象。2. 创建一个SimpleUniverse对象,并添加对先前创建的 Canvas3D对象的引用。a.定希9 SimpleUniverse 对象。3. 构建内容子图。4. 编译内容分支子图。5. 把内容子图添加到SimpleUniverse的Locale中。表1-2用SimpleUniverse创建Java3D程序的简单步骤下 面的灰框中的内容是本教程中参考模块的第一次出现。参考模块一般对一个 类的构造函数、方法和属性作了个列表。使用参考模块的目的在于使读者能在 手头上没有 其他参考资料的情况下能学到基本的Java 3D API编程知识。本教程中的参考块并没有涉及到每一个类的构造函
27、数和方法,由于这个原因,很多 的Java 3D API类都没有列出参考块。因此,本教程的文档本不能替代Java 3DAPI规范的位置,尽管如此,列出了构造函数、方法和属性的参考块的这些类, 本教程所提供的信息往往比Java 3D API规范所提供的信息更加详实。SimpleUniverse 构造函数包:com.s un .j3d.utils. uni verse这个类构建了一个尽可能小的用户环境,以使Java3D程序能尽快尽简单地运转 起来。这个工具类创建了视图子图中所必需的所有对象。特别是创建了 Locale,VirtualUniverse, ViewingPlatform,和 Viewer
28、 对象,(构建这些对象时统统使用默认值).这些对象以恰当的关系构成了视图子图。SimpleUniverse提供了许多基本的Java 3D应用程序所必需的全部功能. Viewer和ViewingPlatform 都是很方便的工具类.这些类用到了 View和 ViewPlatform 核心类。SimpleUniverse。构建一个包含视图子图的简单虚拟世界。.SimpleUniverse(Canvas3D canvas3D)构建一个简单虚拟世界并与指定的Canv as3D对象建立关联构建一个简单虚拟世界并与指定的 Canv as3D对象建立关联。SimpleU niverse对象创建了虚拟世界中一
29、个完全的视图分支子图。这个视图分支图包括一个图板(image plate )。 Java 3D把场景内容投影到图板块上形成一 个渲染图象。Can vas3D对象,提供了在计算机的窗口上显示图象,就可以看做 图板。图1-9,显示了图象图板,观察者位置和虚拟世界的关系。观察者在图板后面。而可视对象在图板之前并能在图板上进行渲染。 渲染就可以看作是可视对象到图 板上的投影。这个观点就如图中的四个方向上的投影仪(虚线所示)默认地,图板位置 SimpleUniverse原始位置的中心,默认的方向是从Z轴从上往下看的。从这个位置上看,X轴是一条正向在右边的水平穿过图板的直线,而Y轴是垂直穿过图板中心、正向
30、在上方的直线。因此,点(0,0,0)就处于图板的正中央。一般的Java3D程序,都把视图往后退(Z轴正向)(译者注:物体前移,往Z轴正向移,或往图外移),以使物体处于或者离原始视图比较近。SimpleUniverse 类有一个ViewingPlatform 的类的实例作为成员对象,ViewingPlatform 类也有 一个setNomi nalViewi ngTra nsform的方法来设置观察者(眼睛)的位置,使之位于(0, 0, 2.41)( looki ng in the n egative z directi on toward theorigin ?).Viewi ngPlatform setNomi nalViewi ngTra nsform() 方法包:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版饭店转让合同与消防安全设施建设及维护协议
- 2025版建筑工程合同管理制度与施工合同档案管理
- 2025年度绿色建筑节能改造项目房屋分期买卖合同范本
- 2025餐厅食品安全与卫生标准合作协议范本
- 2025版冷库库房环境监测设备采购及数据服务合同
- 2025版汽车租赁服务及广告植入合同
- 二零二五年度家具售后服务与品牌形象塑造合同范本
- 二零二五年度教师教育教学改革聘用协议
- 2025版混凝土加工与产业链优化升级合同
- 2025年足部按摩师(按摩工具与设备)考试试卷
- 2025年医药卫生考试-伤口造口师伤口造口专科护士造口治疗师历年参考题库含答案解析(5套合计100道单选)
- 北师版 二年级 数学 上册《综合与实践 参加欢乐购物活动》课件
- 会计资料调阅管理办法
- 膀胱结石护理业务查房
- 8D报告培训(经典)课件
- 2025版离婚协议标准范本及婚姻解除与财产分割
- 2025至2030中国钢格栅行业发展趋势分析与未来投资战略咨询研究报告
- 四川省建制镇生活污水处理设施建设和运 行管理技术导则
- 超声科副主任竞聘演讲
- 乡镇统计培训会课件
- 环境检测工(采样技术)岗位面试问题及答案
评论
0/150
提交评论