荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: icefire (s....sigh), 信区: Java
标 题: JAVA3D学习系列(5)
发信站: BBS 荔园晨风站 (Sun Apr 4 06:28:51 1999), 站内信件 (WWW POST)
发信人: vrml (3d), 信区: JAVA
标 题: JAVA3D学习系列(5)
发信站: 华南网木棉站 (Sun Apr 4 11:10:17 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. API中的类
JAVA3D是SUN公司为我们提供的一个API,里面包含了几乎所有我们所需
要的编写JAVA三维多媒体应用程序的基本的类及方法。我们在编程时,只
需调用所需要的类及方法,就可以快速地编写出复杂的三维多媒体应用程
序。可以说,我们所做的工作只是学会应用JAVA3D的各种类(Objects)及方
法。
根据其作用,JAVA3D所提供的类主要有两种类型:
Group类 (用于将形体等按一定的组合方式组合在一起),
类似于VRML的组节点。
Leaf 类 (如Light、Sound、Background、shape3d、
Appearance、Texture及其属性等,还有
ViewPlatform、Sensor、Behavior、Morph、
Link等),类似与VRML的相应节点,是JAVA3D
场景图的重要组成部分。
Group类和Leaf类均为Node类的子类。
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语句表示调用程序所需要的定义矢量计算所用的类,因为
处理定义三维形体及其位置时,我们需要用到点、矢量、矩阵及其它一些数学
对象,它也是JAVA3D所提供的一个包,目前它在JAVA3D的编译环境中,今后则
可能会成为JAVA1.2的核心组成部分。
JAVA3D所提供的Utility并不是JAVA3D编译环境的核心组成部分,我们可以
不用它,不过使用它们会大大提高我们的程序编写效率。JAVA3D为我们提供的
Utility会不断增加,如有可能增加处理NURBS曲线的Utility。目前,JAVA3D
为我们提供了四组Utility,它们是:
用于调用其它三维图形格式如ALIAS图形格式的content loader
用于构造场景图的scene graph construction aids
用于建立一些基本体如圆锥、球的geometry classes
一些其它方便我们编程的convenience utilities
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形体,这说明优化是有条件的。
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中看起来比较大。
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一个打包程序
(里面含有书中所有的程序)。
################################################################
--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.22]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店