首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SceneJS中重用JSON对象节点

在SceneJS中重用JSON对象节点
EN

Stack Overflow用户
提问于 2011-05-29 03:48:03
回答 1查看 433关注 0票数 0

我已经使用scenejs框架创建了一个webgl动画。因为它将包含许多相同的元素,所以我希望最小化使用的代码量,并尽可能多地重用这些元素。

首先,我将diskJSON定义如下:

代码语言:javascript
复制
var diskJSON = [{
type: "disk",
radius: 3,
inner_radius: 2}];

当我使用sceneJS运行以下代码时,它工作得很好。

代码语言:javascript
复制
{
    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个:

代码语言:javascript
复制
{
    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功能方面的预期工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-29 05:42:34

嘿,SceneJS,你在SceneJS解析JSON的方式中发现了一个bug --当DFS遍历节点对象时,它会在映射中将节点对象标记为已访问。因此,在这种情况下,它在解析“磁盘”节点时标记它一次,然后再也不解析它。

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

优先处理这个问题。

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

代码语言:javascript
复制
 function newDiskJSON() {        return [{           type: "disk",           radius: 3,           inner\_radius: 2}];     };
代码语言:javascript
复制
//...

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

    // ...

或者使用"instance“节点:

http://scenejs.wikispaces.com/instance

干杯,LK

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6163982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档