私は 3D プログラミングの完全な初心者で、three.js を使って 1 週間以上経ちました。複数の collada ファイルと obj ファイルを読み込むことができ、パースペクティブ、トラックボール、すべてが例から機能するようになりました。しかし、今私は立ち往生しており、助けが必要です。参考までに、私が投稿しているファイルを次の URL で見ることができます。
http://shaman-labz.appspot.com/webgl_loader_obj_mtl.html
このページは基本的に例からそのままですが、これらすべてのオブジェクトをメッシュとして持つ obj ファイルを読み込んでいます。私が今取り組んでいるのは、obj をロードした後です。オブジェクト内のすべてのジオメトリを反復処理して抽出し、必要なときに一度シーンにドロップできるようにするか、泡とか。私はおそらくフレネルの例を使用しようと考えていましたが、これは私の理解の境界にぶつかっているところであり、いくつかの用語は私を逃れています.
私の質問は、これが実行されると、ロード後に戻ってシーンに追加されるオブジェクトには、これらすべての宝石が一緒に含まれているということです。
したがって、次の行の代わりに:
var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
object.position.y = - 100;
scene.add( object );
});
loader.load( 'obj/gems/24.obj', 'obj/gems/24.mtl' );
だから私がやっているのは、オブジェクトが戻ってきたときです。デバッグ/ブレークモードで内部を見て、それが object3D であり、object.children が 25 メッシュの配列であることがわかります...そしてそれらのメッシュのそれぞれは個別に作業したい私の「宝石」の 1 つです。
ここで迷子になります...「メッシュ」を取得するとき、下にあるジオメトリを取り除き、新しいメッシュを作成する必要がありますか?
このページでは、私が達成しようとしたことを確認できます。
http://shaman-labz.appspot.com/webgl_loader_obj_mtl2.html
唯一の大きな違いは、コードの次のセクションにあります。
var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
var pos=0;
for(var i=0; i< object.children.length; i++){
var m = object.children[i];
var gem = new THREE.Object3D();
gem.name=m.name;
gem.add(m);
gem.position.x = -10;
gem.position.y = -10;
gem.position.z = pos;
scene.add( gem );
pos = pos - 10;
}
});
loader.load( 'obj/gems/24.obj', 'obj/gems/24.mtl' );
コレクションから 25 個の宝石のうち 13 個しか表示されないことに注意してください。また、それらがどのように散らばっているかにも注意してください。これは、位置を適切に設定することができない高次の関係に何らかの形でリンクしていることを示しています (各メッシュがロードされた元のオブジェクトの元の位置に対して何らかのオフセットがあります...これはワールドマトリックスと関係があると思いますか?