次のコードで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も使用してみましたが、素材を変更することはできませんが、複雑さが増すだけです。
編集:この回答は現在古くなっています。代わりに、@ 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 );
});
@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'")
}
);
この例では、進行状況とエラーのコールバックも実装されており、私にとってはうまくいきました。