有没有办法确定模型的大小和位置,然后自动将模型居中并缩放,以便它位于原点并在相机视图内?我发现当我从Sketchup导入Collada模型时,如果模型在Sketchup中不是居中在原点,则在three.js中也不是居中的。虽然这很有道理,但在导入后自动居中到原点会很好。
我在不同文件加载器中看到了一些关于获取导入模型范围的讨论,但我找不到任何参考资料来了解如何实现。
缩放问题不太重要,但我觉得它与边界函数有关,这就是为什么我也问了它的原因。
编辑:
经过一番尝试和更多的谷歌搜索后,我的回调函数加载collada文件的代码现在看起来像这样:
这会产生有关模型的一些有趣数据。我可以获得模型的整体极限坐标,我认为这可能与模型的整体边界框接近。但是,尝试对这些坐标执行任何操作(例如对平均值进行平均并将模型移动到平均值)会生成不一致的结果。
另外,需要循环遍历每个几何体来获取模型,这似乎效率低下。是否有更好的方式?如果没有,这种逻辑是否适用于其他加载程序?
我在不同文件加载器中看到了一些关于获取导入模型范围的讨论,但我找不到任何参考资料来了解如何实现。
缩放问题不太重要,但我觉得它与边界函数有关,这就是为什么我也问了它的原因。
编辑:
经过一番尝试和更多的谷歌搜索后,我的回调函数加载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....
这会产生有关模型的一些有趣数据。我可以获得模型的整体极限坐标,我认为这可能与模型的整体边界框接近。但是,尝试对这些坐标执行任何操作(例如对平均值进行平均并将模型移动到平均值)会生成不一致的结果。
另外,需要循环遍历每个几何体来获取模型,这似乎效率低下。是否有更好的方式?如果没有,这种逻辑是否适用于其他加载程序?