Повторное использование узлов объектов JSON с SceneJS - PullRequest
0 голосов
/ 28 мая 2011

Я создал анимацию webgl с использованием фреймворка scenejs. Поскольку он будет содержать много идентичных элементов, я хочу минимизировать объем используемого кода и максимально использовать элементы повторно.

Во-первых, у меня 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 Ответ

1 голос
/ 29 мая 2011

Привет, Никлас, ты нашел ошибку в том, как SceneJS анализирует JSON - SceneJS отмечает объекты узлов как посещенные на карте, пока DFS их обходит.Так что в этом случае он помечает ваш «дисковый» узел один раз, когда он анализирует его, а затем никогда не анализирует его.

Здесь возникла проблема: https://github.com/xeolabs/scenejs/issues/99

Исправление этой проблемы в качестве приоритета.

Тем временем вы можете использовать заводскую функцию:

functionnewDiskJSON () {return [{тип: "диск", радиус: 3, inner_radius: 2}];};

//...

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

    // ...

Или используйте узел «instance»:

http://scenejs.wikispaces.com/instance

cheers, LK

...