Graphics 版 (精华区)

发信人: seaman (翩翩少年), 信区: Graphics
标  题: JAVA3D学习系列(5)
发信站: 哈工大紫丁香 (Mon Sep 20 19:13:40 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方法的定义
       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。

######################  书      讯 ############################
书名: VRML2.0交互式三维图形编程  由汕头大学出版社出版  张杰编著
特殊购书方式:
1。作者售书
1。网上订购(email address: jzhang@mailserv.stu.edu.cn)
2。可以先获书,后汇款(不满意可退书),
   只需将通信地址及邮编告知作者,即可在最短的时间内得到书。
3。书价为25元/本,免收邮购费用。
4。书为16开本,正文161页。
5. 购书有发票。
6. 如果需要书中的源程序,我可以email一个打包程序
  (里面含有书中所有的程序)。
7. 书的简单目录

第一章  VRML的基础知识
第二章  基本形体的生成
第三章  复杂形体的生成
第四章  组节点
第五章  路由(ROUTE)的应用、四个捆绑型节点、WorldInfo节点
第六章  内插器节点
第七章  传感器节点
第八章  材质与光源
第九章  多媒体效果的生成
第十章  特殊的组节点Inline、LOD、Switch
第十一章  用PROTO、EXTERNPROTE语句定义新的节点
第十二章  JavaScript语言基础
第十三章  JavaScript语言在VRML程序中的应用(一)
第十四章  JavaScript语言在VRML程序中的应用(二)
第十五章  VRML、JAVA3D、Chromeffects及未来的三维图形技术        
附录A:网络上与VRML有关的站点介绍       
附录B:VRML在主页中的应用方法介绍       
##############################################################

--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.192.158.112]

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