- 最后登录
- 2013-6-5
- 注册时间
- 2011-7-16
- 阅读权限
- 90
- 积分
- 6011
- 纳金币
- 5996
- 精华
- 1
|
场景图树
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 节点将分层结构加到场景图上。
能力位允许访问场景图节点中的数据。
|
|