两个单独wrl文件的事件互操作

这篇博客介绍了如何在两个独立的 VRML 文件之间实现事件交互,分别展示了 KfaPositionInterpolator 和 KfaAnimation 两个PROTO定义,用于位置插值和动画控制。通过事件路由,当触碰事件发生时,动画的播放将受到影响,从而实现不同VRML场景间的互动。
摘要由CSDN通过智能技术生成
    在VRML中,将不同物体放置在不同的wrl文件中的最大好处是,使VRML场景的层次结构更加清晰,代码可读性强,维护修改容易。
    通常,我们可以将一个场景里的不同物体写在不同的wrl文件中,最后在主场景wrl文件里将各个物体通过“Inline”节点导入,形成一个完整场景。
    这种方式对于用户交互和动画比较少并且形式单纯的方式比较合适,但是在一些复杂情况下,用“Inline”节点是无法实现的。其原因在于“Inline”节点没有用于交互的输入输出事件。

    举一个最简单的例子。场景中有两个物体A和B,A具有插值动画,可以旋转,B具有一个touchSensor(触摸感应器)。
    现在要求实现:
    1.A物体的绘制和动画代码写在a.wrl文件中,B物体的绘制和触发器代码写在b.wrl文件中(这样做的目的是为了实现前面描述的好处。)
    2.鼠标点击物体B后,触发A物体的动画。

    显然,使用“Inline”节点是无法同时满足上面两个条件的。

    但是两个条件在VRML中并非无法满足。
    这个时候,我们需要使用PROTO节点和EXTERNPROTO进行原型声明和外部引用。下面对代码编写进行详细说明。

    首先,将a.wrl和b.wrl的完整代码贴上来:

a.wrl:
  1. #VRML V2.0 utf8

  2. #Cosmo Worlds V2.0

  3. PROTO KfaPositionInterpolator [
  4.         eventIn      SFFloat    set_fraction
  5.         eventOut     SFVec3f    value_changed
  6.         exposedField MFFloat    key 0
  7.         exposedField MFInt32    keyTypes    2
  8.         exposedField MFVec3f    keyValue    0 0 0
  9.         field        MFFloat    authorKey   0
  10.         field        MFVec3f    authorKeyValue  0 0 0
  11.       ]
  12. {
  13.   PositionInterpolator {
  14.     key IS key
  15.     set_fraction IS set_fraction
  16.     keyValue IS keyValue
  17.     value_changed IS value_changed
  18.   }
  19. }
  20. PROTO KfaAnimation [
  21.         field        SFFloat    framesPerSecond 10
  22.         field        SFFloat    zoom    1
  23.         field        SFBool snap    TRUE
  24.         field        SFBool viewInFrames    TRUE
  25.         field        SFBool showEmptyFieldLines FALSE
  26.         field        SFFloat    playRangeStart  0
  27.         field        SFFloat    playRangeEnd    1
  28.         field        SFBool usePlayRange    TRUE
  29.         field        SFNode timeSensor  NULL
  30.         field        MFNode fieldInterps    []
  31.         field        MFNode actors  []
  32.       ]
  33. {
  34.   Group {
  35.   }
  36. }


  1. PROTO AnimationInA [
  2.     eventIn SFTime TouchTime  
  3. ]
  4. {
  5. DEF _0 Transform {
  6.   children  [
  7.     Shape {
  8.       appearance    Appearance {
  9.     material    Material {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值