Доступ к свойству face_strength из Blender Python API

Параметр “face_strength” используется в модификаторе Weighted Normal для расчета нормалей. Задавать и изменять его значение можно, вызывая специальный оператор, или напрямую получая и записывая его значения через Blender Python API.

Работа с face_strength через оператор

Для манипуляций с параметром force_strength в Blender Python API реализован единый оператор:

Работа с оператором производится в режиме редактирования меша.

Для того, чтобы задать полигонам требуемое значение силы ‘WEAK’, ‘MEDIUM’ или ‘STRONG’ нужно выделить нужные полигоны и вызвать оператор с установленной опцией set = True.

Для того, чтобы выделить полигоны с необходимым значением силы, нужно вызвать этот же оператор, но с параметром set = False.

Необходимо отметить, что оператор mod_weighted_strength контекстно-зависимый. Он предназначен для контекста 3D вьюпорта, и если вызывать его из другого окна, нужно переопределять контекст.

Работа с face_strength напрямую

Если изучить структуру меша через API, мы не найдем в ней свойства для хранения значений face_strength. Это потому, что эти значения пишутся в атрибут меша “__mod_weightednormals_faceweight”.

Значения атрибута можно просмотреть в окне SpreadSheet в домене “Face”.

Соответствие числовых значений текстовому обозначению следующее:

  • WEAK  = -16348
  • MEDIUM = 0
  • STRONG = 16348

Получить доступ к значениям атрибута через API можно в объектном “OBJECT” режиме меша.

Для того, чтобы получить значения face_strength для каждого полигона обратимся к ним через атрибут по его имени:

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

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

Например зададим полигону с индексом 0 значение силы равное “WEAK”:

Также следует обратить внимание на то. что если мы предварительно не вызывали оператора mod_weighted_strength для задания силы полигонам, атрибут изначально не будет создан и Blender выдаст ошибку вида:

KeyError: ‘bpy_prop_collection[key]: key “__mod_weightednormals_faceweight” not found’

Для того, чтобы задавать значения face_strength через API без предварительного вызова оператора mod_weighted_strength, нужно самостоятельно создать для меша нужный нам атрибут:

После чего можно задавать значения face_strength также, как после вызова оператора:

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии