旋转立方体
天下维客,你可以修改的网络知识库
代码段1-5在场景图中集成了一个TransformGroup对象,使立方体能沿X轴旋转。这个旋转变换的创建的第一步是构造Transform3D对象rotate创建。 代码第6行构造了Transform3D 对象。而在第8行,用rotX方法指定了这个旋转变换。第10行利用已有的旋转变换构造了TransformGroup对象。
在旋转变换中指定了两个参数:一是旋转所依赖的坐标轴,二是旋转的角度。坐标系的指定是通过选定合适的方法来进行
的。而旋转的角度是通过指定所调用方法的参数来确定的。
因为旋转角度的指定是用弧度来表示的,所以PI/4就是1/8个圆,也就是45度。
创建了Transform3D 对象rotate之后,它便用于构造TransformGroup对象objRotate, (如第10行代码所示).Transform3D对象没有在场景图中用到(原文是The Transform3D object is used in the scene graph.译者认为有误)。 objRotate 对象然后把把ColorCube对象作为其孩子(见代码第11行),与其相同,objRoot对象也把objRotate 作为其孩子(代码第12所示)。
Transform3D类中的方法rotX(), rotY,和rotZ()在上一节的参考框中都有说明。
1. public BranchGroup createSceneGraph() {
2. // 创建内容分支图的根结点
3. BranchGroup objRoot = new BranchGroup();
4.
5. // rotate对象复合了变换矩阵。
6. Transform3D rotate = new Transform3D();
7.
8. rotate.rotX(Math.PI/4.0d);
9.
10. TransformGroup objRotate = new TransformGroup(rotate);
11. objRotate.addChild(new ColorCube(0.4));
12. objRoot.addChild(objRotate);
13. return objRoot;
14. } // createSceneGraph方法结束
代码段1-5 内容分支图中的一个旋转变换
现在在场景图路径中,内容分支图包含了一个对应ColorCube对象的TransformGroup 对象。此场景图路径中的每一个对
象都是必须的, BranchGroup对象是唯一一个能以一个Locale对象作为其子结点的对象。TransformGroup对象是唯一一能改变位置,方向和可视对象大小的对象。在这种例子中, TransformGroup对象改变了对象的方向,当然,ColorCube对 象是提供可视对象所必须的。这个内容分支图由代码段1-5构造,其场景图说明如图1-13所示。
代码段1-5不是示例程序目录下一个独立的程序,它只是作为里程碑展示了通往开发更大,更有趣的程序的方法。更大的问 题,将在下面的小节中讲到,它在一个TransformGroup对象中组合了两种变换。
1.7.1组合图形变换示例: HelloJava3Db
通常地一个可视对象要平移和旋转,或者同时围绕两个坐标系旋转。在上面的每一种情况中,一个可视对象都要指定两种不
同的变换。这两种变换会组合在同一个变换矩阵之中,并由同一个TransformGroup对象持有。代码段1-6说明了这种复合变的用法。
在示例程序HelloJava3Db中,组合了两种旋转变换,同时构造两种旋转变换需要组合两个旋转的Tranform3D对象。这个例
子中,立方体围绕X轴和Y轴旋转。两个Transform3D对象,每个旋转变换都创建了一个(见代码段第6行和第7行)。两个 Transform3D对象都分别指定了变换(见代码第9行和第10行)。(The individual rotations are specified for
the two TransformGroup objects (lines 9 and 10),原文有误,译者认为). 然后这个两个变换通过两个
Transform3D对象的相乘而组合(见代码第11行)。组合后的变换然后被加载到TransformGroup对象中(见代码第12行).
1. public BranchGroup createSceneGraph() {
2. // 创建分支子图根结点
3. BranchGroup objRoot = new BranchGroup();
4.
5. // 复合变换矩阵的rotate对象
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. TransformGroup objRotate = new TransformGroup(rotate);
13.
14. objRotate.addChild(new ColorCube(0.4));
15. objRoot.addChild(objRotate);
16. return objRoot;
代码段1-6 HelloJava3Db中两个旋转变换的复合代码段1-5或者是1-6都可以代替HelloJava3Da类中代码段1-2的位置来构
造一个新的程序。代码段1-6在HelloJava3Db.java文件中. 复合旋转变换的完整的示例程序在目录
examples/HelloJava3D/中的HelloJava3Db.java里.这个程序也能像HelloJava3Da一样独立运行。
HelloJava3Db.java文件所关联的场景图如图1-14所示.视图分支图的创建方法如同在HelloJava3Da中一样,用
SimpleUniverse类构建,在场景图中用一个大星号来代替。现在在场景图路径中,内容分支图包含了一个对应ColorCube对
象的TransformGroup 对象。




