Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在three.js中导入模型后的智能定心和缩放_Three.js - Fatal编程技术网

在three.js中导入模型后的智能定心和缩放

在three.js中导入模型后的智能定心和缩放,three.js,Three.js,是否有方法确定模型的大小和位置,然后自动居中并缩放模型,以便将其定位在原点和相机视图内?我发现,当我从Sketchup导入Collada模型时,如果该模型在Sketchup中未居中于原点,则它在three.js中未居中。虽然这是有道理的,但最好在导入后自动居中到原点 我在不同的文件加载器中看到了一些关于获取导入模型边界的讨论,但是我找不到任何关于如何实现这一点的参考 缩放问题不那么重要,但我觉得它与边界函数有关,这也是我为什么要问它的原因 编辑: 在玩了一点游戏之后,更多的信息和更多的谷歌搜索

是否有方法确定模型的大小和位置,然后自动居中并缩放模型,以便将其定位在原点和相机视图内?我发现,当我从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....
loader.load(mURL,函数colladaReady(collada){
dae=collada.scene;
皮肤=collada.皮肤[0];
dae.scale.x=dae.scale.y=dae.scale.z=1;
dae.updateMatrix();
//设置任意的最小值和最大值进行比较
var minX=100000;
var minY=100000;
var minZ=100000;
var maxX=0;
var-maxY=0;
var-maxZ=0;
变量几何=collada.dae.geometries;
for(几何图形中的变量propName){
if(geometrics.hasOwnProperty(propName)&&geometrics[propName].mesh){
dae.geometry=geometry[propName].mesh.geometry3js;
dae.geometry.computeBoundingBox();
bBox=dae.geometry.boundingBox;
如果(bBox.min.xmaxX)maxX=bBox.max.x;
如果(bBox.max.y>maxY)maxY=bBox.max.x;
如果(bBox.max.z>maxZ)maxZ=bBox.max.z;
}
}
//其余的功能。。。。
这生成了一些关于模型的有趣数据。我可以得到模型的整体极限坐标,我假设(可能错误地)它将接近模型的整体边界框。但是尝试使用这些坐标做任何事情(比如平均并将模型移动到平均值)生成不一致的结果

此外,必须循环一个模型的每个几何体似乎效率低下,有没有更好的方法?如果没有,这个逻辑可以应用于其他加载程序吗?

您可以使用它获取任何Object3D的边界框,包括导入的模型,而不必自己循环几何体。因此,您可以执行以下操作

var bBox = new THREE.Box3().setFromObject(collada.scene);
要获得模型的极限边界框,则可以使用gaitat链接的答案中的任何技术,以便正确设置相机位置。例如,可以遵循此技术()并执行以下操作:

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);
快速小提琴:。

试试几何体。中心()

这些应该会有所帮助
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;

    };

}(),