Java3D 虚拟室内装饰效果展示研究

2011-10-12 02:55
天津职业院校联合学报 2011年2期
关键词:形体鼠标编程

李 蕊

(新华职工大学,天津市 300040)

Java3D 虚拟室内装饰效果展示研究

李 蕊

(新华职工大学,天津市 300040)

目前虚拟现实的建模方法主要采用OpenGL,VRM L等语言进行编程,这存在着难以掌握、不易广泛推广等缺点。而Java3D作为一种新兴的三维开发应用程序接口,则提供了高效的开发性能。结合实际应用中的实现方法和步骤,对使用Java3D构建虚拟环境,丰富三维表现效果,实现环境与用户的交互等进行了研究,并给出在Java3D场景中实现虚拟场景漫游的方法。

Java3D;虚拟现实;虚拟场景

一、Java3D实现虚拟室内装饰效果实现方法

1.Java3D场景结构图

Java 3D实际上是Java语言在三维图形领域的扩展,Java 3D的编程和Java一样,是面向对象的编程。Java 3D的数据结构采用的是Scene Graphs Structure(场景图),这一灵活的树状结构与显示列表多少有些相似之处,但运用起来更耐用。Java3D的场景图是DAG(Directed-acyclic Graph),即具有方向性的不对称图形。

在一个Java 3D应用程序看到的逼真三维场景从程序的角度看来,实际就是由Java 3D定义的一系列的对象,这些对象不是杂乱无序的,对象之间也不是毫无关系的。如果想让三维图像正常显示,必须在这两点上遵循Java 3D场景图的规定。图1就是Java 3D场景图的树结构,它由许多对象组成:

在图中出现的这些对象都实现了Java 3D中有重要的意义的类,从逻辑上我们将它们分为三类:

根节点(Root):V irtual U niverse Object

节点(N ode):Local Object、B ranch Group N odes、Behavior N ode、Shape3D N ode...

叶子节点(Leaf):Appearance、Geometry...

场景图中有许多线和线的交汇点,交汇点称为节点(N ode),不管什么节点,它都是Java 3D类的实例(Instance of Class),节点之间的线表示实例之间的关系。

在场景图中,最底层(根部)的节点是V irtual Universe,每一个场景图只能有一个V irtual U ni2 verse。

在V irtual Universe上面,就是Locale节点,每个程序可以有一个或多个Locale,但同时只能有一个Locale处于显示状态,就好象一个三维世界非常大,有很多个景点,但我们同时只能在一个景点进行观察。

每一个Locale上面拥有一个到多个B ranchGroup节点。所有三维形体的其位置信息(Trans2 form Group节点)都建立在B ranchGroup节点之上。

Transform Group节点用来设定Shape3D在V irtual U niverse中的位置。

Spape3D节点是三维图形节点,这个节点的实体放映在最后的显示画面中,就是三维世界中的每个形体。包括正方体、球体以及任何形状和外观的三维形体。

位于场景图最下层的是两个叶子节点:三维体的外观(Appearance)和几何信息(Geometry),这两个节点定义了一个三维体的显示效果。

V iew Platform位于图1的另一个分枝上,与前面所有描述三维体性质的概念不同,V iew Plat2 form和V iew都是用来定义观察者的信息。

上面所列的概念很多,但是对于建立一个简单的Java 3D程序,我们至少需要了解三个概念:虚拟宇宙(V irtual Universe)、场景(Locale)、坐标系统。

图1 Java3D场景图

2.构建虚拟室内装饰场景

创建一个Java3D程序大致有如下几步:

(1)创建一个Canvas3D对象。

(2)创建一个V irtualU niverse对象。

(3)创建一个Locale对象,将Locale对象关联到V irtualU niverse对象。

(4)创建V iew子图。

·创建一个V iew Platform对象

·创建一个PhysicalBody对象

·创建一个PhysicalEnvironment对象

