java教程

  • 格式:docx
  • 大小:489.94 KB
  • 文档页数:18

Java3D探奇2007年12月07日星期五 00:02本教程是为没有任何 3D 编程经验的 Java 程序员而编写的。

我们将从一些基本的 3D 概念入手,探索如何构建一副场景图—用于描述我们想要渲染的场景的基本对象。

然后,我们将接触 Java 3D 的一些更强大的功能。

我们的重点将放在使用一些 Java 3D 实用类来开始您的编程。

预备知识对 3D 编程没有任何经验的程序员都可以是本教程的读者。

系统需求浏览器:Netscape 4.x 或更高版本, 或者 Internet Explorer 4.x 或更高版本,支持 Javas cript 。

思想Java 3D API 的设计是对以前流行的诸如 OpenGL 和 Direct3D 的 3D 图形API 的重大革新(以前的 API 是同 3D 硬件设计紧密结合的低级过程性 API)。

Java 3D 是一种功能强大的、面向对象的 API,它提供了许多超出我们认为作为“3D 图形API”所能有的功能。

Java 程序员可能会发现 Java 3D 编程环境非常熟悉而且易用。

Java 3D 做了许多事情来为您管理图形数据,这样就使得您可以把精力集中在其它编程工作上。

使用 Java 3D,首先要在场景图中设置所有的图形对象(也称为几何对象),场景图是一个层次模型,它包含有关场景中的对象以及如何渲染它们的全部信息。

然后,将该场景图交由 Java 3D 渲染。

您无须为显示数据而编写任何代码― Java 3D 为您完成了这项工作。

通过使用内置的强大工具,您可以在一个更高的级别上进行编程。

对速度的需要3D 程序员十分在意性能,这是有其原因的― 他们的应用程序往往对性能非常敏感。

如果旋转的 CAD 模型没有平滑地旋转,或者 3D 应用程序用户不能够交互地抓取一个对象并移动它,用户将会立即注意到这一点。

令人欣慰的是,Java 3D 能够利用图形适配器所提供的任何 3D 加速性能。

Java 3D 最终会在 JNI 层生成可以由图形卡加速的 OpenGL 调用。

新工作站通常装有OpenGL 加速适配器,因此您的 Java 3D 程序应该可以由硬件加速。

那么意义何在呢?3D 图形将向您生活添加一个全新的维:z 维。

在三维坐标(x,y,z)中,Z 指定该坐标离观察者的距离。

Java 3D 使用 z 值除去远处遮住对象的不可见的表面。

因为下图中的红色圆环离观察者的距离近,所以它的 z 值很小。

当在渲染期间同时比较这两个圆环的 Z 值时,它将遮住蓝色圆环的一部分。

3D 对象包含在一起渲染的坐标集合(请参阅 Primitive 类)。

您可以将它们渲染为点、线和多边形。

游戏程序员可能想使用点来模仿怪物冲向玩家时射出的一串子弹。

CAD 设计者为了看清她所设计的相当精确对象的更多细节,可能希望以线渲染。

而当汽车设计者完成汽车对象的大部分设计的时候,他可以不是使用线框而是使用实心多边形的形式来渲染坐标。

尽管实心多边形看起来更接近现实,但却不允许设计者方便地使用描述对象表面的基本数据。

在本教程中,我们将始终绘制多边形,因为这其中乐趣无穷。

移动对象在创建完想显示的对象之后,我们可以使用 3D 变换来移动或缩放它们, 实际上就是让对象动起来。

例如,当您玩 Quake 时,该游戏程序通过控制坏家伙的 3D 变换来表现他向您冲过来的效果。

您视线的位置、方向和走向(在您被打成碎片之前!)被称为视点(viewpoint)。

当您偷偷地四处寻找更多弹药的时候,变换更改您的视点。

变换在功能强大的 Transform3D 类中作为矩阵指定。

Transform3D 提供许多助手函数以指定常见的变换,诸如平移、旋转和缩放。

光照和其它效果除了指定在场景中显示什么对象之外,我们还可以通过指定光照效果来控制它们的显示方式(有关光照的更详细信息,请参阅 Light 类)。

您可以指定光照的效果类型,例如聚光灯,以及光的颜色。

您还可以给您的场景指定雾化效果并且设置对象的自动行为。

材质贴图(通常称为粘贴墙纸)通常用于使场景更真实。

例如,您可以使用木纹(wood grain)图像作为对象的表面来模仿橡木桌面。

几何对象不一定非得是非透明的;它们可以是透明的或半透明的。

下图中的灯使用了透明和光照效果,陶器使用了材质贴图。

场景图树Java 3D 场景图是一棵由两个部分或分支组成的树,这两个部分是:内容(content)和视图(view)。

视图分支含有复杂 Java 3D 视图模型的所有细节,它还定义视点。

好的事情是,对于大多数简单的应用我们都可以使用统一实用类(尤其是“正如其名称所暗示”的 SimpleUniverse 类)来处理视图管理的大多数复杂任务。

内容分支描述了您将在场景中看到什么。

