Java 版 (精华区)

发信人: bali (阿奔), 信区: Java
标  题: JAVA3D学习系列(5) 
发信站: 紫 丁 香 (Fri Mar 24 10:56:50 2000), 转信

  发信人: vrml (3d), 信区: Java
标  题: JAVA3D学习系列(5)
发信站: BBS 水木清华站 (Sun Apr  4 21:54:09 1999)

    JAVA3D程序也是JAVA程序,因而我们首先必须对JAVA有所了解,并能
编写简单的JAVA程序,了解JAVA编程的基本概念,关于JAVA语言的相关知
识,我们在这里就不一一介绍了,国内这方面的书籍非常丰富。

一. SimpleCone  程序分析
1. SimpleCone.java及其对应的VRML程序
    上一节中,我们给出了SimpleCone这个非常简单的JAVA3D程序,下面
我们来解读这个程序,进而介绍JAVA3D所提供的API的内容。
    第三节中,我们对JAVA3D的场景图结构作了一个简单的介绍,从场景图
我们可以看出,JAVA3D的场景图和VRML的场景图非常相似,因而我们可以编
写类似的VRML程序出来,与JAVA3D程序进行比较。
    SimpleCone程序只是显示一个红色的圆锥,相类似的VRML程序为:
//SimpleCone.wrl

#VRML V2.0 utf8
Shape{
  geometry Cone{ bottomRadius .5 height 1.0}
  appearance Appearance{material Material{emissiveColor 1 0 0}}
     }

//end of SimpleCone.wrl

    可以看到,与JAVA3D程序相比,VRML程序要简单的多,并且可以直接在
IE和Netscape浏览器上运行,而JAVA3D则要复杂的多。不过几乎所有的VRML
程序都可以用JAVA3D编写出来,而稍微复杂一点的JAVA3D的程序则基本上无
法用VRML语言完成。因为VRML几乎可以看成是一个三维计算机图形格式,而
JAVA3D则是一个高级计算机语言。
    在上面的VRML程序中,只定义了一个三维形体及其材质,背景、灯光、
位置等均为缺省值。
    同样地,SimpleCone.java程序中,我们也只定义了三维形体及其材质,
没有背景、灯光等,处在缺省的位置上(坐标系原点)。
    JAVA3D和VRML一样,采用的是一个符合右手螺旋法则的三维坐标系。正
X轴向右,正Y轴向上,正Z轴朝外(从计算机屏幕指向我们)。

2. JAVA3D(API)中的类
    JAVA3D是SUN公司为我们提供的一个API,里面包含了几乎所有我们所需
要的编写JAVA三维多媒体应用程序的基本的类及方法。我们在编程时,只
需调用所需要的类及方法,就可以快速地编写出复杂的三维多媒体应用程
序。可以说,我们所做的工作只是学会应用JAVA3D的各种类(Objects)及方
法。
    JAVA3D为我们提供了100多个存放于javax.media.j3d程序包中的类,它
们被称为JAVA3D的核心类,除了核心包中的类以外,JAVA3D还提供了一些其
它程序包,其中一个重要的包是com.sun.j3d.utils包(Utility)。
    JAVA3D所提供的Utility并不是JAVA3D编译环境的核心组成部分,我们可以
不用它,不过使用它们会大大提高我们的程序编写效率。JAVA3D为我们提供的
Utility会不断增加,例如有可能增加处理NURBS曲线的Utility。目前,JAVA3D
为我们提供了四组Utility,它们是:
      用于调用其它三维图形格式如ALIAS图形格式的content loader
      用于构造场景图的scene graph construction aids
      用于建立一些基本体如圆锥、球的geometry classes
      一些其它方便我们编程的convenience utilities
    除了JAVA3D的核心包及Utility包之外,每个JAVA3D程序还必需用到下面
两个包:java.awt和javax.vecmath。java.awt包用来定义一个显示用的窗口,
而javax.vecmath包则是用来处理调用程序所需要的定义矢量计算所用的类,
处理定义三维形体及其位置时,我们需要用到点、矢量、矩阵及其它一些数学
对象,它也是JAVA3D所提供的一个包,目前它在JAVA3D的编译环境中,今后则
可能会成为JAVA1.2的核心组成部分。

    根据其作用,JAVA3D所提供的类主要有两种类型:Node、NodeComponent
       Node类,它含有Group及Leaf两个子类:
           Group类    (用于将形体等按一定的组合方式组合在一起),
                        类似于VRML的组节点。
           Leaf 类     (如Light、Sound、Background、shape3d、
                         Appearance、Texture及其属性等,还有
                         ViewPlatform、Sensor、Behavior、Morph、
                         Link等),类似与VRML的相应节点,是JAVA3D
                         场景图的重要组成部分。
       NodeComponent类,用于表示Node的属性,它并不是JAVA3D场景图
                        的组成部分,而是被JAVA3D场景图所引用,如某
                        一个颜色可以被多个形体所引用。

3. SimpleCone.java程序import语句部分的介绍
    根据JAVA3D所提供的类,按照面向对象的编程方式,我们可以编写出三维
环境中所需要的各个对象。编写JAVA3D程序的关键是学会应用JAVA3D所提供的
各个类,生成自己所需要的对象。
    下面我们来看一下SimpleCone.java里的每一个import语句。
    我们知道,java程序中。凡是利用到的外部的类均用import语句调用,我
