private void createSceneGraph( )
{
sceneBG = new BranchGroup( );
bounds = new BoundingSphere(new Point3d(0,0,0), BOUNDSIZE);
lightScene( ); // add the lights
addBackground( ); // add the sky
sceneBG.addChild( new CheckerFloor( ).getBG( ) ); // add floor
floatingSphere( ); // add the floating sphere
pile( ); // fix the scene
} // end of createSceneGraph( )
使用不同的方法来增加子图到 sceneBG以建立需要的子视图。一旦图形被绘制完毕后,并允许Java3D来优化他,sceneBG 便只被编译一次。优化包括重排图形、重新组合编译节点。例如一连串的包含不同转换的TransformGroup 节点会被编译成一个独立节点。另一个可能的优化是把具有相同显示属性的图形编成组,以便能更快地描绘。
bounds是一个 BoundingSphere 类的全局实例,他用来指定环境节点对灯光、背景和OrbitBehavior 对象的影响。跳跃的球体被放在场景的中心,被赋 BOUNDSIZE 单位半径,并影响场景中所有事件。
最后的 WrapCheckers3D( ) 所显示的场景图象在图15-3中。"Floor Branch" 节点是我发明出来掩藏一些细节,稍后将会涉及。图15-3所缺少的是场景图形的分支部分。
场景灯光
通过 lightScene( ).把一个环境灯光、两个有向灯光加入到场景中。环境灯光能到达场景中的每个角落,并且强度相同。
Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
// Set up the ambient light
AmbientLight ambientLightNode = new AmbientLight(white);
ambientLightNode.setInfluencingBounds(bounds);
sceneBG.addChild(ambientLightNode);
有向灯光模拟的一个从原处照射来的一束灯光,并从特定方向碰上物体表面。有向灯光和环境灯光的区别是有向灯光必须是方向向量。
Vector3f light1Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
// left, down, backwards
DirectionalLight light1 = new DirectionalLight(white, light1Direction);
light1.setInfluencingBounds(bounds);
sceneBG.addChild(light1);
Figure 15-3. Partial scene graph for Checkers3D
方向是介于(0,0,0)和(-1,-1,-1)的向量。灯光可以想象成是很多从不同方向,不同来源的平行灯光汇聚而成。点光和场光是Java 3D灯光的另外一种形式。点光放置在空间中,并向所有方向发射。场光以特定方向朝点光聚焦。
场景的背景
场景的背景可以指定为特定的背景(如下所示),一个静态图像或这是一个带形体的几何材质。
Background back = new Background( );
back.setApplicationBounds( bounds );
back.setColor(0.17f, 0.65f, 0.92f); // sky color
sceneBG.addChild( back );
浮动的球体
Sphere 是来自Java 3D的 com.sun.j3d.utils.geometry 包的一个工具类,是Primitive 类的一个子类,Primitive 类为带有 Shape3D 孩子节点的一个 Group 节点。他的几何特性存储在Java 3D的 TriangleStripArray,这种类把球体看成一组可连接的三角形体。我没必要校准他的几何特性,但是他的现实和位置要改变。
Appearance 节点是一个包含很多信息的容器,包含颜色、线条、点、多边形、描绘、透明度和材质特性。ColouringAttributes 确定形体的颜色,而且不受场景灯光影响。如果一个形体需要颜色和灯光的交互作用,就要用到 Material 组件。灯光要影响形体的颜色必须满足三种情况:
• 形体的几何特性必须是标准的。
• 形体的 Appearance 节点必须拥有 Material 组件。
• Material 必须用 setLightingEnable( )打开他的光照允许。
用工具类 Sphere 能自动制作成标准形体,所以第一种情况容易满足。
形体颜色
Java 3D Material 组件控制当一个形体被不同种类的灯光照射后的颜色。