Javascript 使用SceneJS重用JSON对象节点

Javascript 使用SceneJS重用JSON对象节点,javascript,json,webgl,scenejs,Javascript,Json,Webgl,Scenejs,我已经使用scenejs框架创建了一个webgl动画。由于它将包含许多相同的元素,因此我希望尽量减少使用的代码量,并尽可能地重用这些元素 首先,我将diskJSON定义如下: var diskJSON = [{ type: "disk", radius: 3, inner_radius: 2}]; 当我使用sceneJS运行下面的代码时,它工作得很好 { type: "material", emit: 0, baseColor: {

我已经使用scenejs框架创建了一个webgl动画。由于它将包含许多相同的元素,因此我希望尽量减少使用的代码量,并尽可能地重用这些元素

首先,我将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功能的预期一致

嘿,Niklas,您在SceneJS解析JSON的方式中发现了一个bug-SceneJS在DFS遍历节点对象时将节点对象标记为在映射中访问过的对象。因此,在本例中,它在解析“磁盘”节点时将其标记一次,然后再也不会解析它

在这里提出了一个问题:

优先解决这个问题

同时,您可以使用工厂功能:

函数newDiskJSON(){ 返回[{ 键入:“磁盘”, 半径:3, 内半径:2}]; };

或者使用“实例”节点:

干杯,
LK

谢谢你的及时回答,很高兴听到不仅仅是我疯了:)
//...

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

    // ...