Получаем список вертексов, в порядке их следования друг за другом

Для работы с геометрией 3D объектов в Blender иногда бывает необходимо получить не просто список вертексов, а список вертексов в порядке их следования друг за другом. Сделать это можно через Blender Python API.

Когда мы получаем список вертексов меша обычным образом:

Мы получим его в порядке создания вертексов, их добавления или удаления, но этот порядок не соответствует порядку их следования в геометрии друг за другом. Убедиться в этом можно включив отображение индексов точек для просмотра в окне 3D вьюпорта.

Такой список вертексов не всегда удобен, по нему, например, для данной геометрии нельзя построить правильный заполняющий ее полигон (фейс).

Сформировать список вертексов в нужном порядке мы можем при помощи структуры bmesh.

Создадим bmesh и подготовим геометрию к дальнейшей работе с ней:

Определим буфер в который будем заносить индексы вертексов в порядке следования:

Начнем с первого вертекса (с индексом 0) и будем проходить по точкам bmesh в цикле, занося их индексы в буфер:

У каждого вертекса в bmesh есть указатели на примыкающие к этому вертексу ребра. А у каждого ребра есть, в свою очередь, указатели на вертексы, лежащие на концах этого ребра. Воспользовавшись этим, мы можем от одной точки через ребро получить индекс следующей точки.

Список ребер, примыкающих к заданному вертексу можно получить через указатель link_edges. Второй вертекс на ребре можно получить через функцию ребра edge.other_vert(), передав в параметре указатель на исходный вертекс.

В списке из двух примыкающих к исходному вертексу ребер нам нужно выбрать одно:

В условии мы просматриваем оба примыкающих к исходному вертексу ребра, получаем индекс второй точки и проверяем, нет ли его уже в нашем списке сортированных точек. Если индекс уже есть в списке, это значит мы повернули в обратную сторону по ребрам и нам нужно второе ребро. Если индекса нет – значит мы двигаемся в правильном направлении и именно этот индекс будет следующим, который нам нужен.

Указатель на следующий вертекс:

будет на следующей итерации цикла while добавлен в список сортированных вертексов. Следующий шаг будет сделан уже от него.

Если нужно “закрыть” цепочку, после окончания цикла while добавим в конец еще раз вертекс с нулевым индексом.

Так как в итоге нам требуются индексы вертексов исходного меша, а не bmesh, в конце проверки переведем индексы в нужную размерность:

Так как геометрия объекта не всегда идеальна и возможны вертексы, к которым примыкает больше двух ребер, а также вертексы не связанные ребрами, добавим в цикл дополнительное условие.

Перед началом цикла посчитаем общее количество точек, определим переменную-счетчик и будем повышать ее значение на каждом проходе цикла. Если в процессе работы произойдет “зацикливание”, мы выйдем из цикла после проверки максимального количества точек меша.

Оформим весь код в единую функцию:

В параметре функции мы будем передавать указатель на объект (меш).

Теперь мы можем получить список вертексов в нужном нам порядке следования:

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

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии