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