Параметр “face_strength” используется в модификаторе Weighted Normal для расчета нормалей. Задавать и изменять его значение можно, вызывая специальный оператор, или напрямую получая и записывая его значения через Blender Python API.
Работа с face_strength через оператор
Для манипуляций с параметром force_strength в Blender Python API реализован единый оператор:
1 |
bpy.ops.mesh.mod_weighted_strength(set=False, face_strength='MEDIUM') |
Работа с оператором производится в режиме редактирования меша.
Для того, чтобы задать полигонам требуемое значение силы ‘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 для каждого полигона обратимся к ним через атрибут по его имени:
1 2 3 |
[attr.value for attr in bpy.context.object.data.attributes['__mod_weightednormals_faceweight'].data] # [16384, 16384, 16384, 16384, -16384, -16384] |
Порядок значений в списке соответствует индексам полигонов меша.
Задать нужное значение силы для полигона также можно через атрибут.
Например зададим полигону с индексом 0 значение силы равное “WEAK”:
1 |
bpy.context.object.data.attributes['__mod_weightednormals_faceweight'].data[0].value = -16384 |
Также следует обратить внимание на то. что если мы предварительно не вызывали оператора mod_weighted_strength для задания силы полигонам, атрибут изначально не будет создан и Blender выдаст ошибку вида:
KeyError: ‘bpy_prop_collection[key]: key “__mod_weightednormals_faceweight” not found’
Для того, чтобы задавать значения face_strength через API без предварительного вызова оператора mod_weighted_strength, нужно самостоятельно создать для меша нужный нам атрибут:
1 2 3 |
bpy.context.object.data.attributes.new(name='__mod_weightednormals_faceweight', type='INT', domain='FACE') # bpy.data.meshes['Cube'].attributes['__mod_weightednormals_faceweight'] |
После чего можно задавать значения face_strength также, как после вызова оператора:
1 |
bpy.context.object.data.attributes['__mod_weightednormals_faceweight'].data[0].value = -16384 |