Определяем активный полигон в объекте BMesh

Объект BMesh безусловно обладает большей функциональностью и возможностями для работы с данными мешей по сравнении со стандартным набором данных, хранящимся в свойстве data объекта. Однако некоторые моменты управления данными меша в объекте BMesh не всегда очевидны. Рассмотрим, на пример, достаточно тривиальная операция по получению текущего активного полигона.

Пусть текущий активный меш у нас находится в режиме редактирования. Если он в объектном режиме — переключим его.

Переключимся на выделение полигонов.

Создадим объект BMesh, перекинем в него данные из текущего активного меша и проведем балансировку индексов полигонов.

Текущий активный полигон в BMesh мы можем получить через список bm.select_history. В нем хранится вся история выделений для текущего объекта BMesh. Последний выделенный полигон всегда будет считаться активным, но лучше получать его через указатель списка active.

Кажется, все просто, но здесь есть несколько неочевидных моментов.

Если мы выделяем еще один какой-нибудь полигон в BMesh, он не попадает автоматически в список истории и не становится, соответственном, активным.

Это нужно делать вручную, удалив его из списка истории, и добавив заново.

Об этом нужно помнить, манипулируя выделением в объекте BMesh.

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

Переключив режим выбора, например, на ребра и обратно на полигоны, мы получим пустой список выделения в BMesh.

Мы получаем пустой список, в то время, как выделения все еще присутствуют на меше. Это тоже надо учитывать.

Есть еще один вариант получения активного полигона в BMesh — через индекс активного полигона в основном блоке data меша.

Сначала мы просто берем индекс текущего активного полигона в меше, а потом получаем полигон в BMesh с этим индексом. Он, соответственно, и должен быть активным полигоном.

Однако у этого метода тоже есть особенность, если в процессе работы с BMesh мы намеренно меняем активный полигон, как это было показано выше, этим способом мы все равно получим тот полигон, который был активным в исходном блоке data меша а не установленный нами. С другой стороны — это всегда будет тот полигон, который пользователь видит активным в окне 3D вьюпорта.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Новые
Старые Популярные