Java 3D API官方教程[翻译三]

  Java 3D API官方教程[翻译三]
BranchGroup 对象都是可以编译的(compiled)。 编译一个BranchGroup 可以把一个BranchGroup对象和其所有祖先变成一种渲染器所能更高效地渲染的格式。推荐编译一个BranchGroup对象在使之变为活对象之前 的最后一步进行,并且最好只编译一遍插入Locale中的所有BranchGroup。在1.8节和1.8.1节更进一步讨论了编译问题。


BranchGroup compile() 方法
void compile()
通过创建和缓存一个编译过的场景图来把与这个对象相关联的源BranchGroup进行编译。

 

编译和变活的概念是SceneGraphObject中实现的。与这些概念相关的SceneGraphObject 类的两个方法在SceneGraphObject的方法的参考框中得到说明。


SceneGraphObject 方法 (部分列出)
SceneGraphObject 几乎是Group中创建场景图的每一个对象的超类。包括Leaf和NodeComponent。SceneGraphObject 为其子类提供了一些通用的方法和属性。这里说明了两个。SceneGraphObject的方法是与"编译"关联的,在第1.8节讲到了一些基本的东西。
boolean isCompiled()
返回一个布尔型标记,表时场景图中的结点是否已经编译过。
boolean isLive()
返回一个布尔型标记,表时场景图中的结点是否已经被激活。

 

注意在基本和简单的方法中都没有"启动渲染器"这一项。当一个包含了视图实例的分支图在虚拟世界中被激活的时候,Java 3D 渲染器开始以无限循环的方式运行。一旦启动,Java 3D渲染器在概念上来讲就执行如下伪码中的操作。
while(true) {                        //永远执行
Process input              //处理输入
If (request to exit) break     //如果程序要求
Perform Behaviors          //执行交互动作
Traverse the scene graph     //遍历场景图以渲染各个可视对象
and render visual objects
}
Cleanup and exit                     //清理退出
 

Java 3D程序的主类一般都定义一个方法来构建内容分支图。在HelloJava3Da示例中,就定义了这样的方法,并声明为createSceneGraph ()。用简单分法所创建场景图的全部步骤都在HelloJava3Da 构造函数类中得到了实现。第1步、创建一个Canvas3D对象。具体见程序的第4行到第6行。第2步、创建一个SimpleUniverse对象,是在 第13行。.第2a步, 定制SimpleUniverse 对象,到第17行就完成了.第3步,构建内容分支图,就是通过调用createSceneGraph()方法来完成的。第4步,编译内容子图,代码见第 10行。最后第5步,把内容子图插入到SimpleUniverse的Lacale中,这个操作见第19行。
1. public class HelloJava3Da extends Applet {
2. public HelloJava3Da() {
3. setLayout(new BorderLayout());
4. GraphicsConfiguration config =
5. SimpleUniverse.getPreferredConfiguration();
6. Canvas3D canvas3D = new Canvas3D(config);
7. add("Center", canvas3D);
8.
9. BranchGroup scene = createSceneGraph();
10. scene.compile();
11.
12. // SimpleUniverse类是一个很方便的工具类
13. SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
14.
15. // 这把ViewPlatform往后移一点点,
16. //以使场景中的对象能被看到。
17. simpleU.getViewingPlatform().setNominalViewingTransform();
18.
19. simpleU.addBranchGraph(scene);
20. } // HelloJava3Da (构造函数)结束
代码段1-1 Class HelloJava3Da
简 单方法的第3步是创建内容分支图。创建内容分支图的具体代码见代码段1-2. 这也可能是再简单不过的内容分支图了。在代码段1-2中创建的内容分支图包括了一个静态的图形对象,即带有颜色的立方体。这个带色立方体位于虚拟世界坐标 系统中初始位置。按照视图提供的位置和方向,那个渲染后的立方体看起来像一个矩形。具体效果如图1-12所示。
1. public BranchGroup createSceneGraph() {
2. // 创建分支子图的根结点
3. BranchGroup objRoot = new BranchGroup();
4.
5. // 创建一个简单的图形叶子结点,并把其加到场景图中
6. // ColorCube也是一个很方便的工具类
7. objRoot.addChild(new ColorCube(0.4));
8.
9. return objRoot;
10. } // HelloJava3Da 的创建场景图的方法createSceneGraph结束
11. } // HelloJava3Da类结束
代码段1-2 HelloJava3Da 类的用于创建场景图的createSceneGraph方法s

