我正在使用 Three.js 和 OBJLoader.js 加载 OBJ 文件。这将返回一个 Three.Object3D 对象,它具有您对 3D 模型的期望(位置向量、向上向量...)
我想不通的是如何为它获得一个边界框——这可能吗?
我正在使用 Three.js 和 OBJLoader.js 加载 OBJ 文件。这将返回一个 Three.Object3D 对象,它具有您对 3D 模型的期望(位置向量、向上向量...)
我想不通的是如何为它获得一个边界框——这可能吗?
您不需要遍历对象的所有子项;库中有一种方法可以执行此操作THREE.Box3#setFromObject
::请参阅文档。例如,您可以执行以下操作:
var bbox = new THREE.Box3().setFromObject(obj);
获取 的边界框obj
,包括其所有子项,并考虑任何平移、旋转等。
请注意,BoundingBox
助手旨在在场景中绘制边界框,而不仅仅是计算某个对象的边界框。
如果您想要对象出现在场景中时的边界框位置和大小,请尝试使用 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);
在.boundingBox
对几何形状不占平移,旋转或缩放可以应用于父网等,我发现它非常难以调整为手动,但助手会为你。
对于任何形状,在其几何对象上都有一个boundingBox
属性。这个属性持有一个THREE.Box3
对象。这个Box3
对象由两个对象组成THREE.Vector3
,min
和max
。
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 + ')' );
对于更复杂的形状,例如从JSON 对象文件加载的形状,默认情况下未定义边界框属性。它必须明确计算。
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 + ')' );
}
是的,你需要这样的东西:
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);
}
编辑:
此方法在BoundingBoxHelper()
或BoxHelper()
可用之前