2012-08-17 10 views
5

に、私はこのような複数のオブジェクト(簡略化した例)をロードするためにJSONLoaderへの複数の呼び出しを持っている場合:THREE.jsでTHREE.js JSONLoaderコールバック

function init() {  
    var loader = new THREE.JSONLoader();  
    loader.load("mesh1.js", createScene);  
    loader.load("mesh2.js", createScene); 
}  

function createScene(geometry) {  
    if (geometry.filename == "mesh1.js") {  
    mesh1 = new THREE.Mesh(geometry, material); 
    scene.add(mesh1);  
    } else if (geometry.filename == "mesh2.js") {  
    mesh2 = new THREE.Mesh(geometry, material); 
    scene.add(mesh2); 
    } 
} 

どのように私は、メッシュは、コールバックに戻ってきたかを決定することができます特に頻繁に不通に到着したときは?

私は、1つの汎用コールバック関数で複数の返されたメッシュを処理しようとしています。返されたジオメトリに、テストできる元のファイル名を示すプロパティがありますか?

もっとエレガントな方法がありますか?各コールの新しいTHREE.JSONLoaderオブジェクトを作成すると、コールバック関数がどのメッシュが到着したかを判断するのに役立ちますか?

私はどんなヘルプ/アイデアにも感謝します!ありがとう!

答えて

7

よくWestLangleyが提案するより一般的な方法があります。その後、

loader.load("mesh1.js", meshloader("mesh1.js")); 
loader.load("mesh2.js", meshloader("mesh2.js")); 

function meshloader(fileName){ 
    return function(geometry){ 
     ... 
    } 
} 

この方法では、各ロードされたファイルに識別子を追加することができます。

+0

素晴らしい...私はこれを得ることができた。関数内で関数を返すことは決して考えられませんでした。私は本当にここで何が起こっているのか本当に興味があります...どうすればこのことがうまくいくのかを説明してください。 – Dev

+4

@Devこれは[クロージャ](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures)と呼ばれるものです。 'meshloader(" mesh1.js ")'が引数として渡されるとき、それは直接(括弧の存在のために)実行されます。実行されると、別の関数を返します。つまり、無名関数 'function(geometry){...}'を引数として渡したのとまったく同じですが、この無名関数が変数 'fileName'が定義されているコンテキストでコールバックとして実行され、値 '' mesh1.js ''となります。 – Pioul

0

どのようにこのような何か?あなたがそれを好む場合

loader.load("mesh1.js", function(geometry) { createScene(geometry, 1) }); 
loader.load("mesh2.js", function(geometry) { createScene(geometry, 2) }); 

その後、

function createScene(geometry, id) { 
... 
} 

idは、メッシュの名前にすることができます。

+0

ああ、私はこのパスを行ってきました。 "1"や "2"のような定数で動作しますが、 "1"と "2"を変数に置き換えると、 "x"と言うと、変数はコールバックが返った後にのみ*評価されます。私はloader.loadが呼び出される前に決められた値でcreateSceneに変数を渡す方法を見つけることができません...意味がありますか?スコープの問題?一時的な問題? – Dev

+0

これはあなたの質問に対する答えです。あなたは今、別の質問をしています。おそらくあなたは新しい問題を投稿することができます。 – WestLangley