22

次のコードで OBJ モデルをインポートしました。

var loader = new THREE.OBJLoader();
loader.addEventListener('load', function (geometry) {
    object = geometry.content;
    scene.add(object);
});
loader.load('ship.obj');

正常に動作しますが、マテリアルを追加しようとすると、効果がないか、モデルが消えます。私は次のようにできると思いました:

var ship = new THREE.Mesh(object, material);

しかし、それはうまくいきません。誰かがこれを行う方法を知っていますか、それが可能な場合でも? OBJMTLLoader も使用してみましたが、マテリアルを変更することはできませんが、複雑さが増します。

4

3 に答える 3

25

編集:この回答は古くなっています。代わりに、@mightypile による回答を参照してください。


を適切に定義したと仮定してmaterial、これを試してください:

loader.addEventListener( 'load', function ( event ) {

    var object = event.content;

    object.traverse( function ( child ) {

        if ( child instanceof THREE.Mesh ) {

            child.material = material;

        }

    } );

    scene.add( object );

});
于 2013-04-24T19:48:56.763 に答える
6

@WestLangleyの回答を使用して、エラーが発生し続けました

loader.addEventListener is not a function

私のページは読み込まれませんでした。discourse.threejs.orgのAtul_Mourya によると、読み込み中にコールバック内に関数を実装する方が良い (または最新の?) アイデアです。私は彼のアドバイスをドキュメントと@WestLangleyの便利な機能と組み合わせて、この同じ質問に答えて、次のように考えました。

var ship_material = new THREE.MeshBasicMaterial( { color: 0x444444 } );
var loader = new THREE.OBJLoader();
loader.load( 'ship.obj',
    function( obj ){
        obj.traverse( function( child ) {
            if ( child instanceof THREE.Mesh ) {
                child.material = ship_material;
            }
        } );
        scene.add( obj );
    },
    function( xhr ){
        console.log( (xhr.loaded / xhr.total * 100) + "% loaded")
    },
    function( err ){
        console.error( "Error loading 'ship.obj'")
    }
);

この例は、進行状況とエラーのコールバックも実装しており、私にとってはうまくいきました。

于 2019-03-22T21:28:15.577 に答える