Выделение вертексов по цвету

У вертексов нет свойства “цвет”. Цвета вертексов, задаваемые раскраской в режиме Vertex Paint или любым другим способом, хранятся в атрибуте – отдельном списке значений. Для того чтобы выделить точку по цвету, назначенному ей в атрибуте, нужно связать индексы атрибута с индексом вертекса.

Прямой связи между индексом вертексов и индексами цветов в атрибуте тоже нет. Так сделано потому, что одна точка может иметь более чем один цвет.

Например, возьмем два смежных полигона и раскрасим их в фиолетовый и голубой цвета. Какой цвет в этом случае должен быть назначен вертексам с индексами 0 и 3 – голубой или фиолетовый? Назначение вертексу только одного цвета исказит цвет полигона в целом.

Для того чтобы избежать подобной неоднозначности на смежных полигонах, цвета вертексам назначаются не по их индексам, а по индексам “лупов” (loop) полигонов.

Меш, состоящий из двух смежных полигонов, имеет 6 вертексов с индексами от 0 до 5, и в то же время, каждый его полигон имеет по 4 лупа с индексами от 0 др 7.

В данном случае для вертекса с индексом 0 голубой цвет назначается лупу с индексом 0, а фиолетовый цвет – лупу с индексом 5. Для вертекса с индексом 3 голубой цвет назначается лупу с индексом 3, а фиолетовый – лупу с индексом 6.

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

У меша может быть несколько независимых раскрасок, распределенных по слоям. Список слоев, каждый со своей раскраской, хранится в параметре vertex_colors.

Текущий активный слой можно получить через параметр active:

Список самих цветов мы можем получить из параметра data:

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

Сначала пройдем в цикле по всем полигонам:

и для каждого полигона по индексам лупов:

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

и, например, выделить те вертексы, которые хотя бы для одного полигона окрашены в красный цвет:

Для сравнения компонентов цвета можно использовать и полное равенство (знак ==), но лучше элементы сравнения > и <, чтобы избавиться от неточности для чисел с плавающей точкой.

Полный код, при помощи которого можно выделить все вертексы текущего активного меша, окрашенные в красный цвет:

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

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии