Java3D.docx

上传人:b****5 文档编号:6208986 上传时间:2023-01-04 格式:DOCX 页数:93 大小:48.80KB
下载 相关 举报
Java3D.docx_第1页
第1页 / 共93页
Java3D.docx_第2页
第2页 / 共93页
Java3D.docx_第3页
第3页 / 共93页
Java3D.docx_第4页
第4页 / 共93页
Java3D.docx_第5页
第5页 / 共93页
点击查看更多>>
下载资源
资源描述

Java3D.docx

《Java3D.docx》由会员分享,可在线阅读,更多相关《Java3D.docx(93页珍藏版)》请在冰豆网上搜索。

Java3D.docx

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使我们不必考虑

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1