- 最后登录
- 2013-6-5
- 注册时间
- 2011-12-3
- 阅读权限
- 90
- 积分
- 6206
- 纳金币
- 6206
- 精华
- 0
|
Java 3D 的场景图是由两个分支组成的树状图,分别是:内容(content)和视图(view)。
视图分支中含有复杂的 Java 3D 所要描述视图模型的所有细节,还包括定义视点,幸好在大多数简单应用下可以用Java 3D中提供的统一实用类来处理这些视图管理方面的工作。
内容分支描述了在场景中你将看到什么,它包含所有图形对象的几何形状(球体、立方体等)、移动它们所用的转换、光亮度、它的行为、组节点和烟雾等,大多数需要程序员做的工作集中在内容分支。
组(Group)节点和能力位(Capability bits)
程序员可以使用 Group 节点来把场景图组织成相互关联的部分,每个 Group 节点还可包含一些子节点,在处理这些节点时将同时渲染这些子节点。
其中,Switch 节点和 TransformGroup 节点比较特殊,程序员可以通过它们对场景图实施进一步的控制。编译器在处理TransformGroup 节点时会同时对其子节点应用 3D 变换(如平移、缩放或旋转),这使得程序员可以移动、旋转或缩放整个场景图。而Switch 节点会限制在渲染期间访问的子节点,使程序员可以控制渲染场景图某个具体部分。(纳金网注:以3D游戏 Quake 为例,如果将不同武器分组到一个 Switch 节点下,就可以实现只渲染当前的武器)
Java 3D 会尽可能地通过预先计算来优化渲染过程,如果想在渲染时更改场景,则必须先用能力位指定想更改的数据。例如,如果使一个对象动起来时要更改影响该对象的变换,则要先在 TransformGroup 中开启 ALLOW_TRANSFORM_WRITE 位,代码如下(纳金网注:能力位允许访问场景图节点中的数据):
suzySpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
场景图在附加到空间(universe)之前,可以对它做任意更改。然而,在 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);
范例中首先创建一个 Canvas3D 以在其上绘图,同时创建一个 SimpleUniverse 分支来处理所有的与视图管理工作相关的参数。注意内容分支的顶部总是 BranchGroup,将 ClolrCube 作为子对象添加给 BranchGroup 渲染。当将 BranchGroup 添加到 SimpleUniverse 之后,Java 3D 将不断循环地进行渲染。
|
|