首页|行业资讯|企业名录|周边产品|数字城市|增强现实|工业仿真|解决方案|虚拟医疗|行业仿真|图形处理|军事战场
资讯首页
行业资讯 >> 学习教程>>正文
三维网页VRML入门教程第四节:连续动画
2010年9月14日    评论:    分享:

    来源:第三维度

    第一节:Hello,World
    第二节:增加交互能力
    第三节:邻近检测器
    第四节:连续动画
    第五节:动态修改场景图
    第六节:扩充节点类型
    第七节:结束语

    第四节 连续动画

    在第三节中我们已经使用过接触检测器,当我们把鼠标指针放到方块(这个几何节点包含接触检测器)上面时,指针形状发生变化,这意味着我们已经进入检测区,如果按下鼠标左钮,则按照我们的定义,当前视点会发生变化。

    这一节仍然制作这样一个对接触有反应的方块,只是接触后它会连续不断地转动,动画行为可以用时间检测器(TimeSensor)驱动,而不断变化的旋转值可用脚本节点或朝向插补器(orientationInterpolator)给出。

    1、接触检测器

    作为开始的基本代码是:

    #VRML V2.0 utf8

    DEF cube Transform {

    rotation 1 1 1 0

    children [

    Shape {

    appearance Appearance {

    material Material { diffuseColor 1 0 0 }

    }

    geometry Box {}

    }

    DEF TouchS TouchSensor {}

    ]

    }

    DEF revolver Script {

    eventIn SFBool startRevolving

    eventOut SFRotation revolve

    field SFFloat angle 0

    url "javascript :

    function startRevolving () {

    revolve[0]=1;

    revolve[1]=1;

    revolve[2]=1;

    revolve[3]=angle;

    angle+=0.1;

    }"

    }

    ROUTE TouchS.isOver TO revolver.startRevolving

    ROUTE revolver.revolve TO cube.set_rotation

    其中,方块cube包含两个子节点,前者定义了它的形态(红色的单位立方体),后者把它定义成接触检测器。注意,cube的类型是Transform节点,它的rotation 域是外露域,指定本组相对于上层坐标系的旋转值,这里指定的初始值是“1 1 1 0 ”,其中前三个数值定义旋转轴,最后一个值定义旋转角。由于它是外露域,因而可以通过入事件(名为set_rotation)进行修改,下面定义的动态行为就是这样实现的。

    Script节点revolver的核心是内联的ECMAScript脚本函数。它给定一个不断变化的旋转值。当鼠标指针移动到方块之上时,接触检测器发出isOver,和第一节中采用的isActive事件不同,isOver只有在鼠标左钮按下时才会发出。isOver事件通过路由传递给脚本节点的事件入口startRevolving,从而启动函数startRevolving,函数将一个新的旋转值发往事件出口revolve,这个旋转值通过路由进入cube的外露域rotation,修改了方块的旋转角,引起它的朝向变化。鼠标指针在cube上面的每次方位变化都引起isOver事件发送一次,从而导致方块旋转一次。

    2、时间检测器

    为了使方块能够连续旋转,需要引进等间隔连续发送的时间序列,这正是时间检测器的用武之地。时间检测器随着时间推移不断产生事件,可用于多种目的,包括: a. 驱动连续性的仿真和动画

    b. 控制周期性的活动(如每分钟一次)

    c. 初始化单独事件,如报警钟

    下面是我们要用的时间检测器和修改后的路由关系:

    DEF ticker TimeSensor {

    cleInterval 0.1

    loop TRUE

    enabled FALSE

    }

    ROUTE TouchS.isOver TO ticker.set_enabled

    ROUTE ticker.cycleTime TO revolver.startRevolving

    ROUTE revolver.revolve TO cube.set_rotation

    enabled用于启用和停用时间检测器,开始时它处于停用状态,以后由接触检测器的isOver事件修改这一状态。启用的时间检测器每隔0.1秒送出一个cycleTime事件,并用它来触发revolver的startRevolving事件,注意,cycleTime事件的类型为SFTime,而路由两端事件的类型必须匹配,所以尽管这里我们不关心这个事件表示的具体时刻,还是把revolver的startRevolving事件类型也改为SFTime.这样,revolver的函数startRevolving()就会每0.1秒调用一次,从而驱动方块连续旋转。完整的代码是:

    #VRML V2.0 utf8

    DEF cube Transform {

    rotation 1 1 1 0

    children [

    Shape {

    appearance Appearance {

    material Material { diffuseColor 1 0 0 }

    }

    geoemtry Box {}

   
    }

    DEF TouchS TouchSensor {}

    ]

    }

    DEF revolver Script {

    eventIn SFTime startRevolving

    eventOut SFRotation revolve

    field SFFloat angle 0

    url "vrmlscript :

    function startRevolving () {

    revolve[0]=1;

    revolve[1]=1;

    revolve[2]=1;

    revolve[3]=angle;

    angle+=0.1;

    }"

    }

    DEF ticker TimeSensor {

    cycleInterval 0.1

    loop TRUE

    enabled FALSE

    }

    ROUTE TouchS.isOver TO ticker.set_enabled

    ROUTE ticker.cycleTime TO revolver.startRevolving

    ROUTE revolver.revolve TO cube.set_rotation

    上述脚本节点的功能比较简单,只是不断送出调整的旋转值,它是关键帧动画的一种。由于关键帧动画十分常用,故VRML专门定义了插补器节点来实现它。

    3、朝向插补器

    插补器节点可认为是VRML内置的脚本节点,它们执行简单的动态计算,通常和时间检测器或者能够使对象产生动作的节点结合在一起使用,生成线性关键帧动画。插补器节点实际上是一个由关键点和对应关键值定义的分段线形函数。根据插值类型的不同,VRML共定义六个插补器节点:ColorInterpolator(颜色插补器)、CoordinateInterpolator(坐标插补器)、NormalInterpolator(法线插补器)、OrientationInterpolator(朝向插补器)、positionInterpolator(位置插补器)、ScalarInterpolator(标量插补器)。

    所有插补器的域和事件都是类似的:

    eventIn SFFloat set_fruction

    exposedField MFFloat key [...]

    exposedField MF keyValue [.....]

    eventOut [S|M]F value_changed

    关键值域keyValue的类型决定了插补器的类型(例如,OrientationInterpolator的keyValue域的类型是MFFloat).入事件set_fraction接收SFFloat型的事件,插补器随即根据它进行插值,并通过出事件value_changed送出插值结果。

    这里我们把时间检测器的fraction_changed事件作为插补器的输入,这个事件是一个[0,1]区间的值,每个时间步都送出一次,表示当前周期内已过去的时间相对于整个周期的比例,是插补器常用的输入源之一。与此对应,我们把插补器关键帧的取值也定义在[0,1]范围内。与0和1这两个关键帧对应的关键值的旋转轴是相同的,只是旋转角度不同(0,3.14159),这样方位插补器输出的旋转值的旋转轴固定不变,旋转角从0递增到3.14159,然后不断重复。

    #VRML V2.0 utf8

    DEF cube Transform {

    rotation 1 1 1 0

    children [

    Shape {
   
    appearance Appearance {

    material Material { diffuseColor 1 0 0 }

    }

    geometry Box {}

    }

    DEF TouchS TouchSensor {}

    ]

    }

    DEF revolver OrientationInterpolator {

    key [0,1]

    keyValue [ 0.5 0.5 0.5 0,0.5 0.5 0.5 3.14149]

    }

    DEF ticker TimeSensor {

    cycleInterval 2

    loop TRUE

    enabled FALSE

    }

    ROUTE TouchS.isOver TO ticker.set_enabled

    ROUTE ticker.fraction_changed TO revolver.set_fraction

    ROUTE revolver.value_changed TO cube.set_rotation

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

