有没有办法确定模型的大小和位置,然后自动居中并缩放模型,使其位于相机的原点和视图内?我发现当我从Sketchup导入Collada模型时,如果模型不在Sketchup中的原点居中,那么它不会以three.js为中心。虽然这是有道理的,但在导入后自动居中到原点会很不错。
我在不同的文件加载器中看到了一些关于获取导入模型边界的讨论,但是我无法找到任何关于如何做到这一点的参考。
缩放问题不太重要,但我觉得它与边界函数有关,这也是我问过它的原因。
编辑:
更多信息后再玩一些谷歌搜索......
加载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....
这会产生一些有关该模型的有趣数据。我可以得到模型的整体极限坐标,我假设(可能不正确)将接近模型的整体边界框。但是尝试对这些坐标做任何事情(比如平均并将模型移动到平均值)会产生不一致的结果。
此外,为模型循环遍历每个几何体似乎效率低下,有更好的方法吗?如果没有,这个逻辑可以应用于其他加载器吗?
答案 0 :(得分:2)
您可以使用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(f * 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);
答案 1 :(得分:0)
尝试geometry.center()
center: function () {
var offset = new Vector3();
return function center() {
this.computeBoundingBox();
this.boundingBox.getCenter( offset ).negate();
this.translate( offset.x, offset.y, offset.z );
return this;
};
}(),