·创建一个V iew对象,将V iew Platform,PhysicalBody,PhysicalEnvironm ent和 Canvas3D对象关联到V iew对象上

(5)构造内容子图。

(6)编译子图。

(7)将子图插入到Locale节点。

Java3D提供了一个Simp leUniverse类,该类实现了(2)-(4)步,可以大大的简化代码有利于使开发者将工作集中在创建场景内容上。场景的内容一般包括几何形体、外观、光照、声音、行为等对象,它们按Java3D场景图的规则组成内容子图。

当然,在实际的编程中还要对背景、材质、灯光、行为等进行设置。所有内容都放在一个B ranch2 Group对象里面。Transform Group对象用来定义可以移动、旋转、放大缩小的局部坐标系。而且可以将多个形体放置在同一个Transform Group里面。文中实现的虚拟场景的重要部分程序代码为:

//建立环境光

Am bientLight aLgt=new Am bientLight(alColor);

aLgt.setInfluencingBounds(bounds);

B rachGroup Root.addChild(aLgt);

//建立基本模型

Transform 3D t=new Transform3D();

t.setTranslation(new Vector3f(0.0f,-5f,0.0f));

Transform Group tg2=new Transform Group(t);

tg2.addChild(new Box(10f,0.2f,10f,Box.GEN ERA TE_TEXTURE_COORDS|

Box.GEN ERA TE_NORM ALS,app1));//地

//显示物体

transform group.addChild(tg2);

3.虚拟场景中交互功能的实现

上面我们构造出的形体大都是静止的,是一幅幅静态的3D场景。要想使程序更吸引人、更有趣,这就需要引入交互。在Java 3D中,交互是指程序的输出根据用户行为而产生预期的变化。Java 3D中,交互是通过Behavior类来实现的。

Behavior的中文意思就是“行为”。而它在Java 3D中所描述的就是3D场景在程序运行时的行为。Behavior类是一个抽象类,它定义了所有Behavior对象的公共同性。Java 3D中有一些预定义的Behavior类的子类,这些子类为实现交互编程提供了极大的方便。

Behavior类是基于这样的机制运行的:程序刚运行的时候,向场景中安装特定的Behavior对象,该对象只接收特定的激励(比如:键盘按键、鼠标移动、一个定时器消息等等),然后对这一激励作出响应(比如改变观察者的视角及物体的位置、颜色等等)。

(1)键盘交互的方法。

在Java 3D附带的工具类中提供了支持该项功能的类——KeyNavigatorBehavior。该类通过响应用户的键盘输入来控制观察者的移动。用户可以用左右键控制旋转,用上下键控制前进和后退,用翻页键控制视角的俯仰变化。

(2)鼠标交互的方法。

在Java 3D的工具类中还提供了通过对鼠标的输入进行交互的类,这些类可以根据不同的鼠标输入来平移、旋转和缩放物体。其中M ouseRotate是用来原地旋转物体的,用户可以使用鼠标左键来实现,M ouseTranslate是用来在与屏幕平行的平面中移动物体,用户可以使用鼠标右键来实现,M ouseW heelZoom是用来在与屏幕垂直的平面中移动物体,用户可以使用鼠标滚轴来实现。

(3)利用鼠标实现点取物体。

以上所实现的交互都是对整体场景进行的,在Java 3D中还有一种类是用来实现单个物体交互的,这就是利用鼠标实现点取物体的功能。这个类就在com.sun.j3d.utils.behaviors.picking包中,导入了这个包就可以实现鼠标点取对象的功能了。PickRotateBehavior允许用户点取并且旋转可视对象,用户使用鼠标左键点取,Pick ZoomBehavior允许用户点取并缩放可视对象,用户使用鼠标中键来点取并缩放,Pick TranslateBehavior允许用户点取并且平移可视对象,用户使用鼠标右键点取。然后将鼠标点取功能添加到相应物体上。