标签:VRML
上一篇:三维网页VRML入门教程第三节:邻近检测器
下一篇:三维网页VRML入门教程第五节:动态修改场景图
网友评论:三维网页VRML入门教程第四节:连续动画
评论
留名: 验证码:
您可能还需要关注一下内容:
·基于VRML与Java3D的交互式虚拟物流仿真系统
·VRML2.0教程7:不规则几何节点
·VRML2.0教程6:简单几何节点
·VRML2.0教程5:变换节点
·基于VRML—JAVA的机器人运动仿真研究
·基于VRML的虚拟园林设计要素构建
·基于VRML的虚拟综合布线系统
·VRML2.0教程4:观察场景
·VRML2.0教程3:组织场景中的对象
·VRML2.0教程2:内联节点使用外部资源
☏ 推荐产品

Ladybug5全景
商家:力方国际

ProJet®
商家:力方国际

ProJet®
商家:视科创新

Premium1.5
商家:视科创新

巴可HDX主动立体投
商家:德浩科视

巴可HDF-W26投
商家:德浩科视

巴可30000流明2
商家:德浩科视

巴可4万流明2K投影
商家:德浩科视
☞ 外设导航
☏ 企业名录
【广州】中科院广州电子技术有限公司
【北京】第二空间(北京)科技有限公司
【北京】幻维世界(北京)网络科技有限公司
【厦门】厦门惠拓动漫科技有限公司
【厦门】厦门幻眼信息科技有限公司
【深圳】深圳南方百捷文化传播有限公司
【北京】北京思源科安信息技术有限公司
【上海】上海殊未信息科技有限公司
【北京】北京赢康科技开发有限公司
【武汉】武汉科码软件有限公司
友情链接 关于本站 咨询策划 行业推广 广告服务 免责声明 网站建设 联系我们 融资计划
北京第三维度科技有限公司 版权所有 京ICP备09001338
2008-2016 Beijing The third dimension Inc. All Rights Reserved.
Tel:010-57255801 Mob:13371637112(24小时)
Email:d3dweb@163.com  QQ:496466882
扫一扫 第三维度
官方微信号