Обнаружение, если Voxel или группа вокселей все еще связаны с остальной частью объекта - PullRequest
1 голос
/ 03 ноября 2019

Итак, я строю физический симулятор на основе вокселей, в котором воксели могут быть уничтожены. Каждый вокселизированный объект имеет своего рода «центральный воксел», чтобы описать его, я плохо называю его «мир А». Все воксели имитируются как один до тех пор, пока они не будут отделены от «мира A» или другого вокселя, прикрепленного к нему, затем они (и / или другие воксели, связанные с этим вокселем) помещаются в новый объект со своей собственной имитируемой физикой. И здесь кроется моя проблема. Как проверить, прикреплен ли воксель? наиболее эффективным способом? поиск пути звучит так, как будто бы он замедлится, когда я увеличу масштаб, но с удовольствием попробую это выяснить, если это лучший вариант. и обновление всех вокселей сразу, когда один воксель уничтожен, тоже не очень хорошо звучит. У кого-нибудь из вас есть гении?

вот несколько рисунков для ясности (пожалуйста, извините, мой плохой почерк мыши)

первое изображение с подключенными вокселями: img

второе изображение, когдавоксели раздельные: img

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Сегментация / маркировка является способом (аналогично растру A * и заливке).

  1. для каждого вокселя добавьте переменную флага / пробел

    этот флаг будет использоваться, чтобы указать, используется ли воксел или нет ... и может использоваться последним в качестве временного значения ...

  2. очистить все флаги дляобнулить и установить фактический объект ID=1.

  3. выбрать первый воксел с помощью flag=0

  4. наводнение заполнить его фактическим объектом ID

    , поэтому, используя 4 или 8 возможность подключения, заполните воксельные флаги с ID.

  5. приращениеID и переход к # 3

    прекращаются, когда больше нет вокселей с flag=0

После этого флаг содержит идентификатор подобъекта вашего оригиналаобъект делится на и ID содержит количество ваших новых объектов + 1.

0 голосов
/ 04 ноября 2019
  1. Выберите случайный, не связанный объект
  2. Рекурсивно получайте объект вверх / вниз / влево / вправо, пока не останется левого (всегда проверяйте, подключен ли уже объект)
  3. Если в сцене не осталось объектов, которые не подключены, остановитесь
  4. Перейдите на Шаг 1
...