8

モデルのサイズと位置を決定し、モデルが原点に配置され、カメラのビュー内に配置されるように、モデルを自動的に中央に配置してスケーリングする方法はありますか? Sketchup から Collada モデルをインポートすると、Sketchup の原点でモデルが中央に配置されていない場合、three.js でモデルが中央に配置されないことがわかりました。それは理にかなっていますが、インポート後にオリジンに自動センタリングするとよいでしょう。

インポートされたモデルの境界を取得することについて、さまざまなファイルローダーでいくつかの議論を見てきましたが、それを行う方法についての参照を見つけることができませんでした.

スケーリングの問題はそれほど重要ではありませんが、境界関数に関連しているように感じます。そのため、私もそれを尋ねました。

編集:

少し遊んで、さらにいくつかのGoogle検索を行った後の詳細情報...

collada ファイルをロードする際のコールバック関数のコードは、次のようになります。

loader.load(mURL, function colladaReady( collada ) {

dae = collada.scene;
skin = collada.skins[ 0 ];

dae.scale.x = dae.scale.y = dae.scale.z = 1;
dae.updateMatrix();

//set arbitrary min and max for comparison              
var minX = 100000;
var minY = 100000;
var minZ = 100000;
var maxX = 0;
var maxY = 0;
var maxZ = 0;

var geometries = collada.dae.geometries;               
for(var propName in geometries){
if(geometries.hasOwnProperty(propName) && geometries[propName].mesh){
    dae.geometry = geometries[propName].mesh.geometry3js;
    dae.geometry.computeBoundingBox();
    bBox = dae.geometry.boundingBox;
    if(bBox.min.x < minX) minX = bBox.min.x;
    if(bBox.min.y < minY) minY = bBox.min.x;
    if(bBox.min.z < minZ) minZ = bBox.min.z;
    if(bBox.max.x > maxX) maxX = bBox.max.x;
    if(bBox.max.y > maxY) maxY = bBox.max.x;
    if(bBox.max.z > maxZ) maxZ = bBox.max.z;
}
}
//rest of function....

これにより、モデルに関する興味深いデータが生成されています。モデルの全体的な極端な座標を取得できます。これは、モデルの全体的なバウンディング ボックスに近い (おそらく間違っている) と想定しています。しかし、これらの座標で何かをしようとすると (モデルを平均化して平均値に移動するなど)、一貫性のない結果が生成されます。

また、モデルのすべてのジオメトリをループする必要があるのは効率が悪いようですが、より良い方法はありますか? そうでない場合、このロジックを他のローダーに適用できますか?

4

2 に答える 2

4

を使用THREE.Box3#setFromObjectして、ジオメトリを自分でループすることなく、インポートされたモデルを含む任意の Object3D の境界ボックスを取得できます。だからあなたは次のようなことができます

var bBox = new THREE.Box3().setFromObject(collada.scene);

モデルの極端なバウンディング ボックスを取得します。次に、カメラの位置を正しく設定するために、gaitat がリンクした回答のテクニックのいずれかを使用できます。たとえば、この手法 ( How to Fit Camera to Object ) に従って、次のようなことを行うことができます。

var height = bBox.size().y;
var dist = height / (2 * Math.tan(camera.fov * Math.PI / 360));
var pos = collada.scene.position;
camera.position.set(pos.x, pos.y, dist * 1.1); // fudge factor so you can see the boundaries
camera.lookAt(pos);

クイック フィドル: http://jsfiddle.net/p19r9re2/

于 2014-09-30T18:33:19.910 に答える