@Levin1994

Как отобразить рандомно объекты, но при этом чтобы они не пересекались?

Загружаю объект и назначаю ему рандомную позицию и масштаб. Мне нужно чтобы мои объекты отображались каждый раз рандомно, но не пересекались при этом. Сейчас они отображаются, но пересекаются. Условие поиска пересечений выглядит так:

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

Идея была записывать в пустой массив объекты и потом сравнивать текущий объект со всеми, но не понимаю, как до конца реализовать эту логику и как определять новое рандомное положение объекта так, чтобы он не пересекал остальные. И далее добавлять его на сцену.

Как проверять пересечения. И если они есть, то помещать объект на новую позицию ?
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Bhudh
Идея была записывать в пустой массив объекты и потом сравнивать текущий объект со всеми, но не понимаю, как до конца реализовать эту логику

А чего тут понимать? Цикл, или forEach, или some, или every… Вариантов масса.

как определять новое рандомное положение объекта

А стоит? Лишние телодвижения, легче дождаться, когда рандом выдаст непересекающуюся позицию.
Определение потребуется только если объекты велики, а зона размещения ограничена. Тогда определять минимальную величину возможного расстояния между данными объектами и пулять на это расстояние + эпсилон.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы