Java3D.docx
《Java3D.docx》由会员分享,可在线阅读,更多相关《Java3D.docx(93页珍藏版)》请在冰豆网上搜索。
Java3D
Java3D学习
JAVA3D学习系列
(一)
网络上的JAVA3D学习资料
1.
这里有SUN公司为我们提供的学习资料。
2.http:
//www.sdsc.edu/~nadeau/Courses/VR99/java3d.zip
这是一个非常好的JAVA3D学习资料。
(12,058K),里面有许多例子。
大家可以从http:
//www.sdsc.edu/~nadeau/中得到VRML和JAVA3D的许多资料。
JAVA3D学习系列
(二)
一。
JAVA3D的作用:
JAVA3D可用在三维动画、三维游戏、机械CAD等领域。
1.可以用来编写三维形体,但和VRML不同,JAVA3D没有基本形体,不过我们可以利用JAVA3D所带的UTILITY生成一些基本形体如立方体、球、圆锥等,我们也可以直接调用一些软件如ALIAS、LIGHTWARE、3DSMAX生成的形体,也可以直接调用VRML2.0生成的形体。
2.可以和VRML一样,使形体带有颜色、贴图。
3.可以产生形体的运动、变化,动态地改变观测点的位置及视角。
4.具有交互作用,如点击形体时会使程序发出一个信号从而产生一定的变化。
5.可以充分利用JAVA语言的强大功能,编写出复杂的三维应用程序。
6.JAVA3D具有VRML所没有的形体碰撞检查功能(这也是本人目前中意JAVA3D的原因)。
二。
OPENGL、VRML、DIRECT3D、JAVA3D的比较
由于OPENGL的跨平台特性,许多人利用OPENGL编写三维应用程序,不过对于一个非计算专业的人员来说,利用OPENGL编写出复杂的三维应用程序是比较困难的,且不说C(C++)语言的掌握需要花费大量时间精力,当我们需要处理复杂问题的时候,我们不得不自己完成大量非常繁琐的工作。
当然,对于编程高手来说,OPENGL是他们发挥才能的非常好的工具。
VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,编写VRML程序非常方法(VRML语言可以说比BASIC、JAVASCRIPT等语言还要简单),同时可以编写三维动画片、三维游戏、用于计算机辅助教学,因而其应用前景非常广阔尤其适合在中国推广应用。
不过由于VRML语言功能目前还不是很强(如目前没有形体之间的碰撞检查功能),与JAVA语言等其它高级语言的连接较难掌握,因而失去了一些计算机高手的宠爱。
但我们认为,我们可以让大学里的文理科学生利用VRML编写多媒体应用程序,让学生很快地对编写程序感兴趣,从而使国内的计算机水平得到提高。
DIRECT3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程,目前相关的学习资料难于获得,由于它一般需要VC等编程工具进行编程,需要编程人员具有较高的C++等高级语言的编程功底,因而难以普及。
JAVA3D是建立在JAVA2(JAVA1.2)基础之上的,JAVA语言的简单性使JAVA3D的推广有了可能。
OPENGL和JAVA3D之间的比较可以看成汇编语言与C语言之间的比较,一个是低级的,一个是高级的(也许这样比较不太恰当)。
JAVA3D给我们编写三维应用程序提供了一个非常完善的API,它可以帮助我们:
生成简单或复杂的形体(也可以直接调用现有的三维形体)
使形体具有颜色、透明效果、贴图。
可以在三维环境中生成灯光、移动灯光。
可以具有行为(Behavior)的处理判断能力(键盘、鼠标、定时等)
可以生成雾、背景、声音等。
可以使形体变形、移动、生成三维动画。
可以编写非常复杂的应用程序,用于各种领域如VR。
三。
如何获得JAVA3D运行环境
从
JAVA3D运行环境,目前最新的版本是1.1.1,在安装之前需要安装jdk1.2。
在编写JAVA3D程序之前,我们需要了解一些概念,完成一些准备工作。
一.JAVA3D的数据结构
JAVA3D实际上是JAVA语言在三维图形领域的扩展,JAVA3D的编程和JAVA一样,
是面向对象的编程。
JAVA3D的数据结构采用的是SceneGraphsStructure(场景图),这一灵活
的树状结构与显示列表多少有些相似之处,但运用起来更耐用(MoreRobust)。
JAVA3D的场景图是DAG(Directed-acyclicGraph),即具有方向性的不对称图形。
场景图中有许多线和线的交汇点,交汇点称为节点(Node),不管什么节点,
它都是JAVA3D类的实例(InstanceofClass),线(Arc)表示实例之间的关系。
在JAVA3D的场景图中,最底层(根部)的节点是VirtualUniverse,每一个
场景图只能有一个VirtualUniverse。
在VirtualUniverse上面,就是Locale节点,每个程序可以有一个或多个
Locale,但同时只能有一个Locale处于显示状态,就好象一个三维世界非常大,
有很多个景点,但我们同时只能在一个景点进行观察。
当然我们可以从一个景点
跳到另一个景点,不过绝大多数程序只有一个Locale。
每一个Locale上面拥有一个到多个BranchGroup节点。
我们知道,要想建立
我们的三维应用环境,我们必须建立所需要的形体(Shape),给出形体的外观
(Appearance)及几何信息(Geometry),再把它们摆放在合适的位置,
这些形体及其摆放位置都建立在BranchGroup节点之上,摆放位置通过另一个节点TransformGroup来设定。
另外,我们在安放好三维形体之后,还需要设定具体的观察位置,我们暂时用ViewPlatform代替,它也是建立在TransformGroup节点之上的。
下面我们用一个示意图来说明上面我们介绍的JAVA3D的场景图概念。
VirtualUniverse
|
|----------------------------------|
||
LocaleLocale
|
|
----------------+-----------------
||||
||||
BGBGBGBG(BG--BranchGroup)
||||
||||(S---Shape)
STGTGTG(TG--TransformGroup)
----+---|||
|||||
AGSSViewPlatform
||
||(A---Appearance)
----+--------+----(G---Geometry)
||||
||||
AGAG
JAVA3D学习系列(四)
一.如何安装JAVA3D
下载JDK1.2及JAVA3D(目前最新的为1.1.1版本)。
在WIN95/98上安装,先安装JDK1.2,再安装JAVA3D,将JDK安装到JDK1.2目录下。
建立一个自己的目录,在自己的目录中编写并运行程序。
注意,安装JDK1.2时别忘了在autoexec.bat中插入一行:
SETPATH=C:
\JDK1.2\BIN
二.如何编写JAVA3D源程序
用文本编辑工具编辑源程序,和其它JAVA程序一样,程序后缀为JAVA。
三.如何运行JAVA3D源程序
用JAVAC编译源程序,生成class文件。
根据文件的类型,选择用JAVA或APPLETVIEWER运行程序。
JAVA3D程序可以为APPLICATION程序,也可以为APPLET程序,因而JAVA3D程序也可以摆放在网页上,当然这时候我们必须在浏览器上做一些设置工作(以后再介绍)。
四.一个最简单的JAVA3D源程序。
下面我们介绍一个最简单的JAVA3D源程序,进而介绍JAVA3D为我们提供的各种功能。
程序是一个JAVA的APPLET类型的程序,它的作用是显示一个红色的圆锥,仅此而已。
名为SimpleCone.java。
//SimpleCone.java
importjava.applet.Applet;
importjava.awt.BorderLayout;
//importcom.sun.j3d.utils.applet.MainFrame;
importcom.sun.j3d.utils.geometry.Cone;
importcom.sun.j3d.utils.universe.*;
importjavax.media.j3d.*;
importjavax.vecmath.*;
publicclassSimpleConeextendsApplet{
publicBranchGroupcreateSceneGraph(){
BranchGroupobjRoot=newBranchGroup();
TransformGroupobjTrans=newTransformGroup();
objRoot.addChild(objTrans);
Appearanceapp=newAppearance();
Materialmaterial=newMaterial();
material.setEmissiveColor(newColor3f(1.0f,0.0f,0.0f));
app.setMaterial(material);
Conecone=newCone(.5f,1.0f,1,app);
objTrans.addChild(cone);
objRpile();
returnobjRoot;
}
publicSimpleCone(){
setLayout(newBorderLayout());
Canvas3Dc=newCanvas3D(null);
add("Center",c);
BranchGroupscene=createSceneGraph();
SimpleUniverseu=newSimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
//publicstaticvoidmain(String[]args){
//newMainFrame(newSimpleCone(),256,256);
//}
}
//endofSimple.java
在运行applet程序时,我们需要编写一个HTML文件:
先用javac将JAVA3D源程序编译成class文件,再用appletviewer运行HTML文件。
虽然程序是applet程序,但我们也可以将其变成application程序,这时我们只需将程序头尾的四个注释行的注释符号去掉即可,这时我们可以用java来运行它:
javaSimpleCone
JAVA3D学习系列(5)
JAVA3D程序也是JAVA程序,因而我们首先必须对JAVA有所了解,并能编写简单的JAVA程序,了解JAVA编程的基本概念。
一.SimpleCone程序分析
1.SimpleCone.java及其对应的VRML程序
上一节中,我们给出了SimpleCone这个非常简单的JAVA3D程序,下面我们来解读这个程序,进而介绍JAVA3D所提供的API的内容。
第三节中,我们对JAVA3D的场景图结构作了一个简单的介绍,从场景图我们可以看出,JAVA3D的场景图和VRML的场景图非常相似,因而我们可以编写类似的VRML程序出来,与JAVA3D程序进行比较。
SimpleCone程序只是显示一个红色的圆锥,相类似的VRML程序为:
//SimpleCone.wrl
#VRMLV2.0utf8
Shape{
geometryCone{bottomRadius.5height1.0}
appearanceAppearance{materialMaterial{emissiveColor100}}
}
}
可以看到,与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图形格式的contentloader
用于构造场景图的scenegraphconstructionaids
用于建立一些基本体如圆锥、球的geometryclasses
一些其它方便我们编程的convenienceutilities
除了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,这是一个名叫JefPoskanzer的人所编写的类。
第四个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
importjava.applet.Applet;
importjava.awt.BorderLayout;
importcom.sun.j3d.utils.applet.MainFrame;
importcom.sun.j3d.utils.geometry.Cone;
importcom.sun.j3d.utils.universe.*;
importjavax.media.j3d.*;
importjavax.vecmath.*;
publicclassSimpleCone1extendsApplet{
publicBranchGroupcreateSceneGraph(){
BranchGroupobjRoot=newBranchGroup();
Appearanceapp=newAppearance();
Materialmaterial=newMaterial();
material.setEmissiveColor(newColor3f(1.0f,0.0f,0.0f));
app.setMaterial(material);
Conecone=newCone(.5f,1.0f,1,app);
objRoot.addChild(cone);
objRpile();
returnobjRoot;
}
publicSimpleCone1(){
setLayout(newBorderLayout());
Canvas3Dc=newCanvas3D(null);
add("Center",c);
BranchGroupscene=createSceneGraph();
SimpleUniverseu=newSimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
publicstaticvoidmain(String[]args){
newMainFrame(newSimpleCone1(),256,256);
}
}
//endofSimpleCone1.java
JAVA3D有三种运行方式,Immediate、Retained和Compiled-RetainedMode。
SimpleCone程序中的objRpile();
表示程序为Compiled-RetainedMode,在这种模式下,JAVA3D对程序进行了优化,程序的运行运行速度最快。
不过在一些场合,如形体在程序运行过程中才生成,则不能Compile形体,这说明优化是有条件的。
注意,JAVA3D程序没有“开始渲染”这一步骤,当一个View被有效地放入一个VirtualUniverse,JAVA3D运行环境就开始不停地渲染JAVA3D场景图中的三维形体,从而使屏幕上显示出三维图形。
5.SimpleCone的构造函数
SimpleCone的构造函数的作用为首先设置一个BorderLayout。
生成一个名为c的Canvas--Canvas3D继承了JDK1.2中的Canvas类,从而构造了一个图形环境。
将c放入BorderLayout的中心位置。
生成一个场景图分支scene,里面定义了形体及其材质(红色)。
借用JAVA3D的一个Utility,生成了场景图的VirtualUniverse及Locale、Viewer,和VRML程序有些不同,在缺省情况下,JAVA3D的观察点为位于(0,0,2.41),而VRML的观察点位于(0,0,10),因而形体在VRML中看起来比较小,而在JAVA3D中看起来比较大。
我们利用这个Utility生成的这个u使我们不必考虑