如何确定Object3D的宽度/高度/深度(好像它没有旋转)?

时间:2017-09-21 00:23:05

标签: javascript three.js rotation

我正在计算像这样的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.yboundingBox.max.y之间的差异会增加/减少,从而导致高度不同于没有轮换。

但我想计算obj的高度,好像它根本没有旋转一样。我怎么能这样做?

我猜我需要根据旋转角度变换boundingBox的尺寸,但我不知道该怎么做。

轮换前:

1

轮换后:

2

(红色= obj,蓝色= boundingBox

1 个答案:

答案 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;
}

请注意,这仅在子对象未以任何方式转换时才有效。