基于Web的三维交互系统的设计与实现
- 格式:doc
- 大小:23.00 KB
- 文档页数:6
基于Web的三维交互系统的设计与实现作者:温凯峰来源:《电脑知识与技术·学术交流》2008年第19期摘要:介绍利用Java3D技术,构建一个基于Web的三维交互系统,实现与用户进行交互,并给出了部分实现细节。
关键词:Java3D;交互;Web 3D;场景中图分类号:TP319文献标识码:A文章编号:1009-3044(2008)19-30036-03Design and Implement of 3D Interactive System Based on WebWEN Kai-feng(Jiaying University, Meizhou 514015, China)Abstract: This paper introduce on the use of Java3D technology, to build a three-dimensional interactive system based on Web, which can interact with the users, and implement a part of detailKey words: Java3D; Interactive; Web3D; Scene1 引言随着网络技术及计算机硬件技术的飞速发展,网络的带宽和计算机高效的3D运算能力的提高,虚拟现实技术在互联网上的应用成为了新的热点。
Web 3D技术的目的正是在互联网上建立三维的虚拟世界,给网上冲浪者提供真实的视听感受,使之在互联网上感觉到就如真实的世界一样,从而产生身临其境感觉。
本文主要讨论利用Java 3D技术,构建一个基于Web的三维交互系统,实现与用户进行交互,使用户充分享受Web 3D技术所带来的感受。
2 Java3D技术Web 3D标准的研究、定义和推广,主要是由Web 3D联盟组织来完成的。
其推出的VRML97是3D图形和多媒体技术通用的交换文件的格式。
虽然VRML在Web 3D方面的应用比较广泛了,但也存在着很多的不足:比如用户需要等待较长时间下载浏览器插件;必须借助其他的可视化编程工具来表现复杂场景;画面不连续,图像质量不高;软件实现受制等问题,这些问题都阻碍了基于Web的交互式三维图形技术的发展和应用。
因此,许多公司推出了自己的Web 3D实现方案,比如Cult 3D、Viewpoint、Atmosphere、Shockwave 3D、Pulse 3D等使用专用的文件格式和浏览器插件。
这些软件各具特色,在渲染速度、交互性、造型技术、图像质量和数据的压缩与优化上都各有特长。
Sun公司发布的Java3D由于其平台无关性、不需要安装插件等特性,使其特别适合编写基于WEB的应用程序。
Java语言是一种高效、健壮、安全的编程语言,特别适合Internet开发。
作为Java语言在三维领域的扩展,Java3D继承了Java语言“Write once,Run anywhere”和强大的网络功能等特点,即使是非常大的三维模型文件也可以很快的从网上下载观看,避免了带宽瓶颈,很好地解决了网络传输、平台无关性的三维可视化问题。
Java 3D底层通过OpenGL或DirectX实现3D 硬件加速,并且使用了视锥体消除法处理技术,同时采用多线程,实现了速度的最优化。
Java3D提供了高层的面向对象的三维图形描述方法,程序员只需要集中精力组建场景图中的对象而不必设计具体的几何形体和编写描述代码。
因此,Java3D在实现计算过程的三维可视化, 复杂的交互功能等方面具有其他Web3D技术无法相比的能力,选用Java3D 作为基于网络的虚拟建筑环境的开发平台, 有助于在应用中不断采用更为先进的算法, 形成独立的技术核心。
同时,Java本身是一种编程语言,所以通过Java3D建立的三维交互环境应用不会涉及商业类技术问题,比采用其他商业Web3D技术具有更长期的效益。
基于以上原因,我们在开发基于Web的三维交互设计系统中采用了Java3D技术。
3 系统的设计与实现根据系统的特点和需求,本系统采用Client/Server 结构,数据库放在服务器端,使用了My Sql保存用户的基本信息,管理用户的权限等。
服务器端提供了基本三维图形的下载及客户上传文件的功能,主要采用了Java文件上传和JDBC技术。
服务器端程序和客户端程序通过HTTP连接作为服务器和客户端的数据交互接口。
客户端通过网络连接到服务器,与服务器建立连接后,服务器端根据客户端的请求进行数据处理,并把客户端所需的3D文件通过网络传送到客户端,在客户端以网页的形式显示出来。
然后用户在客户端上对3D文件进行相关操作(包括文件操作、数据库操作和场景图操作),操作完成以后,把修改后的数据再通过网络返回到服务器中,服务器对更新结果进行保存,以供下次用户的调用。
客户端则提供了图形数据的还原和编辑图形的功能,采用了Java Applet的方式,Java Applet可嵌在网页上运行的特性和Java3D强大的图形表现能力为“基于Web的三维交互设计系统”提供了有力的技术支持。
用户通过浏览网页的形式,对从服务器端传送过来的图形数据进行还原,同时,根据需要在客户端对图形进行修改和编辑,并将结果通过网络传回给服务器保存,达到交互设计的目的。
在数据调度策略方面本系统采用一次性全部装载三维格式文件数据,数据驻留客户端机器内存的方法,节约了传送的代价,减轻了服务器端的压力,加快了客户端的反应速度。
以下为系统的处理流程和数据流程图:■图1 系统的处理流程和数据流程图由以上系统的处理流程,结合Web3D技术的特点,系统分为:场景图操作子系统(主要用于场景图的载入、模型的相关操作)、实体增添子系统(主要用于添加一些实体到系统中)、实体编辑子系统(对实体进行外观编辑和几何编辑)、文件操作子系统(打开、保存文件等)和后台管理子系统(启动和关闭服务等),系统的总体设计如图2所示:■图2 系统的总体设计图在基于Web的三维交互设计系统中,对场景图的操作是整个系统的核心和关键,本系统所构造的三维场景,必须运行一个Java3D程序。
这个Java3D应用程序必须首先创建一个虚拟宇宙对象并且至少把一个Locale对象附加之上。
然后,构建出需要的场景图像,它由一个分支组结点开始并且包括至少一个观察平台对象,而场景图就是附加于这个观察平台。
当一个包含场景图的观察对象被附加于一个虚拟宇宙,Java3D的渲染循环就开始工作。
这样,场景就会和它的观察对象一起被绘制在画布上。
系统支持从服务器端初始化和载入各种三维格式的文件,包括OBJ,3DS,J3D,VRML等,Java3D的com.sun.j3d.loaders包中包括了Loader和Scene 两个接口,在Java3D中调用不同格式的3D图形文件,应根据这两个接口编写自己的Loader 类,针对不同类型的3D图形文件编写不同的Loader类。
以下为系统载入的一个3DS的船模型图:■图3 系统载入的3DS船模型效果图以调用VRML场景为例,SUN提供了一个VRML97的Loader,可以利用它来在Java3D 中调用VRML97类型的文件。
当使用Loader将一个VRML文件导入Java3D中,Loader接口的Load的方法将返回一个com.sun.j3d.loaders.Scene对象,通过调用Scene的getSceneGroup()方法返回一个BranchGroup对象,该对象可以直接被Java3D的场景图直接引用,这样VRML 文件就转换为Java3D的场景类型。
三维系统中一个重要的功能就是与用户进行交互,Java3D中实现交互有三种方式:第一类是利用Java的事件处理模型,第二类是利用Java3D提供的Behavior包中提供的utility对象,第三类是定义自己的Behavior对象。
要实现复杂的交互行为,一般需要编写相应的行为类来实现。
通过构造Behavior对象引用它所控制的对象,对该引用的改变才会反映到它原来的对象上。
以下是基于Web的三维交互设计系统中对Shape3DBehavior类的构造的关键方法。
private Point3d setTranslate(Point3d p3d) {boolean isScale = false;Transform3D tempT3d;switch (currentKeyChar) {case KEYCHAR_A: {scaleDir.x = -1.0;scaleDir.y = 0.0;scaleDir.z = 0.0; break; }case KEYCHAR_S: {scaleDir.x = 0.0; scaleDir.y = -1.0;scaleDir.z = 0.0; break; }case KEYCHAR_D: {scaleDir.x = 1.0; scaleDir.y = 0.0;scaleDir.z = 0.0; break; }case KEYCHAR_Q: {scaleDir.x = 0.0; scaleDir.y = 0.0;scaleDir.z = 1.0; break; }case KEYCHAR_W: {scaleDir.x = 0.0;scaleDir.y = 1.0;scaleDir.z = 0.0; break; }case KEYCHAR_E: {scaleDir.x = 0.0; scaleDir.y = 0.0;scaleDir.z = -1.0; break; }case KEYCHAR_F:case KEYCHAR_R:case KEYCHAR_Y:case KEYCHAR_X:case KEYCHAR_Z: { scaleDir.x = 0.0;scaleDir.y = 0.0; scaleDir.z = 0.0;isScale = true; break; }}if (isScale) {tempT3d = new Transform3D();if (currentKeyChar == KEYCHAR_F)tempT3d.set(1.1d);if (currentKeyChar == KEYCHAR_R)tempT3d.set(0.9d);if (currentKeyChar == KEYCHAR_Y)tempT3d.rotY(Math.PI/36);if (currentKeyChar == KEYCHAR_X)tempT3d.rotX(Math.PI/36);if (currentKeyChar == KEYCHAR_Z)tempT3d.rotZ(Math.PI/36);tempT3d.transform(p3d);isScale = false;}worldToLocaleT3D.transform(scaleDir);p3d.x += (scaleDir.x * 0.05f);p3d.y += (scaleDir.y * 0.05f);p3d.z += (scaleDir.z * 0.05f);return p3d;}Shape3Dbehavior类的主要作用是:对单个形体所做的操作,此操作修改形体顶点坐标的值。