Java 3D API官方教程[翻译一]

   Java 3D API官方教程[翻译一]

开始学习Java3D API

1

第一章、入门

本章目标:

学习了本章之后,你能:

•能用一些基本术语解释什么是Java3D

•能描述出Java3D程序的基本结构。

•能识别出Java3D API中的许多类。

•能编写出简单的Java3D动画程序。

      Java 3D API是一个用于编写显示和交互操作三维图形对象的程序的接口。Java 3D也是在Java2 Java开发包(JDK)上的标准扩展。这个API提供了用于创建和操纵3D图形的高端构成方法以及渲染该图形的一些数据结构。Java3D 提供了创建图片、可视化、动画以及3D交互图形应用程序的函数。

1.1 什么是Java 3D API?

       Javae 3D API是作为复杂三维图形和声音渲染系统的接口的一系列层次的JAVA类的统称。

       程序员可以用Java3D开发创建和操纵3D图形对象的高端应用。这个图形对象处于一个被渲染了的虚拟世界(Virtual Universe)中。这个API就是用设计来用于灵活方便地创建精确的各种大小的虚拟环境,可以大到大空物体,小到比原子还小。

     除了这些功能之外,API的使用也很直接,API能自动处理渲染的细节,由于利用了Java线程机制的优势,所以Java3D的渲染器的工作是并行进行的。并且渲染器也能自动地优化并提高渲染性能。   

     一个Java3D程序创建了Java3D对象的实际,并将其置之于场景图数据结构中。在这个场景图中,所有3D对象用完全指定了虚拟世界内容和其如何被渲染的树形结构存储,

     Java3D程序能写成能独立运行的应用程序,或者写成能嵌入在浏览器中运行的Applets,或者二者兼备。

