2011-05-28 50 views
0

我使用scenejs框架创建了一个webgl动画。由于它包含许多相同的元素,因此我希望尽量减少所用代码的数量并重新使用这些元素。通过SceneJS重用JSON对象节点

首先,我得diskJSON定义如下:

var diskJSON = [{ 
type: "disk", 
radius: 3, 
inner_radius: 2}]; 

当我运行sceneJS下面的代码,它工作正常。

{ 
    type: "material", 

    emit:   0, 
    baseColor:  { 
     r: 0.3, 
     g: 0.3, 
     b: 0.9 
    }, 
    specularColor: { 
     r: 0.9, 
     g: 0.9, 
     b: 0.9 
    }, 
    specular:  0.9, 
    shine:   100.0, 




    nodes: [ { 
     type: "translate", 
     x:10, 
     y:1, 
     nodes: [ 
     { 
      type: "translate", 
      z:speedMultiplier*0.8, 
      nodes:[{ 
       type: "disk", 
       radius: 3, 
       inner_radius: 2 
      }] 
     }, 
     { 
      type: "translate", 
      z:speedMultiplier*9.8, 
      nodes:[{ 
       type: "disk", 
       radius: 3, 
       inner_radius: 2 
      }] 
     }, 
     { 
      type: "translate", 
      z:speedMultiplier*11.64, 
      nodes:[{ 
       type: "disk", 
       radius: 3, 
       inner_radius: 2 
      }] 
     }, 
     { 
      type: "translate", 
      z:speedMultiplier*13.32, 
      nodes:[{ 
       type: "disk", 
       radius: 3, 
       inner_radius: 2 
      }] 
     } 

     ] 
    } 
    ] 




} 

然而,当我试图重复使用相同的diskJSON如先前定义的,它仅创建一个节点,而不是4:

{ 
    type: "material", 

    emit:   0, 
    baseColor:  { 
     r: 0.3, 
     g: 0.3, 
     b: 0.9 
    }, 
    specularColor: { 
     r: 0.9, 
     g: 0.9, 
     b: 0.9 
    }, 
    specular:  0.9, 
    shine:   100.0, 




    nodes: [ { 
     type: "translate", 
     x:10, 
     y:1, 
     nodes: [ 
      { 
      type: "translate", 
      z:speedMultiplier*0.8, 
      nodes:diskJSON 
     }, 
     { 
      type: "translate", 
      z:speedMultiplier*9.8, 
      nodes:diskJSON 
     }, 
      { 
      type: "translate", 
      z:speedMultiplier*11.64, 
      nodes:diskJSON 
     }, 
     { 
      type: "translate", 
      z:speedMultiplier*13.32, 
      nodes:diskJSON 
     } 

     ] 
    } 
    ] 




} 

应用程序将有数以千计的节点,所以不必每一次重新定义它似乎都是一种浪费。这是scenejs的问题还是这是按照Javascript/JSON功能的预期工作?

回答

1

嘿Niklas,你已经发现了SceneJS解析JSON的方式中的一个bug - SceneJS将节点对象标记为在DFS遍历它们时映射到的映射中。所以在这种情况下,它会在解析它时标记一次“磁盘”节点,然后再解析它。

这里引发一个问题:https://github.com/xeolabs/scenejs/issues/99

修复这一项优先。

在此期间,可以使用一个工厂函数:

功能newDiskJSON(){ 返回[{ 类型: “盘”, 半径:3, inner_radius:2}]; };

//... 

nodes: [ 
    { 
     type: "translate", 
     z:speedMultiplier*0.8, 
     nodes: newDiskJSON() 

    // ... 

也可以使用 “实例” 节点:

http://scenejs.wikispaces.com/instance

欢呼声, LK

+0

感谢您的提示答案,很高兴听到这不只是我快要疯了两种: ) – Niklas 2011-05-28 21:50:39