2

ロード後にdaeモデルのクローンを作成しようとしています。私はいくつかの解決策を試しましたが、私の問題は、モデルのグループ内にグループがあることだと思います。すべてのアセットを含むメインの親グループがあります。ここにはジオメトリがありません。その子は、ジオメトリを持つ 1 つの球体と、さらに 4 つの親グループ (それぞれにジオメトリはありません) です。各グループには 3 つのジオメトリがあります: 2 つのコーンと円柱です。

私は以下のコードを使用していますが、リンクでできるように: http://caostar.com/3d/PABLOwebgl_loader_collada2.html 複製されたオブジェクトは位置と変換を保持しません。メッシュを新しいオブジェクトに追加すると、あたかもすべてが同じマトリックスを持っているかのように、それらがすべてまとめられます。スクロールしてズームし、カメラを奇妙なオブジェクトの内側に向けると、球体と円錐が変形した円柱の内側にあることがわかります。

100個の変形3Dオブジェクトではなく、100個のクローンを使用して、目的の効果を達成する方法について何か考えはありますか?

これは私が使用しているコードで、グループ全体をループしてメッシュを取得しています。

var dae;
        var loader = new THREE.ColladaLoader();
        loader.options.convertUpAxis = true;
        loader.load( './models/collada/caostar/estrela4.dae', function ( collada ) {

            dae = collada.scene;
            dae.scale.set(16,16,16);

            var piece = collada.scene.children[0];

            for (var i = 0; i < 100; i++) {
                var newPiece = new THREE.Object3D();

                //looping through the groups. If a group has children, loop again
                for (var j = 0; j < piece.children.length; j++) {
                    if(piece.children[j].children.length > 0){
                        for (var j2 = 0; j2 < piece.children[j].children.length; j2++) {
                            var newMesh = new THREE.Mesh(piece.children[j].children[j2].geometry, piece.children[j].children[j2].material);
                            //this applyMatrix doesnt do anything :/
                            if( piece.children[j].children[j2].geometry.matrix )newMesh.geometry.applyMatrix( piece.children[j].children[j2].geometry.matrix );
                            newPiece.add(newMesh);
                        }
                    }else{
                        var newMesh = new THREE.Mesh(piece.children[j].geometry, piece.children[j].material);
                        //this applyMatrix doesnt do anything :/
                        if(piece.children[j].geometry.matrix)newMesh.geometry.applyMatrix( piece.children[j].geometry.matrix );

                        newPiece.add(newMesh);
                    }
                }

                newPiece.position.set(Math.random()*10-5,Math.random()*10-5,Math.random()*10-5);
                //newPiece.scale.set(sizes,sizes,sizes);
                newPiece.updateMatrix();
                scene.add( newPiece );

            }


        } );

///////アップデート

わかりました、特定の問題の解決策を見つけましたが、あらゆる種類のサブグループでコラーダを適切に複製する方法がわかりませんでした。

これが私のコードです。それが誰かを助けることを願っています。

    var dae;
    var loader = new THREE.ColladaLoader();
    loader.options.convertUpAxis = true;
    loader.load( './models/collada/caostar/estrela4.dae', function ( collada ) {

        dae = collada.scene;
        dae.scale.set(16,16,16);
            var piece = collada.scene.children[0];
            //
            //I will keep the parent names to avoid meshe being added twice
            var parentsNames = [];
            for (var i = 0; i < 100; i++) {
                var newPiece = new THREE.Object3D();
                piece.traverse( function ( child ) {

                    //check if child has children but exclude the main group. This is custom part and must be addpted for each DAE to be clonned
                    if(child.children.length > 0 && child.children.length < 5){

                        //create the group
                        var newPieceChildren = new THREE.Object3D();
                        //
                        parentsNames.push(child.name);
                        //
                        child.traverse( function ( child ) {
                            var newMesh = new THREE.Mesh(child.geometry, child.material);
                            //this will apply all transformations to the piece
                            newMesh.applyMatrix( child.matrix)
                            newPieceChildren.add(newMesh);

                        });
                        //this will apply all transformations to the group
                        newPieceChildren.applyMatrix( child.matrix);
                        newPiece.add(newPieceChildren);

                    //se if it is an isolated child with no children and if it has not been included in the subgroups
                    }else if(child.children.length == 0 && parentsNames.indexOf(child.parent.name) == -1){
                        var newMesh = new THREE.Mesh(child.geometry, child.material);
                        //this will apply all transformations to the piece
                        newMesh.applyMatrix( child.matrix)
                        newPiece.add(newMesh);
                    }

                } );
                //
                scene.add(newPiece);
            }

            });
4

0 に答える 0