这个类用于指定可视对象或一组可视对象的旋转行为,一个RotationIterpolator对象根据Alpha对象的值来改变一个TransformGroup对象来指定旋转。因为一个Alpah对象的值随着时间来改变,从而旋转值也在改变。一个RotationInterpolator对象在指定旋转坐标,开始的角度,结束角度方面是很灵活的。比如一个简单的常量旋转, RotationInterpolator 对象有如下的构造函数可以使用。
RotationInterpolator 构造函数 (列出部分) 这个类定义了一个行为,能在一对角度(指定的Alpha对象所产生的值)之间线性地插入修改其目标TransoformGroup的旋转组件。这个插入的角度就用于生成一个变换。 RotationInterpolator(Alpha alpha, TransformGroup target) 这个构造函数为这个插入器的一些参数设置了默认的值,用指定的插入器目标TransformGroup参数构造了一个完全的围绕Y轴的旋转变换。 alpha –根据函数的引用的不同而时间也不同。 target – 要修改的TransformGroup对象 一个插入器的目标的TransformGroup对象必须有写的能力,关于能力位于1.8节中所述. |
有一些方法来设定计划区域,其中最简单的方法是构造一个BoundingSphere对象,其它可选的方法包括一个固定范围的矩形框和一个设定范围的多边形。下面讨论了BoundingSphere 类,而关于BoundingBox 类和BoundingPolytope类的更多信息,请参考API规范。
Behavior类的setSchedulingBounds方法
void setSchedulingBounds(Bounds region)
用指定的范围参数来设置Behavior的计划区域。
region – 包含了行为计划范围的区域。
BoundingSphere类
通过指定一个中心点和球的半径来设置一个区域球体。一般情况下这个区域球体以(0,0,0)点为中心,而半径则大到包含可视对象所有可能位置在内。
范围球体构造函数(部分列出)
这个类通过中心和半径来定义一个球体范围区域。
BoundingSphere()
这个构造函数定义一个中心在(0,0,0)半径为1的构造函数。
BoundingSphere(Point3d center, double radius)
通过给定的中心点和半径参数来构造和初始化一个BoundingSphere 。方法中的第一步是创建一个在运行时能修改的TransformGroup. 插入器的目标TransformGroup 对象必须设置写能力位,一个名为objSpin的TransformGroup对象在代码的第7行创建。objSpin的能力位在代码段1-7的第8行设置。第2步是创建驱动插入器的alpha对象。在这个代码段1-7所示的简单示例中,Alpha对象叫rotationAlpha,这个对象用于设置连续旋转。而代码段1-7的第16行则设置这个循环的循环迭代数和时间两个参数。旋转次数为”-1”时表示连续循环,时间则以毫秒的方式指定,在这个程序中如果值为4000,则表示4000毫秒,也就是4秒。因此,这就表示,这个行为是每4秒旋转一次。
方法的第3步就是构造插入器对象,RotationInterpolator对象在第21行和第22行指定构造。 插入器必须拥有目标形变和alpha对象的引用,这也是在构造函数中完成的。在这个例子中, 运用的是RotationInterpolator的默认行为。RotationInterpolator的默认行为是创建一个Y轴的全旋转。第4步是指定一个范围区域。代码段1-7中,BoundingSphere对象也是使用了它的默认值。BoundingSphere对象是在第25行创建的。这个球体当作行为的范围在第26行设置。在最后一步,也就是第5步,就是把行为作为TransformGroup的子对象加入其中,这个操作在代码的第27行完成。
1. public BranchGroup createSceneGraph() {
2. // 创建子图的根结点
3. BranchGroup objRoot = new BranchGroup();
4.
5. // 创建变换组,并用单位矩阵来初始化。
6. // 并加其作为子图的孩子结点加到子图中。
7. TransformGroup objSpin = new TransformGroup();
8. objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
9. objRoot.addChild(objSpin);
10.
11. // 创建一个简单的形状叶子结点.并把加其入子图中。
12. // ColorCube是一个方便的工具类
13. objSpin.addChild(new ColorCube(0.4));
14.
15. // create time varying function to drive the animation
16. Alpha rotationAlpha = new Alpha(-1, 4000);
17.
18. //创建一个新的Behavior对象来实现预期的操作。
19. // 并指定其形变对象,把其作为孩子结点加入到
20. // 场景图中。
21. RotationInterpolator rotator =
22. new RotationInterpolator(rotationAlpha, objSpin);
23.
24. // 一个范围球体是行为活跃区域。
25. BoundingSphere bounds = new BoundingSphere();
26. rotator.setSchedulingBounds(bounds);
27. objSpin.addChild(rotator);
28.
29. return objRoot;
30. } // createSceneGraph方法代码结束
代码段 1-7使用了RotationInterpolator行为的createSceneGraph方法
代码段1-7用了以前的一些代码段来组成这个示例程序HelloJava3Dc. HelloJava3Dc.java可以在目录 examples/HelloJava3D/中找到并且可以作为应用程序执行。运行的应用程序以每四秒一次的旋转的行为来渲染ColorCube 。
HelloJava3Dc中所创建的场景图如图1-18所示,旋转对象既是TransformGroup objSpin对孩子结点,又有对其的引用。而这个关系看起来好象与场景图中无环的限制相冲突,实则不是。调用引用的弧 (虚线箭头所示)并不是场景图的一部分。从Behavior 到TransformGroup的虚线就是这个引用。
图片1-19 显示了HelloJava3Dc中定格的ColorCube框架窗体
代码如代码段1-8所示,而相对应的场景图于图1-20所示。
1. public BranchGroup createSceneGraph() {
2. // 创建分支图根结点
3. BranchGroup objRoot = new BranchGroup();
4.
5. //由复合变换矩阵构造的旋转对象
6. Transform3D rotate = new Transform3D();
7. Transform3D tempRotate = new Transform3D();
8.
9. rotate.rotX(Math.PI/4.0d);
10. tempRotate.rotY(Math.PI/5.0d);
11. rotate.mul(tempRotate);
12.
13. TransformGroup objRotate = new TransformGroup(rotate);
14.
15. // 创建变换组结点,并用单位矩阵对变换进行初始化。
16. // 设置TRANSFORM_WRITE能力,以使能在运用时
17. // 修改行为代码。
18. // 并把其加入到子图的根结点中。
19. TransformGroup objSpin = new TransformGroup();
20. objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
21.
22. objRoot.addChild(objRotate);
23. objRotate.addChild(objSpin);
24.
25. // 创建一个简单的形状叶子结点.并把加其入子图中。
26. // ColorCube是一个方便的工具类
27. objSpin.addChild(new ColorCube(0.4));
28.
29. //创建一个新的Behavior对象来实现预期的操作。
30. // 并指定其形变对象,把其作为孩子结点加入到
31. // 场景图中。
32. Transform3D yAxis = new Transform3D();
33. Alpha rotationAlpha = new Alpha(-1, 4000);
34.
35. RotationInterpolator rotator =
36. new RotationInterpolator(rotationAlpha, objSpin, yAxis,
37. 0.0f, (float) Math.PI*2.0f);
38.
39. // 一个范围球体是行为活跃区域。
40. // 构造一个以圆点为中心半径为1的球体。
41. BoundingSphere bounds = new BoundingSphere();
42. rotator.setSchedulingBounds(bounds);
43. objSpin.addChild(rotator);
44.
45. return objRoot;
46. } // HelloJava3Dd 的createSceneGraph方法代码结束。
代码段1-8 HelloJava3Dd 中旋转的彩色立方体的内空分支图的构建
图1-21的图片是HelloJava3Dd中旋转彩色立方体