5

THREE.js でループを使用して複数の車のモデルを読み込んでいますが、問題は、すべてのオブジェクトをロードする場合と、すべてのオブジェクトをロードしない場合があることです。たとえば、ループの反復が 3 回の場合、2 つのオブジェクトをロードするときもあれば、1 つをロードするときもあれば、3 つのオブジェクトすべてをロードするときもあります。どうしてか分かりません?私はたくさん検索しましたが、有用なものが見つかりません。これがコードです。

for (var k = 1; k <= myWorld.noOfEnemies(); k++) {

                myWorld.setWorldEnemyCar(k);

                loader2.load('obj/us/us_police_car.dae', function colladaReady(collada) {
                    object3 = collada.scene;

                    object3.scale.x = object3.scale.y = object3.scale.z = 2;
                    object3.updateMatrix();
                    object3.position.x = myWorld.enemyCar.position.x;
                    object3.position.y = myWorld.enemyCar.position.y;
                    object3.position.z = myWorld.enemyCar.position.z;

                    object3.rotation.x = -(Math.PI / 2);

                    object3.rotation.z = (Math.PI / 2);
                    enemyModels.push(object3);
                    //localObject.rotation.z = -(Math.PI / 2);
                    //collidableMeshList3 = localObject;
                    //console.log(collidableMeshList3);

                    // init();

                    // animate();

                });

            }

init()この後、私が持っているもう1つのローダーがanimate()機能します

loader2.load('obj/us/us_police_car.dae', function colladaReady(collada) {
                localObject = collada.scene;

                localObject.scale.x = localObject.scale.y = localObject.scale.z = 2;
                localObject.updateMatrix();
                localObject.position.x = 0;
                localObject.position.y = 0;
                localObject.position.z = 0;

                localObject.rotation.x = -(Math.PI / 2);

                localObject.rotation.z = (Math.PI / 2);

                //localObject.rotation.z = -(Math.PI / 2);
                //collidableMeshList3 = localObject;
                //console.log(collidableMeshList3);
                //scene.add(localObject);

                init();

                animate();

            });

これは問題なく動作しますが、上記の問題が何であるかを理解できません。

4

5 に答える 5

2

collada ローダーの同じインスタンスを再利用して複数の collada ファイルをロードすると、既知の問題があるようです。

次のコードは、私にとって確実に機能します(少なくともchromeとfirefoxでは):

scene = new THREE.Scene();

// setup lighting etc.

load('/path/someColladaModel.dae');
load("/path/someOtherColladaModel.dae");
load("/path/yetAnotherColladaModel.dae");

function load(daeLocation){
    var manager = new THREE.LoadingManager();
    manager.onProgress = function(item, loaded, total) {
        console.log(item, loaded, total);
    };

    var loader = new THREE.ColladaLoader(manager);
    loader.options.convertUpAxis = true;

    loader.load(daeLocation, function(collada) {
            dae = collada.scene;
            dae.position.set(0, 0, 0); 
            scene.add(dae);
            render();
        }, function(progress) {
            // show some progress
    });
}

モデルをロードするたびに、新しいローダーをインスタンス化していることに注意してください。

于 2015-02-27T10:52:12.060 に答える
0

私は、この問題が 3js collada ローダーのバグであると判断しました。この問題はないと思われる新しいローダーがありますが、まだリリースされていません (2015 年 12 月)。開発ツリーで入手できます。https://github.com/mrdoob/three.js/issues/7388を参照してください

于 2015-12-22T11:34:56.190 に答える
0

私も同じ問題を抱えていました。現在の Collada ローダーは、複数のファイルのロードを処理できないようです。すべてのオブジェクトを単一のファイルに入れることで解決し、読み込みが完了したら、個々のオブジェクトを見つけて個別に使用します。これが役に立ち、これがあなたの場合のオプションであることを願っています。

于 2013-05-15T05:02:10.013 に答える
0

同じモデルを複数回ロードする場合、それぞれのモデルに対してローダーを呼び出す必要はありません。メッシュのクローンを作成できます:

    // queen is a mesh
    var newQueen = queen.clone();
    // make sure to re position to be able to see the new queen!
    newQueen.position.set(100,100,100); // or any other coordinates
于 2014-07-03T07:07:36.490 に答える