〈蠹乙残矶伎垂昂诳偷酃卑桑捌瓜指颐堑氖俏颐巧畹恼媸祷肪骋丫觯《氖且桓鲂槟獾氖澜纭K淙幌附谟兴煌侨嗣且残碚嫦M幸惶欤梢酝ü缱踊蛘咝槟獾南质道窗谕殉林乜菰锏娜粘I睢F涫敌槟庀质导际踉缭?994年就已经达成了一个共同的标准, 但是由于网络和电脑硬件的限制所以直到近些年它才得到迅猛地发展。关于虚拟现实,它是以VRML语言作为语言基础的,我们也陆陆续续的介绍了它的语法基础、结点定义以及通过外部的软件来达到创建大型复杂场景的目的。但是也许你会发现我们创建的场景虽然可以通过外部软件的帮助,在场景的结构和布局等方面有很好的表现,然而在场景的互动性等方面却明显有所不足。我已经了解了所有的结点的内容和意义,为什么没有令人满意的效果,这其中的原因很多,就像你已经懂得了1+1=2,但是为什么有许多的数学题目你仍然不会做。在VRML这一个问题上面,也许你忽略了一个重要的问题,就是虚拟现实的互动性不仅仅倚靠运用编写虚拟现实的结点来实现,它还需要一个小程序的支持,可能是一个也可能是多个这样的程序,这些程序才是互动性的关键。其实在运用3DMAX这类的外部软件进行场景的构建时,它的一些按钮设置栏就已经具有一些短小程序的特点。这些程序通过script语言来编写,可以是javascript或者VBscript。做为介绍虚拟现实的高级技巧,我们就是和大家讨论这些程序的编写,以及如何将这些程序与VRML相结合。做为script语言,我们可以有两种选择,但由于运用的广泛性,在这里我们运用javascript加以讨论。
VRML做为虚拟现实的一种语言,首先我们看它与程序之间的交互原理,总的来说它的互动行为的执行有三类解决方法。一类是API的方法,执行模式是基于过程的,所谓的API就是执行模式建立在浏览器的API基础上,通过API调用一系列程序来控制场景,这种方法便于程序的编写,同时又可以简化场景,但是对于浏览器来说,它有可能无法得到足够的场景信息。另一类是通过语言的方法,就是将VRML的3D数据完全转化为程序语言,这种方法就与API的方法完全相反,它可以使浏览器得到场景的完整信息,也具有基本语言的控制结构,但它却引起文件过大,不太适用于网络传输。第三类是基于事件的方法,它是使用事件机制。VRML场景自我包含实体,它们通过一系列字段显示出他们的内在状态。可以通过使用事件来读写这些字段,写一个字段需要产生一个事件,这个事件被传送到字段中而且用事件的值去更 飧鲎侄巍T谡饫锼档淖侄纹涫挡皇羌虻サ囊淮涡灾担鑫私岬愕囊徊糠郑蠪ield定义特征的数据值类、evenIn接受事件的归宿类、evenOut事件的发生源类和结合evenIn与evenOut的Exposed类。读一个事件发生在一个字段值改变或这种改变引起另一个包含新值的事件被发送。这类方法是使用最广泛的,它能将执行对象与程序分离,在文件内部包含实体,执行程序在场景外部,浏览器中处理浏览者,三者之间通过事件进行联系。
下面我们通过一个实例来说明事件的工作机理。比如说场景中是一个人背一个背包在行走,人和背包是两个不同的实体,我们如何将它们结合共同走向同一个目标,请看下面的例子:
人的模型
DEF MAN Transform {
transform 0 0 0
children[
DEF HEAD Transform {
???
}
DEF HARD Transform {
???
}
???
]
}
背包的模型
DEF SATCHEL Transform {
transform 0 0 0
children [
DEF Box Transform {
???
}
???
]
}
它们都是从原点开始移动,我们通过一个事件路线将它们的移动结合起来:
ROUTE MAN.translation TO SATCHEL.translation
这其实是一句简单的script语句,当man移动时,将man的移动传递给satchel的translation,这样它们就可以同步的移动了。在上面的例子中,我们还没有讨论到什么时候man开始移动,或者是什么情况下他开始移动,这里VRML便引入了插入器结点和传感器结点,其实在介绍VRML结点的文章中我们就已经介绍了这些结点的内容,例如说PositionInterpolator、TimeSensor等。就插入器结点来说,在上个例子中,我们只要给出了人的初始位置、终止位置和运行的路线,它就可以自动的计算每一个时间人的位置,而每一个时间则是由时间传感器结点来提供。如何用程序触动时间传感器以及传感器与插入器如何控制结合,这些都将是我们以下的文章中讨论的重点。