"VRML"物体旋转实例解析
的有关信息介绍如下:VRML,又叫做虚拟现实编程语言,它可以应用在很多地方,但是目前来看,VRML的应用并不广泛。可能是因为虚拟现实产品的更新换代所致,但是这并不影响它依然在一些领域发挥的作用。目前,VRML被国内很多高校用于教学演示和虚拟实验室。
以螺丝和螺母为例,来讲解VRML中如何实现物体旋转。
如图所示,图中标示出两个物体,分别是物体1——螺母、物体2——螺丝。
例子中的效果是,螺母逆时针旋转使螺丝向上运动,螺母顺时针旋转使螺丝向下运动。
在所有的VRML设计中,都涉及到一个“事件”名词。例子中涉及到两个事件,物体1的旋转以及物体2的上下运动。实现这两个事件,我们应用VRML中的节点定义、脚本编程、事件路由的设定来实现。
首先,我们需要对这两个物体进行定义。打开VRML编辑器来查看代码。
在代码中,我们分别定义物体1为“zp”、物体2为“lt”。
因为物体1需要使用鼠标选择,所以需要在物体1上定义“CylinderSensor”节点,使得物体1能够绕Y轴进行选择运动。当然“CylinderSensor”节点也需要定义一个“名字”,好方便在接下来的事件路由的设定中。
如果未定义“CylinderSensor”节点,在wrl文件中,当鼠标移动到物体1上时,不会出现“手型”图标。
再次,我们打开VRML编辑器,进行脚本程序的编写。整体的运动事件由两个事件组成,分别是物体1的旋转,和物体2的上下运动。所以这里需要进行两个脚本程序的编写。分别定义这两个程序为s1和s2。
脚本程序中,有事件输出“eventout”和事件输入“eventin”。如图所示,在这两个脚本中,分别的定义了pos和rot这两个变量。pos对应移动的位置,它由三个值组成,pos、pos、pos分别对应X、Y、Z轴。例子中的物体2是只做Y轴运动的,所以只对pos进行计算编写便可以。
rot对应旋转和位置,它由四个值组成,rot、rot、rot、rot,分别定义了旋转中心轴和旋转角度。
最后,我们进行事件路由的设定。事件路由,就是按照事件发生的顺序进行设定。开始事件便是鼠标带动物体1进行旋转,触发整体事件的发生,物体2进行Y轴运动,并运动到一定高度时停止物体1的旋转和物体2的Y轴运动。
依据这个顺序,我们了解到,第一事件为鼠标触发的“CylinderSensor”节点传递到s2脚本程序,传递到物体1自身,传递到s1脚本程序,传递到物体2。
下方便是,设定的整个事件的过程。
ROUTE cs1.rotation_changed TO s2.set_rotation
ROUTE s2.rot TO zp.set_rotation
ROUTE zp.rotation_changed TO s1.set_rotation
ROUTE s1.pos TO lt.set_translation
整个事件就完成了,我们来看看运动效果吧!
在VRML中,有一个叫做插值节点的节点定义。就是说,需要实现设定好物体事件的变量值。
在这里就以旋转为例,需要为物体定义旋转需要的中心轴和角度。这便是由四个数字组成,前三个数字分别代表X、Y、Z轴的值,后一个数字代表旋转角度。
例子中使用的内插器节点为“OrientationInterpolator”节点。
当然,还可以添加一个时间控制器节点,这样便能控制物体自旋转的速度快慢了。时间控制器节点“TimeSensor”,这里还是需要应用脚本程序来完成设定。
这里定义一个名为“accelerator”的脚本,脚本的输入输出时间均为时间变量。所以只需对时间进行简单的计算就可以实现旋转速度的控制。
这里定义了两个事件控制器节点,分别定义在物体和插值器上。时间路由为文件开始传递到插值器传递到物体,同时物体时间节点传递脚本时间出入传递脚本时间输出传递插值器时间节点。
其中,例子中物体定义为“transform”、插值器定义为“orientation”、时间节点分别定为“ACCSensor”、“sensor”。
ROUTE sensor.fraction_changed TO orientation.set_fraction
ROUTE orientation.value_changed TO transform.rotation
ROUTE ACCSensor.cycleTime TO accelerator.c1
ROUTE accelerator.c2 TO sensor.cycleInterval
脚本的实现有很多种方法,并不是唯一的!
“CylinderSensor”节点的默认便是绕Y轴运动,如果需要进行非Y轴运动,需要进行多次children定义。