们首先介绍一下程序中的import语句。
    第一个import语句表示本程序是Applet程序。
    第二个import语句表示窗口环境采用BorderLayout管理方式。
    第三个import语句语句在去掉//后就可以使程序既为applet
也为application,为此,使用了JAVA3D所附带的一个Utility,这是一个名
叫Jef Poskanzer的人所编写的类。
    第四个import语句表示调用生成Cone的一个Utility,这是因为,JAVA3D
和VRML不同,VRML有几个基本几何体的节点语句,但JAVA3D的核心部分一个
基本体也没有定义,但JAVA3D所附带的Utility为我们提供了一些事先编好的
基本体,我们可以调用这些基本体。
    第五个import语句表示我们调用一些设置基本的观测位置所用的类,如
SimpleUniverse、Viewer、ViewingPlatform等,利用它们,我们可以很方便
地构造JAVA3D场景图底部的VirtualUniverse、Locale及其上的View分支,进
而使精力主要用在建模及复杂问题的处理上面,当然它们也都是JAVA3D所附带
的Utility。
    第六个import语句表示调用程序所需要的JAVA3D核心类,因而所有JAVA3D
程序都必须带有这一语句,只有这样才能在JDK1.2环境中编译执行JAVA3D程序。
    第七个import语句表示调用程序所需要的定义矢量计算所用的类。

3. SimpleCone.java程序的组成
    SimpleCone.java程序主要由三个部分组成:
       createSceneGraph方法的ㄒ?nbsp;
       SimpleCone的构造函数
       用于生成application应用程序的main函数

4. createSceneGraph方法的定义
    我们首先来看一下createSceneGraph方法的定义部分。通过第三讲的
JAVA3D场景图的简单示意图,我们知道,为了编写出一个JAVA3D应用程序,
我们必须编写出一个拥有三维形体的内容分支,即一个分支组,一个
BranchGroup。我们将我们所需要的形体及其材质定义在里面,由于一般
形体会摆放在三维空间的某一个位置,因而我们还需要先在BranchGroup
分支之上建立一个可用于几何变换用的TransformGroup,即几何变换分支
组,再将形体及其材质作为TransformGroup的一个分支给出,当然程序中
如果将形体摆放在坐标原点,也可以不给出一个TransformGroup,如下面
的SimpleCone1程序运行起来和SimpleCone结果完全一样,它没有一个
TransformGroup对象:

//SimpleCone1.java
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class SimpleCone1 extends Applet{

  public BranchGroup createSceneGraph() {
    BranchGroup objRoot = new BranchGroup();

    Appearance app = new Appearance();
    Material material = new Material();
    material.setEmissiveColor(new Color3f(1.0f,0.0f,0.0f));
    app.setMaterial(material);
    Cone cone=new Cone(.5f,1.0f,1,app);
    objRoot.addChild(cone);

    objRoot.compile();
        return objRoot;
    }

    public SimpleCone1() {
        setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(null);
        add("Center", c);
        BranchGroup scene = createSceneGraph();
        SimpleUniverse u = new SimpleUniverse(c);
        u.getViewingPlatform().setNominalViewingTransform();
        u.addBranchGraph(scene);
    }

    public static void main(String[] args) {
        new MainFrame(new SimpleCone1(), 256, 256);
    }
}
//end of SimpleCone1.java

    JAVA3D有三种运行方式,一种是Immediate Mode,一种是
Retained Mode,一种是Compiled-Retained Mode。
    SimpleCone程序中的
        objRoot.compile();
表示程序为Compiled-Retained Mode,在这种模式下,JAVA3D对程序
进行了优化,程序的运行运行速度最快。不过在一些场合,如形体在
程序运行过程中才生成,则不能Compile形体,这说明优化是有条件的。
     注意,JAVA3D程序没有“开始渲染”这一步骤,当一个View被有
效地放入一个Virtual Universe,JAVA3D运行环境就开始不停地渲染
JAVA3D场景图中的三维形体,从而使屏幕上显示出三维图形。

5. SimpleCone的构造函数
    SimpleCone的构造函数的作用为
       首先设置一个BorderLayout。
       生成一个名为c的Canvas--Canvas3D继承了JDK1.2中的Canvas类,
            从而构造了一个图形环境。
       将c放入BorderLayout的中心位置。
       生成一个场景图分支scene,里面定义了形体及其材质(红色)。
       借用JAVA3D的一个Utility,生成了场景图的Virtual Universe及
            Locale、Viewer,和VRML程序有些不同,在缺省情况下,
            JAVA3D的观察点为位于(0 , 0 , 2.41),而VRML的观察点
            位于(0 , 0 , 10),因而形体在VRML中看起来比较小,
            而在JAVA3D中看起来比较大。我们利用这个Utility生成的
            这个u使我们不必考虑生成场景图中的观测分支,不过它也
            有缺点,即我们不能在Virtual Universe中拥有多个View,
            因而也就不能从一个View跳到另一个View。

6. 用于生成application应用程序的main方法
   为了使我们的程序既可以为applet程序,又可以为application
程序,我们可以通过编写一个main方法,利用import语句提供的
MainFrame类,生成一个MainFrame对象,从而使程序变成为
application程序。MainFrame是JAVA3D为我们提供的一个非常有用
的Utility。


--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.243.89]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.628毫秒