как получить ограничивающую сферу для всей сцены за три. js? - PullRequest
1 голос
/ 04 августа 2020

Как получить ограничивающую сферу для всей сцены за три. js? Я могу попытаться получить ограничивающую сферу для каждого объекта и вычислить их результирующее объединение, но я думаю, что может быть более простой метод.

1 Ответ

1 голос
/ 04 августа 2020

Существуют различные методы динамического получения ограничивающей сферы из нескольких объектов. Вы можете сначала получить ограничивающую рамку для всех из них, а затем создать сферу этой ограничивающей рамки ... вот пример скрипки, которую я сформировал на boundingSphere для boundingBox .

введите описание изображения здесь

В основном вы помещаете все геометрические формы в Group, вы получаете Box3 группы, а затем вы делаете getBoundingSphere из Box3 и позиционируете в центре. Код в скрипте будет следующим.

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);

EDITED : если вы хотите включить в ограничивающую сферу для сцены, включая источники света (которые могут дать вам огромную сферу), просто начиная с let bbox = new THREE.Box3().setFromObject(scene)

...