VRML的基础教程 联系客服

发布时间 : 星期日 文章VRML的基础教程更新完毕开始阅读9224e921dd36a32d7375819e

}

ROUTE TouchS.isOver TO ticker.set_enabled

ROUTE ticker.fraction_changed TO revolver.set_fraction

ROUTE revolver.value_changed TO cube.set_rotation

小结:本节实现连续动画,动画由接触检测器启动,由时间检测器驱动,动画本身比较简单,就是不断地旋转。产生不断变化的旋转值的方法有两种:自己编写脚本,或者利用插补器节点。

第五节 动态修改场景图

场景图是描述境界结构的基本概念,节点是构成场景图的基本单元。组节点是能够包含字节点的节点,组节点本身还可作为其它组节点的子节点,从而形成层次性体系结构。VRML中的组节点包含Anchor(锚)、 Billboard(布告牌)、 Collision(碰撞)、Group (组)、Inline (内联)、LOD(细节层次)、 Switch(开关)、Transform(变换)共八种,除Inline、LOD、Switch这几个具有特殊功能外,它们都定义了入事件addChildren 和removeChildren ,前者用于向组节点的子节点域children 中增加新的子节点,后者用于从中删除子节点,这样就可以动态修改场景图的结构。

下面是我们这一节要建立的境界,开始的时候球体位于左边红色方块的内部,在按动底部的绿色方块后,球体进入右边蓝色方块之内。

首先定义三个方块:

#VRML V2.0 utf8

Viewpoint { position 0 0 15 }

DEF leftBox Transform {

translation -5 0 0

children [ Shape {

appearance Appearance {

material Material { diffuseColor 1 0 0 } }

geometry Box {}

} ] }

DEF rightBox Transform {

translation 5 0 0

children [ Shape {

appearance Appearance {

material Material { diffuseColor 0 0 1 } }

geometry Box {} } ] }

DEF onoff Transform {

translation 0 -5 0

children [ Shape {

appearance Appearance {

material Material { diffuseColor 0 1 0 } }

geometry Box {}

} ] }

其中左边的方块为红色,右边的方块为蓝色,下边的方块为绿色,都是Transform类型,三者都位于场景图的最高层,都是场景图的根节点,都包含一个Box几何体作为子节点。下面为红方块增加一个球体子节点:

DEF leftBox Transform {

translation -5 0 0

children [ Shape {

appearance Appearance {

material Material { diffuseColor 1 0 0 } }

geometry Box {} }

DEF SphereChild Shape {

appearance Appearance {

material Material { diffuseColor 1 0 1 } }

geometry Sphere { radius 1.2 } } ] }

为了以后引用方便,这里还为球体子节点起了名字:SphereChild .为了让用户能够增删这个儿子,把绿方块定义成接触检测器:

DEF onoff Transform {

translation 0 -5 0

children [ Shape {

appearance Appearance {

material Material {diffuseColor 0 1 0 } }

geometry Box {} }

DEF TS TouchSensor {} ] }

子节点增删的具体任务由Script节点来完成:

DEF S Script {

eventIn SFBool isActive

eventOut MFNode child

field MFNode testNode USE SphereChild

url\

function isActive (value) {

if (value)child = testNode;