收稿日期:2008-05-20;修回日期:2008-07-10
作者简介:郭鸿飞(1980-),男,硕士生,主要研究方向为虚拟现实。E-mail:guohf@
虚拟环境下基于Java3D的交互控制
郭鸿飞,王守尊
(海军工程大学船舶与动力学院,武汉430033)
摘要:介绍了利用Java3D对外部模型的导入及交互控制,并通过实例分析了Java3D对VRML格式模
型的交互操作。结合具体实现的代码阐述了扩展鼠标交互功能雷锋出生 的一般性方法,通过改写Java3D中相关的
鼠标操作基类,给出了实现过程中技术难点的解决方案;最后通过实例证明了此研究工作在虚拟装配操作
过程中的应用价值。
关键词:虚拟现实;人机交互;Vrml;Java3D;
中图分类号:TP391.9文献标志码:A
InteractiveControllingoftheVirtualEnvironmentinJava3D
GUOHong-fei,WANGShou-zun
(CollegeofNavalArchitectureandPower,neering,Wuhan430033,China)
ABSTRACT:ThispaperhasintroducedtheimportoftheexteriormodelsandthemutualcontrollingoftheminJava3D,andthe
gramsarelistedtoexplainthesolutionsforrealizing
thedesign,whichincludestheinheritance,overloadingandmodificationoftheba-classinJava3D.
KEYWORDS:VirtualReality;Human-ComputerInteraction;Vrml;Java3D;
1997年,SUN公司继Java的火爆成功之后迅速推出了适用于Internet环境的跨平台的三维图形开发工
具包Java3D。Java3D是Java2SDK的标准扩展,它将OpenGL和DirectX这些底层技术包装在Java接口
中。这种全新的设计使3D技术变得不再繁琐并且可以加入J2SF,J2FF的整me的意思 套架构,保证了Java3D技术
强大的扩展性[1]。Java3D其本质是一个交互式的三维图形应用编程接口(API),因此它可以和普通的Java
2D、Swing、AWT、Applet等很好的结合。Java3D支持导入外部3D图形文件,因此,采用PRO/E,Solid
Works,3DMAX等三维建模软件,可以在直观可视的条件下建立零件模型,并给模型设置材质和贴图,
再利用Loader接口将建立好的模型导人到Java3D场景中,这样就大大地减少了工作量,使设计者能够把
更多的精力放在人机交互等更深入的研究上。
1模型的建立及导入
Java3D提供了基本形体以及编写点、线、面的各种对象的应用,这些内容可以在应用程序之中构造简
单的形体,复杂的形体则很难实现。可以通过调用其它格式的三维图形文件获得复杂形体,如直接调用
VRML2.0、OBJ和Lightwave格式的三维图形文件,或者通过处理,间接调用DWG,DXF,3DS等格式
的三维图形文件。这些格式的三维模型可以很方便地应用在Java3D程序中。其中VRML作为虚拟现实建
模语言,具有文件体积小、易于编辑、适于王二小的故事简短 网络传送等特点,其应用非常广泛。
1.1选择PRO/E机械设计模块进行零件建模。
采用Pro/E进行实体建模的最终目的是输出VRML格式模型,在进行零部件建模时要考虑模型导入后
Java3D对模型的识别能力。建好零部件模型,在PRO/E中将单个零件模型进行装配后,如果直接将装配
体导出为Vrml文件,PRO/E会自动生成设计者难以控制的一系列的信息和视点,代码过于繁琐。同时也
不推荐从零件模型导出为Vrml文件,这种方式建模效率低,而且在导入Java3D时每个零件都会生成各自
的默认坐标系,不利于零件的管理。经过反复的试验总结,同时鉴于3DMAX不善于机械建模但导出的
Vrml文件代码简洁,确定了与Java3D相匹配的Pro/E建模方法。根据零件数量上的多少采用不同的方案:
①当装配体零件较多时,由于大于2.3兆以上单个Vrml文件导入Java3D应用于网络时就会出现显示不全、
速度慢等问题。所以在PRO/E装配体文件中选择导出为STL格式文件,在出现在对话框中选择“包括”(见
图1),然后选择单个或者多个零件保存为STL格式文件。用这种方法将所有的零件和子装配体导出。然后
在3DMAX中将刚才STL格式的零件模型导出为Vrml文件。这样便得到单个零件的Vrml格式模型,其
中的默认坐标系已经设置好。直接导入Java3D或者通过下面格式的Vrml文件进行组合:
DEFxiaxiangtiTransform{
#...设置相应域值
children[
Inline{url""}#包含箱体
]}
DEFshangxiangtiTransform{
#...设置相应域值
children[
Inline{url""}#包含箱盖
]}
#...包含其他零件或子装配体
组织模型的VMRL文件中Transform节点一定要定义英文名,方便以后进行操作和控制,然后进行导入。
②当装配体中零件较少时可以用3DMAX直接将PRO/E导出的装配体STL文件导出为Vrml文件。注意
Vrml文件中所有的Shape对象都要定义相应英文名[2红花功效与作用 ]。
1.2Java3D对Vrml模型文件的导入
Java3D的s包中包括了Loader和Scene两个接口。在Java3D中调用不同格式的3D
图形文件,应根据这两个接口编写自己的Loader类,针对不同类型的3D图形文件编写不同的Loader类。
SUN提供了一个VR英语物主代词 ML97的Loader,可以利用它在Java3D中调用VRML97类型的文件。首先下载
,并设置好其路径,通常应放在%JAVAHOME%lib目录下[3]。VRML97包中的
VrmlLoader实现了s包中Loader接口。
1.3Java3D获取模型节点
当使用Loader将一个VRML文件导入Java3D中时,Loader接口的Load的方法将返回一个
对象,一般情况下可以调用Scene的getSceneGroup()方法,该方法将返回一个
BranchGroup对象,该BranchGroup对象可以被Java3D的场景图直接引用。在虚拟装配的应用中,经常需
要获得单个场景对象,因为许多行为和操作都是针对单个零件,比如装配体中有若干零件,需要在Java3D
程序的运行时将零件的外观改变,以便更好地观察其细节,如果在一个VRML文件中定义了许多零件,那
么将其导入到Java3D中时,必须获得每个零件的单个实例,以便将它们作为单独的对象进行处理,这其
中就要用到Shape3D对象。Shape3D对象除了定义了三维形体的几何(Geometry)特征,还定义了形体的外
观(Appearance)属性。一个VRML的Shape对象对应Java3D的Shape3D对象,导入的时候必须对其能力
图1在装配体中选择零件导出为STL格式
标志位进行设置(见表1)。
表1Shape3D对象的标志
标志意义
ALLOW_APPEARANCE_READ程序运行时允许读入外观
ALLOW_APPEARANCE_WRITE程序运行时允许写入外观
ALLOW_COLLISION_金枝玉叶花 BOUNDS_READ程序运行时允许读取碰撞包围范围
ALLOW_COLLISION_BOUNDS_WRITE程序运行时写入碰撞包围范围
ALLOW_GEOMETRY_READ程序运行时允许读取几何体
ALLOW_GEOMETRY_WRITE程序运行时允许写入几何体
同样地,一个VRML中的Transform对象被后背麻 导入到Java3D场景中被转换为Java3D的TransformGroup
对象,通过它可以方便地实现零件的各种变换。在导入的时候必须对其能力位进行设置,如表2所示。
表2TransformGroup对象的标志
标志意义
ALLOW_TRANSFORM_READ允许在程序运行的时候读取该节点上的场景
ALLOW_TRANSFORM_WRITE允许在程序运行的时候修改该节点上的场景
这两个标志位十分常用,如果需要控制场景中的物体就一定要设定这两个标志。
2Java3D对节点进行交互控制
Java3D鼠标点取功能类主要在ors和g
两个包中,它们都包括PickMouBehavior、PickRotateBehavior、PickTranslateBehavior、PickZoomBehavior
四个类,g包已经被ors包所替代,不推荐
使用。它们都用到了包中的MouBehavior、MouZoom、MouTranslate、
MouWheelZoom、MouRotate类[4],这几个类都继承自行为基类or。.
or类也是编写自己的行为类时所要继承的类,如下面的PickInfoBehavior类实现点取场景中零件
时改变零件外观,同时根据我们前面所设置零件节点的UrData通过JDBC进行数据库的操作,查找所点
取零件的详细信息。
classPickInfoBehaviorextendsBehavior{
publicvoidprocessStimulus(Enumerationcriteria){
while(eElements()){......
if(pickResult!=null){NodetempNode=ect();
if(rData()!=null){accessoryname=(String)rData();
if(partinfof!挑战权威 =null){e();}
try{getinfo(accessoryname);}catch(SQLExceptionee){n("Exception:"+sage());}}
Shape3DtempShape=(Shape3D)tempNode;
if(entityint==1){earance(wireframeApp);}elif(entityint==0){
earance(entityApp);}}}
wakeupOn(newWakeupOnAWTEvent(_PRESSED));}
protectedvoidgetinfo(Stringaccessoryname)throwsSQLException{
connvrconn=newconn("accessory",accessoryname);//根据表名和零件代号实现数据库操作类进行零件信息查询}}
可以对Java3D里已经存在的行为类进行改写,以满足自己特定的需要[4]。PickTranslateBehavior类
默认的为使用鼠标右键对节点进行拖动控制,但是使用者习惯使用左键,便可以进行行为类的改写。
3应用实例
以圆柱齿轮减速器为实验模型,圆柱齿轮减速器由箱体、深沟球轴承、齿轮轴、装配轴、箱盖组成。
由PRO/E进行产品建模和装配,通过3DMAX生成VRML文件,经过编辑后保存在后台并建立相应的零
件数据库。在零件信息查询模块,用户可以通过鼠标点击和拖动自由查看数据库中保存的零件信息,如图
2、3所示分别为框图和实体模式下对零件的选择查看。在零件拆装模块用到了经过改进的鼠标点击事件类,
用户可以通过鼠标左、中、右键分别实现拖动、缩放、旋转零部件,如图4所示。
4结论
Java有两种类型的应用程序,一种是直接运行在Java虚
拟机上的Application,;另一种运行在浏览器里,由浏览器调
用执行,一般称它为Applet小程序。它可以把执行程序加到
web页面上,使web页面更加动态、更具交互性,从而大大
增加了支持Web的应用程序类型。本系统经过网络化能够实
现本地和远程虚拟装配。Java3D技术目前在国内的应用还
不是很多,但它的发展前景非常广阔,将逐渐为人们所熟知,
本文对Java3D技术的交互性进行了研究,在下一步的工作中将继续深化,如增加虚拟装配中设定网格和
对象捕捉技术、通过建立装配体零件树型结构实现零件自动寻找基准零件等,充分发挥Java3D在网络三
维领域的强大优势。
参考文献
[1]Java3DTutorial[DB/OL],/products/java-media/java3D.2005.
[2]张金钊,张金镝,张金锐.虚拟现实三维立体网络程序设计语言VRML-第二代网络程序设计语言[M].北京:
清华大学出版社,2004.
[3]都志辉.Java3D编程实践-网络上的三维动画[M].北京:清华大学出版社,2002.
图2框图模式下查看装配轴信息
图3实图模式下查看箱盖信息
图4正在使用鼠标左键拖动零件进行拆装
[4]邓文生,马王俊美.Java3D扩展鼠标交互功能的研究与实现[J].计算机仿真,2007,歌颂祖国的儿歌 4(3):176-179.
本文发布于:2023-03-21 18:55:30,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/3c5ca5d67ad27aad4096d753036da36f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:管理3d设置.doc
本文 PDF 下载地址:管理3d设置.pdf
留言与评论(共有 0 条评论) |