吴 迪,吴亿维,刘 军,徐 朋,王彦春,李学慧
(1.大连大学 物理科学与技术学院,辽宁 大连116622;2.东北大学 机械工程与自动化学院,辽宁 沈阳110819)
目前许多学校设立了大学物理实验网站,学生可以利用业余时间登陆网站学习实验原理、操作.但问题是目前的网站多半是文字叙述加上仪器图片展示,或有动画描述实验过程,而这一过程也是事先由程序编制者设定好的,只能按照一定的路线执行,与实际实验相差甚远.
虚拟现实(virtual reality)是计算机模拟的三维环境,是一种可以创建和体验虚拟世界的计算机系统.虚拟环境是由计算机生成的,用户可以通过计算机进入这个环境并能操纵系统中的对象并与之交互[1-3].VRML是第二代 Web上的关键技术,是一种三维场景的描述性语言,也是在Internet网上实现虚拟现实的关键性技术[4-8].在Internet上传输很少的数据,就可以在Web上实现三维虚拟场景浏览功能,克服了一般三维模拟软件的缺点.因而采用VRML开发三维虚拟实验应是解决这些问题的一种较好的方法[9-11].首先虚拟现实是三维的、立体的,是符合人们日常生活习惯的,学生可沉浸在实验之中;其次虚拟环境中学生不是被动地感受,而是可以通过自己的活动改变感受的内容.采用VRML技术开发的三维虚拟现实实验可以不受时间和地域限制,学生或教师可以自由地、无顾虑地随时进入虚拟实验室操作仪器,而他只需在联网的计算机浏览器上安装 VRML插件,如Cosmoplayer,Cortona或Blaxxun Contact等任意一种就可以进行各种实验.显然虚拟现实实验可以给学生更多的思考时间和空间,从实验仪器的构造到使用方法,从原理到测试公式的创建,再到实验环境的搭建,完全由学生自行设计、组建.虚拟实验可以仿真现实实验,提高学生学习兴趣,增加学生分析问题的时间和学习的时间,可以充分调动其主观能动性.
但目前所开发的项目大多存在交互性弱、沉浸感不强等问题.本文以气垫导轨上的实验为例就虚拟实验中复杂运动的联动交互控制方法进行了研究.VRML本身不能进行复杂交互,因而对于仪器调整这种复杂交互操作就不能只通过VRML进行.为了实现创建的虚拟空间本身与操作者之间的复杂交互,要利用虚拟空间与操作环境的特定应用之间的接口来实现它与用户之间的交互,笔者采用JavaScript编程实现这种功能[12-13],讨论 VRML中 Script节点的应用,最终建立了具备交互功能的三维虚拟牛顿第二定律的研究和简谐运动的研究实验,较好地实现了复杂运动的交互操作与联动控制.
虚拟场景的联动是通过节点来实现的.一个节点状态的变化能引起另一个节点状态的相应变化.VRML中将状态的变化记为一个“事件”,引起其他节点变化的节点发出“事件输出”,发生变化的节点接受“事件输入”.VRML提供了多种感知器节点,如可接收鼠标点击形体的动作并使程序发生相应变化如动画、发出声音、改变颜色等的TouchSensor节点;可使鼠标的移动转变成形体的绕坐标轴旋转运动的CylinderSensor节点;可以检测到观察者接近的ProximitySensor节点,利用它们可控制其他操作,如发出声音,让形体运动、让形体颜色变化,等等;还有时间传感器TimeSensor节点等.
VRML空间中各节点间的数据交互可以实现控制场景中的物体产生一些简单行为的联动动作:如打开开关时灯会发光,走近自动门附近门会自动打开,等等.通过路由及感知器节点基本上能够实现场景的简单联动交互.对于复杂的联动交互控制VRML采用Script节点来实现这种功能.Script节点中的域指定一段实现事件处理的JavaScript脚本,然后将程序计算返回的结果递交给Script节点的输出事件,再通过路由将该事件传递给场景中某对象的相关域,达到改变场景的目的,实现过程如图1所示.
图1 VRML联动动画原理图
大学物理实验中气垫导轨上的实验主要有牛顿第二定律的研究和简谐运动的研究.虚拟这2个实验主要是向用户提供尽可能真实的仿真仪器,可以通过 VRMLPad或vrbuild[14]直接建造三维模型,文件占用字节数较少,适宜在网上运行;也可采用3DMAX或MAYA等软件建造再转换成VRML格式文件,但缺点是形成文件太大,影响网上运行速度和运行质量.虚拟的简谐运动实验装置如图2所示,虚拟的牛顿第二定律实验装置如图3所示.用户可以利用鼠标拖动光电杆将其摆放在合适的位置上以取得滑块在相应位置的速度,这个过程是通过人机交互来实现的.VRML允许用户的行为能够实时作用于场景,场景节点通过EventIn接收事件,通过Event Out发出事件,通过路由将一个节点的事件出口和另一个节点的事件入口联系成为事件体系使VRML具有动态交互能力.但VRML语言本身所能完成的交互功能是有限的,要实现复杂联动交互功能还需要通过脚本语言来实现,VRML提供了一个Script脚本节点,通过该节点可以实现复杂交互操作和逻辑控制等功能.Script节点允许用户创建自己的域(field)和事件,其中包括入事件(EventIn)和出事件(Event Out),再通过编写节点内部程序来完成目标功能,它支持多种脚本语言,如 VRMLScript,JavaScript,VBScript等.
图2 简谐运动研究
图3 牛顿第二定律研究
需采用时间传感器TimeSensor来执行开始、停止或者其他控制动画的动作.
3.1.1 定义时间传感器
格式如下:
DEF TS TimeSensor{
cycleInterval 1
loop TRUE
}
时间传感器通过定时产生事件来表示时间的变化.
3.1.2 事件驱动
场景需要一系列的变化数值而产生动画,产生变化数值的节点可以是插补器节点或者Script节点.域值通过Route语句传送,由节点的入事件接收并处理.Script结点在VRML场景中不被显示,其工作原理如图1所示.Script结点可以由若干个EventIn,Event Out,包含脚本程序的url域等构成.其中EventIn入事件接收来自其他节点的出事件,并交给对应的同名函数进行处理.url域中的处理函数计算新的值,并通过节点的Event Out发送出去.
#### 实现滑块的简谐运动功能的脚本程序 ####DEF Program Script{
field SFFloat amplitude 1.25 #定义振幅
field SFFloat twoPi 0.0 #定义常量
……
url"javascript: #指明脚本
function initialize()#初始化程序
{
初始化滑块位置等变量
}
function set_start Time(start Time,event Time)#设置开始振动时间
{
x1start Time=start Time;
}
function set_fraction(fraction,time)#实现交互功能函数
{
phase=-20.0;
translation_changed[0]=-2+amplitude*Math.sin
(twoPi*((phase/wavelength)-fraction))+0.05;
translation_changed[1]=0;
translation_changed[2]=2;
}
ROUTE TS.fraction_changed TO Program.set_fraction
Route语句把一个节点的出事件连接到另一个节点的入事件,从而建立起指定节点的域之间的通道.Route语句由出事件激活,当发生1个出事件时,包含该出事件的Route语句被调用,对应的入事件就会接收到信息,同时可以对入事件做出相应的处理.从而改变节点的状态,实现简谐运动.
3.2.1 光电杆位置的动态设置
首先使用平面传感器节点PlaneSensor定义平面传感器:
DEF gd Transform{
children[
DEF ts0 PlaneSensor{#其中一个光电杆
minPosition -2.0.4
maxPosition -1.1.4
offset 0.01 0 1.72
}
Inline{url"gd1.wrl"}
]
}
其中minPosition和maxPosition用于设定物体在空间的移动范围.Inline为内联节点,将另一wrl文件引入,这里gd1.wrl为光电门空间几何结构文件.
其次定义路由语句实现交互功能:ROUTE ts0.translation_changed TO gd.translation实验中只要用鼠标拖动光电杆即可在约束的范围内调整其位置.
3.2.2 光电杆位置的获得
将光电杆拖动到某一位置后,要想知道滑块运动到此位置时的速度就需要定量给出光电杆被拖动后的确切位置,通过下述方法实现:
function set_fra0(trackPoint_changed,timeStamp){
xpointer1[0]=trackPoint_changed[0];
}
ROUTE ts0.track Point_changed TO Program.set_fra0
通过路由语句将其中1个拖动后的光电门位置赋给变量xpointer1.
与滑块一起运动的挡光片上设有具有一定间隔的2个探针,与滑块一起作简谐运动,当其中每个探针经过光电门时记录相应的时间,利用二者的时间差值和2个探针间距即可计算出滑块经过光电门时的速度.
在function set_fraction(fraction,time)函数中采用语句timexs1=time-x1start Time取得运行时间,在下面函数中记录滑块探针经过光电门时的时间.
function set_check1(time1,timeStamp){
if (Math.abs(translation_changedpointer1[0]-
xpointer1[0])<=0.01)
t11=timexs1;
if (Math.abs(translation_changedpointer2[0]-
xpointer1[0])<=0.01)
t12=timexs1;
deltt1=t12-t11;
v1=0.6/Math.abs(deltt1);#计算速度
lblOut.set_string[0]=′Rightv1′+v1;#送显
}
采用广告版显示运行数据.
Billboard{
geometry DEF output Text{
string""
fontStyle FontStyle{
size.3
}}}
在Script节点中采用field SFNode lblOut USE output 和 lbl Out.set_string[0]=′Rightv1:′+v1将数据送到显示屏显示,实验运行结果如图4所示.
图4 实验运行图
复杂运动的联动交互控制必须借助于功能强大的高级语言来实现,以弥补VRML本身如逻辑判断、精确场景控制等的不足.本文通过使用VRML的Script节点编程着重研究了基于VRML技术的虚拟实验联动动画技术,设计了具有联动交互控制功能的气垫导轨上的实验,为传统的教学注入了新的活力.可以预见VRML网络虚拟技术在整个实验教学、产品虚拟设计等方面有着广泛的应用前景.
[1] 章天金,马志军,江娟,等.三维动画技术在固体物理学教学中的应用[J].沈阳师范大学学报(自然科学版),2007,25(4):454-456.
[2] 孟艳,傅钢善,常鑫.VRML中的交互机理与实现研究[J].电子科技,2009,22(6):40-44.
[3] 曹咏弘,范荣强,范锦彪,等.基于虚拟现实的弹丸时空位置再现技术研究[J].弹箭与制导学报,2010,30(1):91-94.
[4] 黄文丽,卢碧红,杨志刚,等.VRML语言入门与应用[M].北京:中国铁道出版社,2003.
[5] 吴北新.虚拟现实建模语言VRML[M].北京:高等教育出版社,2004.
[6] 陆昌辉.VRML入门与提高[M].北京:北京大学出版社,2003:201-202.
[7] Web3D Consortium.Virtual Reality Modeling Language [DB/OL]. (2003-12-16).http://www.web3d.org/x3d/specifications/vrml.
[8] Aereal Inc.VRML 2.0 [DB/OL].[2012-03-10].http://www.vrmlsite.com.
[9] 顾冬华,王俊杰,杨立.虚拟现实技术应用于电工实验课教学的尝试[J].中国现代教育装备,2010(13):55-56,67.
[10] 余东先,杜纪霞.基于VRML-JAVA远程虚拟教学系统的设计与开发[J].河南科学,2010,28(5):600-604.
[11] Duan X Y,Jiang P.Exploration to virtual reality 3D key techniques based on cosmo browser plug-in[J].International Journal of Digital Content Technology and its Applications,2011,5(6):391-402.
[12] 王昊鹏,赵凯.VRML基于高程格网节点的复杂造型研究[J].微计算机信息,2006,22(19):211-212,144.
[13] 王建中,李定国,张家昌,等.基于VRML的工程热物理虚拟实验教学系统[J].实验室研究与探索,2006,25(12):1530-1532.
[14] Ligos Corporation.V·RealmTM.Builder User’s Guide and Reference[DB/OL].[2010-02-10].http://www.few.vu.nl/~eliens/documents/vrml/V-Realm.