HelloJava3Da 类是从Applet类继承而来的,但是这个程序由于运用了MainFrame类也是可以作为应用程序独立运行的。 Applet 类是用于写在窗口式的易于运行的Java 3D程序的基本类。MainFrame 提供了一个AWT 框架(frame )(即窗体) ,以使applet能嵌入从而像应用程序一样运行。 结果程序的窗口的大小是在运用MainFrame类构建时时候指定的。代码段 1-3 说明了HelloJava3Da.java中所用到的MainFrame 类的用法。

MainFrame 构造函数 (列出部分)

包: com.sun.j3d.utils.applet
MainFrame 类把一个小程序Applet转换成一个应用程序。从而继承自applet类的对象调用了MainFrame构造函数后都有一个 main()方法。MainFrame扩展了java.awt.Frame类并且实现了java.lang.Runnable, java.applet.AppletStub, 和java.applet.AppletContext.
MainFrame 类是受版权保护的,由Jef Poskanzer 在1996-1998到年间创建。Email: [email protected]   http://www.acme.com/java/
MainFrame(java.applet.Applet applet, int width, int height)
创建一个MainFrame对象,以使一个Applet能作为一个应用程序独立运行。
参数:
applet - 继承自applet类的构造函数。MainFrame为applet提供了一个AWT框架。
width - 窗体宽度象素值。
height - 窗体高度象素值。

 

前 面四个代码段 (1-1, 1-2, 1-3, and 1-4) 组成了完整的示例程序HelloJava3Da.java文件。完整的示例程序也可以代码发布包的examples/HelloJava3D 目录下找到.用命令javac HelloJava3Da.java来编译代码,用java HelloJava3Da来运行代码。运行结果如图1-12所示。

