我正在计算像这样的Object3D的高度:
let obj = ... ; // An Object3D instance. Could be a Mesh, Group, etc.
let boundingBox = new THREE.Box3().setFromObject(obj);
let height = Math.abs(boundingBox.min.y - boundingBox.max.y);
当obj
旋转时(在X和/或Z轴上),boundingBox.min.y
和boundingBox.max.y
之间的差异会增加/减少,从而导致高度不同于没有轮换。
但我想计算obj
的高度,好像它根本没有旋转一样。我怎么能这样做?
我猜我需要根据旋转角度变换boundingBox
的尺寸,但我不知道该怎么做。
轮换前:
轮换后:
(红色= obj
,蓝色= boundingBox
)
答案 0 :(得分:1)
THREE.Box3().setFromObject(obj)
将为您提供"世界轴对齐的边界框"对象。它将显式计算所有顶点的世界坐标(读取:包括对象及其所有父项的旋转,位置和比例)。
如果你只想要几何的边界框(没有对象的位置,旋转,比例),你可以在调用obj.geometry.boundingBox
后使用computeBoundingBox()
:
obj.geometry.computeBoundingBox();
let boundingBox = obj.geometry.boundingBox;
对于对象层次结构,您可以执行类似这样的操作来获取聚合边界框:
function getCombinedBoundingBox(object) {
const result = new THREE.Box();
object.traverse(child => {
// skip everything that doesn't have a geometry
if (!child.geometry) { return; }
child.geometry.computeBoundingBox();
result.union(child.geometry.boundingBox);
});
return result;
}
请注意,这仅在子对象未以任何方式转换时才有效。