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 つのノードではなく、1 つのノードしか作成されません。

{
    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

ニクラスさん、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 に答える