本实例中运用了键盘控制的方法实现了交互。具体代码如下:

//建立键盘控制

KeyNavigatorBehavior keyNavBeh=new KeyNavigatorBehavior(transform group);

keyNavBeh.setSchedulingBounds(new BoundingSphere(new Point3d(1.0,1.0,1.0),100.0));

B rachGroup Root.addChild(keyNavBeh);

通过以上代码,构建了一个虚拟的室内装饰场景。场景及场景中的物体通过材质贴图的设置,表现力更强,观赏性更强,同时可以用鼠标随意点取物体,实现放大、缩小、旋转、移动的功能,场景也可以由键盘控制,实现漫游效果。如图2、图3所示:

图2 场景中漫游效果

图3 鼠标点取物体效果

二、利用Java3D和3ds max构建更逼真的虚拟场景

以上的虚拟场景中的物体,都是通过Java3D中的最基本的形体,如:柱体、球体、长方体等规则体实现的,因而在构建复杂物体时有一定的缺陷,也就是物体的逼真度稍差。我们为了解决这一问题,利用了Java3D的Loader功能来导入其他三维软件中生成的复杂三维图形文件,Java3D支持的三维图形的格式有:.obj、.3ds、.vrm l、.WRL等,通过Loader功能可以使虚拟场景更加逼真。

下面就以导入.WRL文件为例,展示这一效果。我们在3ds max中制作了一个室内效果,然后将它存为.WRL文件,然后我们进行代码的编写,在实现导入效果图的同时,实现用鼠标控制,进行漫游的功能。代码基本与用Ja2 va3D创建场景相同,这里只介绍关键代码部分。

B ranchGroup b1=new v rm lLoad(“/Ford_M ustang/7.WRL”);

objTrans.addChild(b1);//导入.WRL文件

在编写以上代码的同时还要编写一个Load.java的文件,才能实现.WRL文件的成功导入。最终效果如图4所示:

通过这样的方法,我们可以利用专业的建模软件制作场景模型,然后再导入Java3D中进行漫游、交互的设置,使场景效果更逼真,达到使参观者身临其境的目的。

[1]张杰.Java3D交互式三维图形编程[M].北京:人民邮电出版社,1999.

[2]都志辉.Java3D编程实践—网络上的三维动画[M].北京:清华大学出版社,2002.

[3]何江龙,方源敏,罗志清.Java3D技术与虚拟现实[J].地矿测绘,2006,22(02).

[4]黄莹莹,彭敏俊,许岷.基于虚拟现实的数字校园漫游系统的设计与实现[J].应用科技,2005,32(05).

[5]高新瑞.Java、Java3D与计算机几何设计[M].北京:电子工业出版社,2007.

A bs tra c t:The current modeling method is mainly p rogrammed by using Open GL and VRML languages,w hich is,however,hard to handle and not easy to p romote.By comparison,Java3D,as a new app lication p rogramm ing interface,p rovides efficient development p roperty.This paper introduces the author’s research on how to use Java3D to build virtual environment,to enrich 3D performance re2 sults and to realize the environment-user interaction.It also shows themeans of realizing roam ing in Ja2 va3D virtual scene.

Ke y w o rd s:Java3D;virtual reality;virtual scene

Research on Java 3D Virtual Interio r Deco rative Effect D isp lay

L I Rui

(Xinhua Staf f and Workers University,Tianjin 300040 China)

TP319

A

1673-582X(2011)02-0082-05

2010-10-15

李蕊(1981-),女,天津市人,天津市和平区新华职工大学,讲师,工学硕士,主要研究虚拟现实技术、多媒体技术应用、数字视频编辑等。

猜你喜欢
形体鼠标编程
浅谈形体训练在声乐表演中的作用
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
西夏文形体研究述略
早期形体训练对产妇产后形体恢复的积极效果
鼠标折叠笔
45岁的鼠标
超能力鼠标