Java3D实现三维显示研究

资源类型:pdf 资源大小:455.00KB 文档分类:工业技术 上传者:李稳稳
关闭
关闭
关闭

文档信息

【作者】 曲毅民 

【关键词】Java3D 场景 Web 

【出版日期】2005-04-30

【摘要】Java3D用其自己定义的场景图和观察模式等技术构造了3D的上层结构,实现了在Java平台使用三维技术。文中在原理上着重介绍Java3D特有的两个重要概念:场景图(SceneGraph)、观察模式(ViewModel)。在接口使用上的介绍分为两部分:实例说明如何使用Java3D接口;说明如何将Java3D技术与Java原有的Web技术(JSP,Serverlet)相结合,在网页上实现三维显示。

【刊名】信息技术

全文阅读

1 Java3D技术引入Java3DAPI是Sun定义的用于实现3D显示的接口。3D技术是底层的显示技术,Java3D提供了基于Java的上层接口。Java3D把OpenGL和DirectX这些底层技术包装在Java接口中。这种全新的设计使3D技术变得不再繁琐并且可以加入到J2SE、J2EE的整套架构,这些特性保证了Java3D技术强大的扩展性。Java3D建立在Java2(Java1.2)基础之上,Java语言的简单性使Java3D的推广有了可能。它实现了以下三维显示能够用到的功能。Java3D可应用在三维动画、三维游戏、机械CAD等多个领域。但作为三维显示实现技术,它并不是唯一选择而且是一个新面孔。在Java3D之前已经存在很多三维技术,这些三维技术在实现的技术、使用的语言以及适用的情况上各有不同,现主要介绍与Java3D又密切关系的三种技术:OpenGL,Di rect3D,VRMLOpenGL是业界最为流行也是支持最广泛的一个底层3D技术,几乎所有的显卡厂商都在底层实现了对OpenGL的支持和优化。OpenGL同时也定义了一系列接口用于编程实现三维应用程序,但是这些接口使用C(C++)语言实现并且很复杂。掌握针对OpenGL的编程技术需要花费大量时间精力。Direct3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程。众多优秀的三维游戏都是由这个接口实现。与OpenGL一样,Di rect3D的实现主要使用C++语言。VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,这是一种比Basic、JavaScript等还要简单的语言。脚本化—38—的语句可以编写三维动画片、三维游戏、计算机三维辅助教学。它最大的优势在于可以嵌在网页中显示,但这种简单的语言功能较弱(如目前没有形体之间的碰撞检查功能),与Java语言等其它高级语言的连接较难掌握,因而逐渐被淹没在竞争激烈的网络三维技术中。2 Java3D网络开发Java3D实际上是Java语言在三维图形领域的扩展,与Java一样,Java3D有纯粹的面向对象结构。Java3D的数据结构采用的是SceneGraphsStructure(场景图),就是一些具有方向性的不对称图形组成的树状结构。在一个Java3D应用程序看到的逼真三维场景从程序的角度看来,实际就是由Java3D定义的一系列的对象,这些对象不是杂乱无序,对象之间也不是毫无关系。如果想让三维图像正常显示,必须在这两点上遵循Java3D场景图的规定。对于建立一个简单的Java3D程序,三个概念:虚拟宇宙(VirtualUniverse)、场景(Locale)、坐标系统。2.1 虚拟宇宙(VirtualUniverse)在Java3D中,虚拟宇宙被定义为结合一系列对象的三维空间。虚拟宇宙被用作最大的聚集体表现单位,同时也可被看作一个数据库。不管是在物理空间还是逻辑内容,虚拟宇宙都可以很大。实际上在大多数情况下,一个虚拟宇宙就可以满足一个应用程序所有的需求。虚拟宇宙是各自独立的个体,原因是在任何时候一个结点对象都不能在超过一个的虚拟宇宙中存在。同样的,在一个虚拟宇宙中的结点对象也不能在其他的虚拟宇宙中可见或者与其他的对象结合。对于一个Java3D应用程序,必须定义一个虚拟宇宙才可以在这个“宇宙”中显示三维图像。2.2 Java3D的坐标系统默认情况下,Java3D的坐标系统是右旋的,用方位语义学来解释就是:正y方向是本地重力的上,正x方向是水平的右,正z是这对着观察者的方向。默认的单位是米。双精度浮点、单精度浮点甚至是定点来表示的三维坐标都足够来表示和显示丰富的3D场景。不幸的是,场景不是真实世界,更不必说整个宇宙了。如果使用单精度坐标,有可能出现下列情景:(1)离原点仅有一百公里的距离,被描绘得相当量子化,所能达到的最好效果就是三分之一英寸,在实际应用中这样的精度比要求的粗糙的多。(2)如果要缩小到一个很小的尺寸(例如表现集成电路的大小),甚至在离原点很近的地方就会出现同坐标问题。为了支持一个大型的邻接虚拟宇宙,Java3D选择了有256位的高分辨率坐标。2.3 场景(Locale)为了支持大型虚拟宇宙,Java3D提出了“Locale”的概念。Locale把高分辨率坐标作为起源。把高分辨率坐标看作精确的定位,它在高分辨率坐标的影响范围之内使用精度较低的浮点坐标指定对象的位置。一个Locale和与它结合的高分辨率坐标一起组成了在虚拟宇宙之下的一个表现层。所有虚拟宇宙包含一个或多个高分辨率Locale。而所有其他的对象都是附加在一个Locale上的。在整个体系中,高分辨率坐标扮演的是上层的仅供翻译的转换结点。例如,附加到一个特定Locale的所有对象的坐标都会与这个Locale位置的高分辨率坐标有关。2.4 编程实现一个三维世界这一部分描述怎样调用VirtualUniverse,Locale和HiResCoord对象的编程接口实现建立一个完整的“三维世界”。注意,这个三维世界有原点、坐标,是实现三维显示程序的第一步。(1)VirtualUniverse对象有下列构造函数:  publicVirtualUniverse()  这个函数构造了一个新的VirtualUniverse对象,这个对象可以用来创建Locale对象。(2)Locale对象有下列构建器:  publicLocale(VirtualUniverseuniverse)publicLocale(VirtualUniverseuniverse,intx[],inty[],intz[])publicLocale(VirtualUniverseuniverse,HiRes CoordhiRes)  这三个构建器在指定的VirtualUniverse中创建了一个新的高分辨率Locale对象。其中第一个形成了一个在(0.0,0.0,0.0)的Locale对象。其他的两个构建器在指定的坐标上建立了Locale对象。在第二种形式里,参数x,y,z是含八个32位整数的数组,这些数组指定了各自的高分辨率坐标。HiResCoord对象定义了一个使用三个高分辨率坐标的点,而每一个坐标又由三个定点数组成。每个高分辨率坐标数共有256位,第128位是二进制小数点。Java3D使用长度为八的整数数组来定义或提取一个256位的坐标值。Java3D用数组内的第一个整数来表示高32位,最后一个整数来表示低32位。(3)HiResCoord对象有以下的构建化数:—48—  publicHiResCoord(intx[],inty[],intz[])publicHiResCoord(HiResCoordhc)publicHiResCoord()  第一个构造函数从输入的三个长度为八的整数数组生成高分辨率坐标。整数数组定义了与其同名坐标对象的值。第二个构造函数通过复制另外一个坐标创建一个新的坐标。第三个构造函数创建了一个值为(0.0,0.0,0.0)的坐标。所有Java3D程序都会首先建立VirtualUniverse和Locale对象,也就是说都会包含例1的代码。为了方便使用,Java3D为最原始的VirtualUniverse创建了几个子类:SimpleUniverse,ConfiguredUniverse,这些子类保证了可以将三维图像轻易的在通过Canvas3D的对象在Applet或Frame中显示。其中最常用到的是SimpleUnivese对象,这个类位于包com.sun.j3d.utils.universe中。例1 初始化VirtualUniverse和Locale代码  u=newSimpleUniverse(v,viewer);u.getViewingPlatform();ViewingPlatformviewingPlatform=u.getViewing Platform();3 动态网页技术与Java3D通过Jsp和Serverlet,可以使Java3D在网页中“动”起来。虽然Java3D本身就有三维动画的功能,但是这里的“动”指得是赋予了程序编写人员对Java3D动态的控制能力。改造上面的HelloUniverse,例2的jsp代码可以实现控制旋转的正方体大小的功能。通过每次Random对象生成的随机数,立方体的大小也是随即改变,这段程执行的效果,如图1,图2所示。例2 实现可以动态调整三位物体大小的jsp代码  <%@pagecontentType=“text html;charset=GBK”%><HTML><HEAD><TITLE>Hello,Universe!< TITLE>< HEAD><BODYBGCOLOR=“#000000”><%inti=300;%><%floatj=i (newjava.util.Random()).nextFloat();%><appletalign=middlecode=“HelloUniverse.class”width=<%=j%>height=<%=j%>>< applet>< BODY>< HTML>图1 Jsp显示效果1图2 Jsp显示效果24 结束语通过Java3DAPI,可以利用它强大的用户接口,图形图像表现能力,实现很复杂的动态3D场景,为网络协同工作、网络视频、网络会议、地震等实验研究等提供了一个可以更真实表达网络、现实世界的手段;利用Java强大的网络功能,使Java3D封装的功能丰富的表现三维信息的函数,可以很容易的实现网络三维系统。Java3D实现三维显示研究@曲毅民$哈尔滨理工大学!哈尔滨150080Java3D;;场景;;WebJava3D用其自己定义的场景图和观察模式等技术构造了3D的上层结构,实现了在Java平台使用三维技术。文中在原理上着重介绍Java3D特有的两个重要概念:场景图(SceneGraph)、观察模式(ViewModel)。在接口使用上的介绍分为两部分:实例说明如何使用Java3D接口;说明如何将Java3D技术与Java原有的Web技术(JSP,Serverlet)相结合,在网页上实现三维显示。[1] 马树奇,孙坦,等 Java2编程指南(JDK1.3版)[M].电子工业出版社,2001. [2] 袁鹏飞,许伟民 Java2学习指南[M].人民邮电出版社,2004. [3] 都志辉 Java3D编程实践———网络上的三维动画 北京:清华大学出版社,2002. [4] HansBergsten.JSP设计(第三版)[M] 中国电力出版社,2004. [5] (美)BrownS.JSP编程指南(第二版)[M] 电子工业出版社,2002. [6] (美)MartyHall.Servlet与JSP权威指南[M] 机械工业出版社,2002

1

引证文献

问答

我要提问
关闭