而在HelloJava3Da示例中不是每一行代码我们都进行了解释。如果通读了整个示例,集成Java3D程序的基本概念应该清晰明了了。下面这一小节通过说明上面程序中所用到的类来弥补了说明不足的缺陷。


 
在HelloJava3Da.java示例程序中,在唯一的locale对象中放置了唯一的图形对象。这个场景图如图1-11所示。
代码段 1-4 HelloJava3Da.java的import语句
9. import javax.vecmath.*;
8. import javax.media.j3d.*;
7. import com.sun.j3d.utils.geometry.ColorCube;
6. import com.sun.j3d.utils.universe.*;
5. import com.sun.j3d.utils.applet.MainFrame;
4. import java.awt.event.*;
3. import java.awt.Frame;
2. import java.awt.BorderLayout;
1. import java.applet.Applet;
Java 3D编程所用到的最常用的类在包javax.media.j3d或者 javax.vecmath中,在这个例子里, ColorCube工具类就在包com.sun.j3d.utils.geometry中. 从而,大多数Java 3D程序都会有代码段1-4中除引入ColorCube类之外所示的import 语句。
前面的三个代码段 (1-1, 1-2, and 1-3)再加上相应的import语句就组成了一个完整的Java3D应用程序。以下import语句在编译HelloJava3Da这个类时是必须的。
代码段1-3 HelloJava3Da 类的Main()方法调用MainFrame
6. } // main结束 (HelloJava3Da的方法)
5. Frame frame = new MainFrame(new HelloJava3Da(), 256, 256);
4. public static void main(String[] args) {
3.
2. //作为应用程序运行。
1. // 下面的代码允许Applet程序结果

BranchGroup 类
这种类型的对象是用于构建建场景图的, BranchGroup的实例是子图的根结点,
BranchGroup对象也是唯一能成为Locale对象的孩子对象的对象。BranchGroup对象可以有多个孩子, BranchGroup对象的孩子对象可以是Group和Leaf对象。

BranchGroup 默认构造函数
BranchGroup()
BranchGroup的实例,作为场景图分支的根结点,BranchGroup 对象也是能唯一插入到Locale对象中的对象。
Canvas3D类
Canvas3D 类继承自Abstract Windowing Toolkit (AWT)类的Canvas类.在场景图的视图分支图中,至少要引用一个Canvas3D对象(注:有可能存在多个Canvas3D对象,为了使演示简 单,在使用SimpleUniverse类时,在程序中仅有Canvas3D类的一个实例)。关于Canvas类更多的信息,请参考AWT。附录B中提供 了一系列参考。
Canvas3D 类的构造函数
Canvas3D(GraphicsConfiguration graphicsconfiguration)
构 造并初始化一个新的Canvas3D对象,Java 3D可以在给定的GraphicsConfiguration对象条件下渲染这个对象。这是AWT Canvas类的扩展的类。关于GraphicsConfiguration 对象的更多信息请参考Java 2D规范。这也是JDK 1.2 AWT的一部分。
Transform3D 类
Transform3D 对象用于进行3D几何形变比于平移和旋转。这些对象一般仅仅用于创建一个TransformGroup对象。首先, Transform3D对象可能基于一些Transform3D对象的组合而创建,然后就用这个Transform3D来构建一个 TransformGroup对象。
Transform3D默认的构造函数
一个通常的变换对象就表示为一个4x4双精度浮点矩阵。 这种数学表示是以行为主的。一个Transform3D对象不是在场景图中用到的,而是用于指定TransformGroup对象的图形变换的。
Transform3D()
构造一个Transform3D 对象,默认使用单位矩阵 (不顾虑在变换)。
一 个Transform3D对象能表示平移,旋转,缩放乃至这些变换的组合。当指定一个旋转变换时,角度用弧度来表示。一个全旋转(圆)的弧度是2 PI。设置角度的一个方法是利用常量Math.PI,另外一种算途径是直接设置,这里说一下常用角度的弧度:45度是0.785, 90度是1.57, 而180 度是3.14(约为PI)。
Transform3D 类的方法 (列出部分)
Transform3D对象用于表示几何形变,比如旋转,平移和缩放。
Transform3D是没在任何场景图中直接使用到的少数几个类之一。Transform3D对象所定义的变换是用于创建场景图中的TransformGroup 对象的。
void rotX(double angle)
设置图形X轴方向沿逆时针对象按指定的角度旋转。角度值用弧度指定。
void rotY(double angle)
设置图形Y轴方向沿逆时针对象按指定的角度旋转。角度值用弧度指定。
void rotZ(double angle)
设置图形Z轴方向沿逆时针对象按指定的角度旋转。角度值用弧度指定。
void set(Vector3f translate)
利用传入的Vector3f型的参数设置图形的平移值,如果这个传入的形变是单位矩阵,则在其它时候设置真正的形变值。

TransformGroup 类
作 为Group类的子类,TransformGroup类的实例用于创建场景图并且都其子结点的集合。TransformGroup对象存储了几何形变比如 平移和旋转。一般利用不在场景图中的Transform3D对象来构造某一形变。TransformGroup对象保存了场景图中的形变信息。

ransformGroup 构造函数
TransformGroup()
利用单位矩阵来构造并且初始化一个TransformGroup对象。(不发生形变)
TransformGroup(Transform3D t1)
通过传入Transform3D对象参数来构造并且初始化一个TransformGroup 对象。
参数:
t1 - transform3D对象

 

 

 

 

Transform3D对象中所包含的形变信息在TransformGroup对象创建时或者是调用了setTransform()方法变复制到TransformGroup中。

TransformGroup setTransform() 方法
void setTransform(Transform3D t1)
利用传入的形变参数设置TransformGroup对象的形变值。
参数:
t1 - 要复制的transform3D对象。
Vector3f 类
Vector3f 是包javax.vecmath中的数学类,用于用浮点数来设定一个矢量。Vector对象常常用于设置图形开变。Vector3f对象也不直接在场景图中用到。常用于指定形变,表现,法向量以及一些其它的应用。
Vector3f 构造函数
一个三个元素的矢量。其三个元素用单精度浮点数表示X,Y,Z坐标。
Vector3f()
用(0,0,0)构造并初始化一个Vector3f。
Vector3f(float x, float y, float z)
指定x,y,z轴坐标来构造并初始经一个Vector3f。
ColorCube
ColorCube 是包com.sun.j3d.utils.geometry中的工具类。定义了一个立方体图形及其各面的不同的颜色,并使位置处于初始位置的中间。默认的 ColorCube对象是一个长宽高均为2米的立方体。如果一个处于原始位置未经旋转的立方体(如HelloJava3Da示例中的),在名义上的视图位 置中,红色面是可见的,其它面的颜色分别是:蓝色, 洋红,黄色,绿色和青色。
ColorCube 构造函数
包: com.sun.j3d.utils.geometry
一个ColorCube 是一个简单的各面均有不同颜色的可视的立方体。
ColorCube 扩展了Shape3D 类;因此,它是叶子结点。 ColorCube可以很容易地放置于虚拟世界中。
ColorCube()
以默认的大小构造一个有色立方体。默认地,每一个角到相应坐标的中心都是1米,因而,此立方体处于视图正中心,长宽高都是2米。
ColorCube(double scale)
构造一个有色立方体,并作指定参数的缩放。默认每一条边都是2米,而此构造函数则构造一个顶点在(scale, scale, scale) 和(-scale, -scale, -scale)的ColorCube。

你可能感兴趣的:(Java 3D API官方教程[翻译三])