2011-05-28 61 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