0

我使用 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 功能方面按预期工作?

4

1 回答 1

1

嘿 Niklas,您在 SceneJS 解析 JSON 的方式中发现了一个错误 - SceneJS 在 DFS 遍历它们时将节点对象标记为在地图中访问。所以在这种情况下,它会在解析它时标记你的“磁盘”节点一次,然后再也不解析它。

在这里提出了一个问题:https ://github.com/xeolabs/scenejs/issues/99

优先解决这个问题。

同时,您可以使用工厂函数:

function newDiskJSON() { return [{ type: "disk", radius: 3, inner_radius: 2}]; };

//...

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

    // ...

或者使用“实例”节点:

http://scenejs.wikispaces.com/instance

干杯,LK

于 2011-05-28T21:42:34.083 回答