1.2 Java 3D API

  每一个Java3D程序至少部分地集成了来自Java类层次中的对象,这些对象的集合称做虚拟世界(virtual universe),这就是将要被渲染的对象。此API在javax.media.j3d包中定义了超过100多个类,这些类我们平常称做Java3D核心类。

   在Java3D API中有数以百计的属性和方法。尽管如此,一个包含动画功能的简单的虚拟世界的构建仅仅需要几个类就行。本章讨论了用尽少的对象集合和交互来渲染一个简单虚拟世界。

    本章包含了一个简单但是完全的叫HelloJava3D的程序的开发过程,这个程序显示了一个能旋转的立方体,这个示例程序是逐步开发完成的,因此这个程 序用了很多版本来展示Java 3D编程过程中的每一部分。本教程中的所有程序都可以获得电子的版本。更多的信息请见前言中的"获得本教程"[译者注:http://java.sun.com/products/java-media/3D/collateral/]。

   除了Java3D核心包之外,Java3D程序设计也会用到其它的包,比如com.sun.j3d.utils,这个包通常称做Java3D工具类,核心类中仅仅包含了在Java3D编程中必段的最底层的类,而工具类是对核心类方便而强大的补充。

   工具类主要分为四类:内容加载器、场景图构建辅助类、图形类和方便的一些工具类。将来还有一些功能,比如nurbs[non-uniform rational B-spline,非均匀有理B样条],也会加到工具类,而不是Java3D核心包中。而一些工具类在Java 3D API 将来的版本中也可能会移到核心包中去。

   利用工具类大大地减少了Java3D程序中的代码行数。除Java3D核心类和工具类包之外,每一个Java3D程序还引用了java.awt包和 javax.vecmath包中的类. java.awt包就是Abstract WindowingToolkit (AWT). AWT类用于创建显示和渲染场景和窗口。而javax.vecmath包则定义了对点、矢量、矩阵以及其他数学对象进行数学运算的类。

     在余下的教程中,词汇可视对象(visual object)就是场景图中的对象比如一个立方体或者球体。对象(object)则是指一个类的实例。而内容(content)指的是一个场景图中全部的可视对象。

1.3 构建场景图

     一个Java3D的虚拟世界创建自一个场景图,而场景图就是由Java3D类的实例构建而成.场景图集成了定义图形、声音、光线、位置、方向以及可视物体和声音对象的表面属性等对象。 一个通常的图形定义是一个由结点和弧边组成的数据结构。一个结点是一个数据元素,而边则是数据元素之间的关系。场景图中的结点就是Java3D类的实例,而边展示了这些Java 3D实例之间的两种关系。最为通用的关系是就是父子关系(parent-child relationship),一组结点可以有任意数目的孩子却只能有一个双亲。一个叶子结果可以有一个双亲但是没有孩子。

另一个关系是引用(reference)。一个引用与场景图结点中的结点组件(NodeComponent)对象相关联。结点组件定义了用于渲染可视对象的图形和表面属性。

Java 3D场景图就是由一堆具有父子关系的结点构建成的树形结构。在树形结构里,其中有且仅有一个结点是根结点,共他结点都可以顺着从根开始的弧边可以访问到,树形结构中的结点是没有回路的。一个场景图就是由植根于本地(Locale)对象的树而形成的。结点组件和引用弧边都不是场景图树的组成部分。

在树形结构中,从根结点到叶子结点有且仅有一条路径,因此,从场景图的根到其每个叶子结点也仅有一条路径。从场景图根结点到到特点叶子结果的路径我们称之为该叶子结点的场景图路径(scene graph path)。 因此,一条场景图路径恰恰只通向了一个叶子结点。而在场景图中从根到每个叶子结点都有一条这样的路径。在Java3D场景图中的每一条场景图路径也完全地 定义了路径的叶子的状态信息。状态信息包括位置、方向、可视对象的大小。由此可见,每一个可视对象的可视属性仅仅由其场景图路私决定。Java3D渲染利 用这点,以仅可能有效地按它所定义的顺序来渲染叶子对象。Java 3D程序员一般情况下不用控制渲染对象的顺序。[原注:Java3D 程序员仅仅可以用来控制渲染对象顺序的是OrderedGroup类结点,在本教程中对此部分未加论述,请参见Java3D API规范文档]

 

在树形结构中,从根结点到叶子结点有且仅有一条路径,因此,从场景图的根到其每个叶子结点也仅有一条路径。从场景图根结点到到特点叶子结果的路径我们称之为该叶子结点的场景图路径(scene graph path)。 因此,一条场景图路径恰恰只通向了一个叶子结点。而在场景图中从根到每个叶子结点都有一条这样的路径。在Java3D场景图中的每一条场景图路径也完全地 定义了路径的叶子的状态信息。状态信息包括位置、方向、可视对象的大小。由此可见,每一个可视对象的可视属性仅仅由其场景图路私决定。Java3D渲染利 用这点,以仅可能有效地按它所定义的顺序来渲染叶子对象。Java 3D程序员一般情况下不用控制渲染对象的顺序。[原注:Java3D 程序员仅仅可以用来控制渲染对象顺序的是OrderedGroup类结点,在本教程中对此部分未加论述,请参见Java3D API规范文档]

场景图的图形表示可以当作设计工具或者Java3D程序的文档。场景图一般用一些标准的图形标记来绘制,如图1-1所示。Java 3D程序可能不止有包含场景图中的这些对象。

可以用以上标志集合来设计一个Java3D虚拟世界场景图。等设计上的事情完成后,场景图的设计就是程序设计的规范。等到程序也设计完成,同一个场景图就是程序的精解表现(假设程序是依照设计的图来进行的话)。一个从已有程序绘制成的场景图可以做创建程序场景图的文档。

可以用以上标志集合来设计一个Java3D虚拟世界场景图。等设计上的事情完成后,场景图的设计就是程序设计的规范。等到程序也设计完成,同一个场景图就是程序的精解表现(假设程序是依照设计的图来进行的话)。一个从已有程序绘制成的场景图可以做创建程序场景图的文档。

       图1-1左边所示的每一个标记代表了场景图中的每一个对象,前两个标记代表特定的类的对象,即VirtualUniversee和Locale类的对象, 下面的三个则常常用于标注特定对象[译者注:Group子类的对象等]的子类,最后一个标记用于表示其它类的对象。实线箭头表示两个所连接的对象之间存在 父子关系。而虚线箭头则表求一个对象是另一个对象的引用。引用的对象可以供一个场景图中的不同的分支所共享。一个简单的场景图的例子如图1-2所示。


    在平时,创建一个错误的场景图也是可能的,一个不合理的场景图的例子如图1-3所示.

      图1-3所描绘的场景图之所以不合理是因为它与有向无环图(Directed Acyclic Graph Or DAG)的规则相冲突.问题存在于两个 TransformGroup对象都以同样的 Shape3D叶 子对象作为其孩子。请记住,一个叶子结点只能一个双亲,也就是,从Locale对象到叶子结点只能有一条路径(或者从叶子结点到Locale对象只能有一 条路径)。你也许会认为,图1-3图所示的场景在虚拟世界中定义了三个可视对象。它看起来好像是这个场景图通过重用图形右边的可视对象(Shape3D) 而定义了两个对象。从概念上讲,每一个 TransformGroup 对象都作为共享的那个Shape3D的双亲,这个Shape3D的可视化对象可以允许在不同地方放置一张图片。尽管如此,由于父子边之间的关系构不成树形结构,所以这个场景图是不合法的。在这个例子中,表现为 Shape3D对象有多于一个以上的双亲。

 

     对树形结构和有向无环图的讨论是正确的,然而,Java 3D运行时系统会报告这类父子关系之间的错误。树形结构存在的限制是每一个 Shape3D 对象只能有一个双亲。

 

    从图1-3所示的例子看来,‘多亲'异常会在运行时报告出来。图1-4中,展示了这种不合法场景图的解决办法,每一个 Shape3D只有一个双亲。

       一个定义了不合理(法)场景图的Java3D程序可能通过编译,但是不会在运行时渲染。当一个定义了不合法场景图的Java3D程序运行时,Java3D 系统会检测到这个问题,从而会报告一个异常。程序还会继续运行,但是结果是,应该被关闭,没有任何渲染好的图象生成。每一个场景图有一个唯一的 VirtualUniverse,这个 VirtualUniverse有一系列 Locale 对象。

 

      一个Locale对象,提供了虚拟世界中的一个参考点。可以把Locale对象看作是在虚拟世界中定义可视对象位置的标志。一个Java3D程序有多于一 个的VirtualUniverse对象,技术上是可行的,因此,可以在虚拟世界中定义多个Locale对象,然而,在多个虚拟世界之间没有内在的沟通方 式,更进一步讲,一个场景图不能存于多个虚拟世界中。同时,我们强烈建议在一个Java 3D程序中只同时拥有有且仅有一个 VirtualUniverse。而一个VirtualUniverse 可能在多个Locale对象中引用,但是更多的Java 3D程序只有一个Locale对象,每一个Locale对象,可以作为场景图中多个子图的根结点。参考图1-2作为场景图的例子,注意到图中的Locale对象有两个子图分支。

 

     一个BranchGroup对象是子图的根结点,或者是分支图的根结点。场景子图可以分为两类,视图分支图(the view branch graph)和内容分支图( the content branch graph.)。内容分支图指定了虚拟世界的内容——图形,表面,动作,位置,声音以及光线等。视图分支子图指定了视图参数比如观看位置和方向。总的来说,两类子图指定了很多渲染要完成的工作。

1.3.1高端Java 3D API的类层次

图1-5显示了Java 3D API类层次中的前面三个层次。


VirtualUniverse, Locale, Group, 和 Leaf 类处于类层次中的这部分。除了VirtualUniverse 和Locale对象,场景图中余下的部分由SceneGraphObject 对象构成。SceneGraphObject 几乎是Java3D类中每一个核心类和工具类的超类[译者注:超类即上层类,可以是父类或者祖先类]。

SceneGraphObject 有两个子类: Node 类NodeComponent.类,Node子类提供了场景图中的绝大部分对象,一个Node对象可以是一个Group,也可是一个Leaf结点对象。

Group 和Leaf是一系列类的超类。这里可以一目了然地看到Node类的子类,它有两个子类,而 NodeComponent 类,在这些背景知识介绍之后,在Java3D程序的构建中会解释到。

Node 类

Node是Group和Leaf类的一个抽象超类. Node 为其子类定义了一些公共的重要的方法。某些方法的信息会在更多的背景知识介绍了之后提到。Node 的子类构成了子图。

Group 类

Group 类是用于在虚拟世界中指定可视对象位置和方向的类的超类。Group类的两个下层类是 BranchGroup是TransformGroup. 在场景图的图形表现中,Group标记 (用圆表示)。而其中BranchGroups注为GB, TransformGroups注为TG,等等。具体例子请见图1-2。

Leaf 类

Leaf是用于指定虚拟世界中可视对象的形状,声音和,动作的类的超类。Leaf的一些子类如Shape3D, Light, behavīor,和 Sound. 这些对象不能有自己的孩子,并且可能引用NodeComponents对象。

NodeComponent 类

NodeComponent 类是用于指定Shape3D (Leaf)结点对象的图形,表面,纹理和材质属性的类的超类。NodeComponents 不是场景图的组成部分,但是为其所引用。一个NodeComponent 对象可能为多个Shape3D对象所引用(译者注:就是比如,同一个材质对象可以赋予多个shape3D对象)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值