Java中的3D图形技术及应用案例研究
2009-02-25
作者:扈文峰,韩涛
1 引言
一直以来,由于性能等原因,Java并不是3D图形应用的主流平台,但随着各种新技术的出现,这种情况有了很大改变。从开始的JIT、Static compilers,到现代的HotSpot技术[1][2],使Java程序的运行效率越来越高,目前已经接近于C++程序。此外,通过JNI技术,Java程序可以调用任意第三方库,包括OpenGL和DirectX等图形库。基于JNI技术,Java平台上出现了很多3D图形API,包括Sun公司在2003年推出了可选的3D图形包―Java 3D和其它第三方的图形API。
在本文第2部分,对Java平台中具有代表性的若干3D图形API做了介绍和分析,并在第3部分中,介绍了在“可视化”领域中应用Java图形的一个工程案例。
2 Java平台的3D图形API
Java平台下可以选择的3D图形API有很多,根据封装层次可以将其分为以下两种:
.Java bindings to OpenGL
.Scene graph APIs
其中属于Java bindings to OpenGL的有:GL4Java,LWJGL,JOGL等。属于Sence Graph APIs的有:JMonkey Engine(JME)、Java3D等。
2.1 Java bindings to OpenGL
Java bindings to OpenGL的API是对OpenGL做了一层Java包装,使得人们可以在Java环境中调用OpenGL命令。这与OpenGL一样可以称为“Render层次”的图形API。这一层次的API处理的是点和象素级的操作,是Scene graph API的基础。
.GL4Java(http://gl4java.sourceforge.net/docs/overview/benefits.html)
GL4Java在JOGL出来之前是最受欢迎的Java 3D API,它一直被认为是"OpenGL for Java Technology"。它可以在AWT和SWING中使用,这对打算在桌面应用程序中使用3D技术的人来说无疑是一个合适的选择。
.Lightweight Java Game Library(LWJGL)(http://www.lwjgl.org/)
LWJGL完全支持JDK的新特性。它支持最新版的OpenGL及其后续版本。遗憾的是它不能在AWT和SWING中绘图。
.JOGL(https://jogl.dev.java.net/)
和LWJGL一样,它也完全支持JDK的新特性和最新版的OpenGL及其后续版本。但是和LWJGL所不同的是,它可以在AWT和SWING中进行绘图。JOGL和LWJGL是主要的竞争对手。但是Sun公司最终还是选择了JOGL,在其JSR 231 草案中明确指出采用JOGL作为OpenGL的绑定技术。
2.2 Scene graph APIs
Scene graph API建立在“Render层次”的图形API的基础上,属于“Entity层次”的图形API。这些API固化了大量3D图形应用中属于共性的功能,比如,它使用一个“有向无环图”的数据结构来组织3D场景中的可视对象,规定了场景的仿真逻辑、人机交互的机制、场景中物体间的相互作用(比如“碰撞”),并对3D场景的复杂渲染过程进行了优化。这种API可让使用者不必关心底层的渲染细节,最显著的优点是易用性和开发高效性。 Entity层次的3D 图形API有很多,这里将重点以Java 3D和JME作介绍。
.Java 3D(http://www.j3d.org)
Java 3D是由Sun公司开发的一组高级3D图形API。除了Scene graph API的优点外,Java 3D有很多优异的特性,比如提供对多处理器和虚拟设备的支持,可以同时运行在OpenGL环境和Direct X环境等等。遗憾的是它的运行效率不是很理想,Java3D 1.3 beta的运行速度要比相同条件下GL4Java 的慢2.5倍。
.Java Monkey Engine(JME)(http://jmonkeyengine.com/index.php)
JME是一个高性能的3D图形API,采用LWJGL作为底层支持。它的后续版本将支持JOGL。JME和Java 3D具有类似的场景结构,开发者必须以树状方式组织自己的场景。JME有一套很好的优化机制,这使得它得运行速度要比Java 3D快很多。JME主要由Render系统、Material系统、GUI系统、Texture和图片解码器、文件解码器、Scene插件(主要是地形系统)、粒子系统、日志、物理系统、光照系统等构成。可以说JME是一个功能齐全,性能卓越的3D图形引擎。
2.3 性能比较
由于JNI技术的额外负担可以忽略不计,所以在理论上各种Java bindings to OpenGL的APIs执行图形渲染任务的效率应该接近于C++/OpenGL版本。有关Java平台3D图形API的严肃的性能试验是由Jacob Marner[3]完成的,其结果表明:OpenGL/C++版本最快,GL4Java版本与C++版非常接近,Java3D的运行时间是C++版的2.5倍。而根据我们的初步试验,JME的效率与OpenGL/C++版本很接近,甚至比由非熟练OpenGL程序员编写出来的OpenGL/C++程序还要快。
高运行效率结合高开发效率,JME是一种理想的3D应用的开发平台,可以开发诸如虚拟现实、可视化,甚至计算机游戏。在下面我们将介绍一个JME在可视化领域的应用案例。
3.案例研究—智能节点弹性重叠网络信息三维图形展示系统
3.1 项目背景
“基于IPv6的广播影视资料P2P 内容存取中间件示范系统”是由国家支持的CNGI的项目之一。旨在促进全国各大中型电视台、电台的内容管理平台以及其它媒体机构,使之互连互通,形成相当容量规模的内容和节目的交换、分发,以及高效率检索和查询。而基于IPv6的P2P网络的特点就是“智能节点弹性重叠网络”[4]。
当此示范系统运行时,系统管理者需要实时了解系统工作的运行状态和各种信息,比如,网络的拓扑结构、系统的QoS等。这些信息可以用文字、数字、图表等形式展现,但其缺点是缺乏直观性,特别是复杂的网络拓扑结构是图文形式无法形象表达的。所以,将此示范系统的运行状态进行3D图形可视化就是一个很好的选择。
3.2 智能节点弹性重叠网络信息可视化
“计算机可视化”是指将复杂的数据以图形、动画、图象等直观的形式在计算机上展示出来,目的是为了让人们更好地获取信息和获得对系统的理解[5]。可视化过程一般分为三个步骤:关键信息识别、关键信息的图形表示、渲染。
.关键信息识别:
本步骤的任务是:识别出系统中哪些信息和特征最为重要,需要以显著的视觉形式显现出来,以帮助人们可以清晰直观地了解示范系统的运行现状。我们识别出以下关键信息:
.网络的拓扑结构,特别要表现出“弹性重叠网络”的概念;
.超级节点,代表了一个媒体机构,需要随时显示其中可下载的资源列表;
.终端节点,代表P2P下载的终端用户。
.P2P下载所选择的路径;
.P2P下载路径的QoS,例如路的带宽、流量等。
.关键信息的图形表示
本步骤的任务是:对前面识别出的关键信息找出合适的视觉表示。这一步骤是可视化任务是否有效的关键和难点。比如,为了表现“弹性重叠网络”的概念,我们选择了在空间上把网络分层次的布局;为了表现“超级节点”的主动性,我们选择了用模型动画而不是静态模型来表现它;为表现终端用户的特点,我们在3D空间中嵌入了一个播放影视文件的画布;再比如,使用半透明管道来代表P2P下载所选择的路径,使用各色运动的彩球代表其中的数据包;等等。
.渲染
本步骤的任务是:把系统各种关键信息的图形表示渲染到屏幕上。这个任务是由JME引擎来完成,因为JME引擎强大的图形渲染能力足以满足数据可视化工作的渲染要求:利用引擎可以轻松实现模型的导入和纹理的装载;引擎内置的各种光影算法可以表达出更丰富逼真的渲染效果;利用引擎的关卡编辑器可以方便地创建和管理场景,极大地提高工作效率。
3.3 对JME引擎的适应
由于JME引擎本质上是一个Scene Graph的图形引擎,只负责场景中3D图形的渲染工作。而我们可视系统中的对象,不仅仅具有可视形象,还具有一定的行为逻辑。比如:各个节点需要响应用户的鼠标点击、智能节点本身需要动画并且定时向外发送脉冲、终端用户需要定时向智能节点发送“心跳”信号、数据包在通道中运动并且在碰到节点时消失,等等。所以,我们需要对JME引擎进行适应性扩充,在JME渲染层之上架设一层Entity逻辑层,用来模拟系统对象的行为。
Entity层的软件设计决定是:Entity抽象类为逻辑层的祖类,让Entity类包含Node对象(Node类是代表场景元素的抽象类),与Scene Graph数据结构并行地创建一个管理Entity对象的数据结构,此数据结构初始化时同时初始化Scene Graph。
3.4 结果
图1为“弹性重叠网3维图形展示系统”运行时的一个屏幕截图。
图1.弹性重叠网3维图形展示系统
4 结论
与一般的观念相反,在Java平台上开发3D图形应用,比如虚拟现实、可视化、仿真甚至计算机游戏,是完全可行的,在产品运行效率上已经很接近C++/图形库程序。结合Java平台开发的其它优势,人们将越来越倾向于把Java当作3D图形应用的开发平台。
参考文献:
[1] Aycock, John. A Brief History of Just-In-Time. ACM Computing Surveys, Volume25, Issue 2, 2003.
[2] Sun Microsystems, “The Java HotSpot Virtual Machine”
http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_1.html
[3] Jacob Marner, (2002) Evaluating Java for Game Development. http://www.rolemaker.dk/articles/evaljava/
[4] 侯自强. 在CNGI IPv6上建立P2P环境和分布管理系统. 中兴通讯技术。
[5] A Framework for Game Engine Based Visualisations, Burkhard C. Wuensche, Blazej Kot, Andrew Gits, Robert Amor, John Hosking and John Grundy, Proceedings of IVCNZ '05, Dunedin, New Zealand, 28-29 November 2005, pp. 465-470.