モデルのサイズと位置を決定し、モデルが原点に配置され、カメラのビュー内に配置されるように、モデルを自動的に中央に配置してスケーリングする方法はありますか? 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....
これにより、モデルに関する興味深いデータが生成されています。モデルの全体的な極端な座標を取得できます。これは、モデルの全体的なバウンディング ボックスに近い (おそらく間違っている) と想定しています。しかし、これらの座標で何かをしようとすると (モデルを平均化して平均値に移動するなど)、一貫性のない結果が生成されます。
また、モデルのすべてのジオメトリをループする必要があるのは効率が悪いようですが、より良い方法はありますか? そうでない場合、このロジックを他のローダーに適用できますか?