2016-04-06 4 views
0

私はオブジェクトを読み込んだ後にオブジェクトが破壊されないようにしようとしています。私は関数を使用した後にオブジェクトが破壊されるのを防ぐ方法を教えてください:.load()in javascript(three.js)

var loader = new THREE.ColladaLoader(); 
var rescue; 
loader.load(
    'Improved_Person_Maker_better_quality.dae', 
    function(collada) { 
     scene.add(collada.scene); 
     collada.scene.position.set(-25, 1, 25); 
     collada.scene.rotation.x = -Math.PI/2; 
     rescue = collada.scene; 
    }, 
    function(xhr) { 
     console.log((xhr.loaded/xhr.total * 100) + '% loaded'); 
    } 
); 

rescue.position.set(-20, 1, 25); 

ロードされたメッシュがもう存在しないため、最後のステートメントは使用できません。 collada.sceneを救う方法はありますか?

答えて

0

私は、非同期ローディングで正しいヒントを与えるために、StallionWestlangleyに本当に感謝します。

私は解答hereを見つけましたが、私もそれを再現します。

解決方法は、通常のTHREE.Object3d()オブジェクトを作成することです。すべてのオブジェクトを別のオブジェクトの子として追加することは可能です。だから私は次のようにした:

loadObject: function(){ 
    var loader = new THREE.ColladaLoader(); 
    var container = new THREE.Object3D(); 
    loader.load(
'Improved_Person_Maker_better_quality.dae', 
function (collada) { 
    container.add(collada.scene); 
}, 
function (xhr) { 
    console.log((xhr.loaded/xhr.total * 100) + '% loaded'); 

}); 
    return container; 
} 

私は新しい機能を作成しました。

0

ローダーは非同期です。

つまり、rescueがローダーコールバックで定義される前に、rescue.position.set()が呼び出されています。

あなたが行ったコールバックの位置を設定するだけです。

あなたのコードの後半rescueを参照する必要がある場合、あなたはこのパターン

if (rescue !== undefined) { 
    // your code 
} 

three.jsを使用することができますr.75

+0

解決方法も試しましたが、レスキューは常に定義されていないため、オブジェクトに新しい位置を設定することはできません。 – user2982195

+0

常に定義されていませんか?コールバックで設定します。あなたは、問題とは無関係にコード内にスコープの問題があります。 – WestLangley

+0

私はrescue = collada.sceneを宣言した後は常に定義されていません – user2982195

0

あなたはこれを試すことができます。

var rescue; 
var manager = new THREE.LoadingManager(); 
manager.onProgress = function(item, loaded, total) { 
    console.log(item, loaded, total); 
}; 
manager.onLoad = function(){ 
     rescue.position.set(-20, 1, 25); 
}; 
var loader = new THREE.ColladaLoader(manager); 
loader.options.convertUpAxis = true; 

loader.load("<url path for the file>", function(collada) { 
     scene.add(collada.scene); 
     collada.scene.position.set(-25, 1, 25); 
     collada.scene.rotation.x = -Math.PI/2; 
     rescue = collada.scene; 
    }, function(xhr) { 
     console.log((xhr.loaded/xhr.total * 100) + '% loaded'); 
}); 
} 

ロードをマネージャは、後で複数のファイルを持つことができるように、非同期管理ロードの柔軟性を提供します。

+0

あなたの解決策を試しましたが、オブジェクトが動いていません。 レスキューはまだ定義されていません。 – user2982195