它包含所有图形对象(球体、立方体或更复杂的几何对象)、用来移动它们的转换、光、行为、组节点和烟雾。

我们的大多数工作将集中在内容分支。

组节点Group 对象组成了场景图内容分支的内部节点。

您可以使用 Group 节点来将您的场景图组织成相互关联的部分。

每个 Group 节点包含一些子节点,在处理该节点时将渲染这些子节点。

Switch 节点和 TransformGroup 节点是特殊的Group 节点,它允许您对场景图施加进一步的控制。

TransformGroup 节点在处理期间对它们的子节点应用 3D 变换(诸如平移、缩放或旋转),这使得您可以移动、旋转或缩放整个场景图。

Switch 节点限制在渲染期间访问哪些子节点,使您可以控制渲染场景图的哪些部分。

以 Quake 为例,您可以将所有不同的武器分组到一个 Switch 节点下面,使得您可以只渲染当前使用的武器。

能力位(Capability bits)Java 3D 将会通过尽可能地预先计算值来优化场景图的渲染。

如果想在渲染场景时更改场景的某些方面,则必须使用能力位来指定以后想更改的数据。

例如,使一个对象动起来需要更改影响该对象的变换。

为了做到这一点,需要在TransformGroup 中启用 ALLOW_TRANSFORM_WRITE 位,如下所示:suzySpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);在将场景图附加到空间(universe)之前,可以对它做任何想做的更改。

然而,在 Java 3D 开始渲染之后,就只允许对设置了适当能力位的对象进行更改。

UglyCube 示例。

但是需要提醒的是,它确实很乏味。

UglyCube 只显示一个立方体。

它摘自 Java 3D SDK 所带的示例HelloUniverse 。

在该样本中,创建了一个 Canvas3D 以在其上绘图,并创建了一个 SimpleUniverse 来为您处理所有的视图管理工作。

内容分支的顶部总是BranchGroup。

我们将 cube 作为子对象添加并交给 BranchGroup 以便渲染。

当将 BranchGroup 添加到 SimpleUniverse 之后,Java 3D 将不断循环地进行渲染。

稍后,我们将添加不同类型的节点,例如光和行为。

下面是该示例中的一些重要的行:Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());setLayout(new BorderLayout());add("Center", canvas);BranchGroup scene = new BranchGroup();scene.addChild(new ColorCube(0.4));SimpleUniverse u = new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();u.addBranchGraph(scene);看,我说过它很乏味吧。

场景图要点SimpleUniverse 创建场景图的视图分支。

Group 节点将分层结构加到场景图上。

能力位允许访问场景图节点中的数据。

Primitive 类Primitive 是用于几何对象的抽象类,这些用在场景图中的几何对象可以作为简单构件块使用。

Java 3D 包括 Primitive 的几个具体子类― Sphere、Box、Cone 和Cylinder ― 这些子类使得您可以无须指定许多数据就能轻松地创建基本对象。

例如,当使用 Sphere 类时,您只需指定半径,然后,就会为您生成所有的顶点数据。

在本教程中我们将只使用 Primitive,以便您无须陷入必须指定所有图形数据的细节中Shape3D 类如果您不使用某个 Primitive 类,那么您将不得不使用 Shape3D 类来指定所有顶点数据。

您可以将数据指定为三角形、四边形、直线和点。

通常通过使用一些互相连接的三角形或四边形条带将球体的几何表示定义成多边形网格。

下图可以让您了解这些条带是如何合并形成网格。

为了突出这些条带,对它们使用了不同的颜色。

在该 Shape3D 对象中,每条三角形条带都与相临的三角形条带共享公共顶点,当渲染它们的时候就形成一个网格表面。

每顶点数据(Per-vertex data)每个顶点至少必须有一个位置值(坐标)。

除此之外,还可以为每个顶点指定其它值,如颜色值、法向矢量和材质坐标。

法向矢量用于光照效果,材质坐标在通过材质贴图将材质应用到表面时使用。

此外,每个顶点也可以含有 alpha 或透明度值同其颜色一起指定。

幸运的是,当使用 Primitive 类时,会为您生成顶点法线和材质坐标。

我们将会探讨最常用的每顶点属性,顶点法线和方向坐标。

Apperance 对象虽然您可以用每个顶点指定大量的数据,但是许多图形效果却是通过使用Appearance 对象来应用的。

该对象描述一个对象表面的整体属性。

每个 Shape3D 和 Primitive 对象都将有自己的 Appearance 对象,并且每个 Appearance 对象都包含几个属性对象。

例如,Appearance 对象可以包含 ColoringAttributes 对象和 RenderingAttributes 对象。

如您可见,有了这些不同的图形数据类型,Java 3D 应用程序一下子变得很复杂。

为简单起见,我们将只讨论 Texture 和 Material 属性类。

小测验让我们做个测验来测试一下您目前的知识。

Primitive 基类用于以下项中的哪一项:1.Java 3D 生成的高级几何对象2.定义球、圆锥体、圆柱体和立方体3.指定史前岩洞绘画4.1 和 2Transform3D 类变换允许您在场景中移动、旋转或调整几何对象的大小,也可以用来影响查看场景的方式。