有没有办法从three.js Object3D获取边界框?

lar*_*ryq 45 three.js

我正在使用Three.js和OBJLoader.js加载OBJ文件.这将返回一个Three.Object3D对象,它具有您对3D模型的期望(位置向量,向上向量...)

我无法弄清楚的是如何获得它的边界框 - 这可能吗?

cas*_*run 72

您不需要迭代对象的所有子项; 库中有一个方法可以执行此操作THREE.Box3#setFromObject:: 请参阅文档.例如,你可以这样做:

var bbox = new THREE.Box3().setFromObject(obj);
Run Code Online (Sandbox Code Playgroud)

获得obj包括其所有孩子在内的边界框,并考虑任何翻译,轮换等.

请注意,BoundingBox帮助程序用于在场景中绘制边界框,而不仅仅是计算某个对象的边界框.

  • 这是这里最好的答案 (4认同)
  • 这个答案很好,但可能效率低下。此函数将遍历整个层次结构以及所有顶点。一个好主意是在所有网格上调用“geometry.computeBoundingBox()”,并创建一个使用所有场景边界框扩展主边界框的函数。 (2认同)

小智 27

如果您希望边界框的位置和大小作为对象出现在场景中,请尝试BoundingBoxHelper:

var helper = new THREE.BoundingBoxHelper(someObject3D, 0xff0000);
helper.update();
// If you want a visible bounding box
scene.add(helper);
// If you just want the numbers
console.log(helper.box.min);
console.log(helper.box.max);
Run Code Online (Sandbox Code Playgroud)

.boundingBox对几何形状不占平移,旋转或缩放可以应用于父网等,我发现它非常难以调整为手动,但助手会为你.

  • 请注意_BoundingBoxHelper_已被[不推荐使用](https://github.com/mrdoob/three.js/issues/10143),并已由[BoxHelper](https://threejs.org/docs/index.html#api取代/ helpers / BoxHelper)。 (4认同)

CL2*_*L22 17

对于任何形状,在其几何对象上都有一个boundingBox属性.该属性包含一个THREE.Box3对象.该Box3对象由两个对象组成THREE.Vector3,minmax.

var geometry = new THREE.CylinderGeometry(...);
var material = new THREE.LineBasicMaterial(...);
var mesh = new THREE.Mesh(geometry, material);

var boundingBox = mesh.geometry.boundingBox.clone();
alert('bounding box coordinates: ' + 
    '(' + boundingBox.min.x + ', ' + boundingBox.min.y + ', ' + boundingBox.min.z + '), ' + 
    '(' + boundingBox.max.x + ', ' + boundingBox.max.y + ', ' + boundingBox.max.z + ')' );
Run Code Online (Sandbox Code Playgroud)

对于更复杂的形状,例如从JSON Object文件加载的形状,默认情况下未定义边界框属性.它必须明确计算.

var loader = new THREE.ObjectLoader();
loader.load(imagePath, function(object){

    geometry = object.children[0].children[0].geometry;  // substitute the path to your geometry

    geometry.computeBoundingBox();  // otherwise geometry.boundingBox will be undefined

    var boundingBox = geometry.boundingBox.clone();
    alert('bounding box coordinates: ' + 
        '(' + boundingBox.min.x + ', ' + boundingBox.min.y + ', ' + boundingBox.min.z + '), ' + 
        '(' + boundingBox.max.x + ', ' + boundingBox.max.y + ', ' + boundingBox.max.z + ')' );
}
Run Code Online (Sandbox Code Playgroud)


gai*_*tat 12

是的你需要这样的东西:

if (object instanceof THREE.Object3D)
{
    object.traverse (function (mesh)
    {
        if (mesh instanceof THREE.Mesh)
        {
            mesh.geometry.computeBoundingBox ();
            var bBox = mesh.geometry.boundingBox;

            // compute overall bbox
            minX = Math.min (minX, bBox.min.x);
            minY = Math.min (minY, bBox.min.y);
            minZ = Math.min (minZ, bBox.min.z);
            maxX = Math.max (maxX, bBox.max.x);
            maxY = Math.max (maxY, bBox.max.y);
            maxZ = Math.max (maxZ, bBox.max.z);
        }
    });

    var bBox_min = new THREE.Vector3 (minX, minY, minZ);
    var bBox_max = new THREE.Vector3 (maxX, maxY, maxZ);
    var bBox_new = new THREE.Box3 (bBox_min, bBox_max);

    scene.add (object);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

此方法在可用之前BoundingBoxHelper()或之前BoxHelper()可用