Загружаю объект и назначаю ему рандомную позицию и масштаб. Мне нужно чтобы мои объекты отображались каждый раз рандомно, но не пересекались при этом. Сейчас они отображаются, но пересекаются. Условие поиска пересечений выглядит так:
var collision = firstBB.isIntersectionBox(current);
Вот циклы от 1 до 15, в цикле вызываю метод загрузки объекта
for (let i = 0; i < 15; i++) {
let object = loadObj('./models/model.fbx');
scene.add(object);
}
Функция загрузки объекта и назначения его позиции, масштаба
export const loadObj = (path, options = {}) => {
this.THREE = THREE;
const container = new THREE.Object3D();
container.loaded = false;
const loader = new FBXLoader();
loader.load(
path,
object => {
container.loaded = true;
object.position.set(randPos(), randPos(), randPos());
object.scale.set(randScale(), randScale(), randScale());
object.rotation.set(randRotation(), randRotation(), randRotation());
container.add(object);
let bbox = new THREE.Box3().setFromObject(container);
const isCollision = checkCollisions(bbox);
objects.push(container);
},
xhr => {
console.log('ERROR')
},
xhr => {
}
);
return container;
};
Функции рандома
const randPos = () => {
return Math.random() * 500 - 250;
};
const randScale = () => {
return Math.random() * 2 + 40;
};
const randRotation = () => {
return Math.random() * 2 * Math.PI;
};
Метод проверки пересечений (не до конца работает. нужно доработать)
const checkCollisions = (current) => {
for (let i = 0; i < objects.length; i++) {
let firstBB = new THREE.Box3().setFromObject(objects[i]);
var collision = firstBB.isIntersectionBox(current);
if (collision) {
remove(objects, i);
return true;
}
}
};
Идея была записывать в пустой массив объекты и потом сравнивать текущий объект со всеми, но не понимаю, как до конца реализовать эту логику и как определять новое рандомное положение объекта так, чтобы он не пересекал остальные. И далее добавлять его на сцену.
Как проверять пересечения. И если они есть, то помещать объект на новую позицию ?