【问题标题】:how to get the boundingSphere for a whole scene in three.js?如何在three.js中获取整个场景的boundingSphere?
【发布时间】:2020-11-24 03:33:46
【问题描述】:

如何在three.js中获取整个场景的边界球? 我可能会尝试获取每个对象的边界球并计算它们的联合,但我认为可能有更直接的方法。

【问题讨论】:

  • 你刚刚描述的方法!
  • 您也可以先通过var aabb = new THREE.Box3().setFromObject( scene );计算AABB,然后使用aabb.getBoundingSphere( sphere );

标签: three.js bounding


【解决方案1】:

有不同的方法可以动态获取多个对象的 boundingSphere。您可以先获取所有这些边界框,然后创建该边界框的球体......这是我在boundingSphere of a boundingBox 上塑造的一个示例小提琴。

基本上,您将所有几何图形放入Group,得到组的Box3,然后从Box3 中执行getBoundingSphere 并定位在中心。小提琴中的代码是这样的。

let g = new THREE.Group();
scene.add(g);
for (let i = 0; i < 5; i++) {

    // geometry
    var geometry = new THREE.BoxGeometry(20, 20, 20);

    // material
    var material = new THREE.MeshToonMaterial({
        color: 0xff0000,
        opacity: 0.7,
    });

    // mesh
    mesh = new THREE.Mesh(geometry, material);
    mesh.position.set(100 * Math.random(), 100 * Math.random(), 100 * Math.random());
    g.add(mesh);
}

//g.updateWorldMatrix(true);
var gridHelper = new THREE.GridHelper(400, 40, 0x0000ff, 0x808080);
gridHelper.position.y = 0;
gridHelper.position.x = 0;
scene.add(gridHelper);

let bbox = new THREE.Box3().setFromObject(g);
let helper = new THREE.Box3Helper(bbox, new THREE.Color(0, 255, 0));
scene.add(helper);

const center = new THREE.Vector3();
bbox.getCenter(center);

let bsphere = bbox.getBoundingSphere(new THREE.Sphere(center));
let m = new THREE.MeshStandardMaterial({
    color: 0xffffff,
    opacity: 0.3,
    transparent: true
});
var geometry = new THREE.SphereGeometry(bsphere.radius, 32, 32);
let sMesh = new THREE.Mesh(geometry, m);
scene.add(sMesh);
sMesh.position.copy(center);

已编辑:如果您想在包含灯光的场景的 boundingSphere 中包含(这可能会给您带来一个巨大的球体),请从let bbox = new THREE.Box3().setFromObject(scene)开始

【讨论】:

猜你喜欢
  • 2016-12-18
  • 2020-07-24
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多