Для того чтобы создавать рендеры на основе линий, такие, например, как чертежи или стилизации 3D под 2D, обычно в дополнение к основному рендер-движку используется дополнительный рендер-движок “Freestyle”. Ребра, которые на финальном рендере должны быть ярко обведены линиями, необходимо пометить как “freestyle”, после чего рендер-движок Freestyle сможет их обработать.
Как и практически со всей структурой меша в Blender, со “freestyle” ребрами можно работать через Blender Python API.
У каждого ребра меша есть свойство use_freestyle_mark, которое отвечает за то, помечено ребро как “freestyle” – значение равно True, или нет – False.
Мы можем проверить значение этого свойства для одного ребра активного меша:
1 2 3 |
print(bpy.context.object.data.edges[82].use_freestyle_mark) # True |
Или получить список всех его ребер, отмеченных как “freestyle”
1 2 3 4 |
freestyle_edges = [edge for edge in bpy.context.object.data.edges if edge.use_freestyle_mark] print(freestyle_edges) #[bpy.data.meshes['Suzanne'].edges[82], bpy.data.meshes['Suzanne'].edges[83], ...] |
Для того чтобы отметить ребро как “freestyle”, мы можем просто менять значение этого свойства. Для примера, отметим “freestyle” все ребра с индексами от 100 до 300. Меш должен находиться в объектном режиме.
1 2 3 |
for edge in bpy.context.object.data.edges: if 300 >= edge.index >= 100: edge.use_freestyle_mark = True |
Работа со свойством ребер “freestyle” в bmesh представляет определенные сложности.
Хотя в объекте bmesh и предусмотрен слой “freestyle” для ребер и мы можем выделить отдельный слой данных для “freestyle”,
1 2 3 4 5 6 7 8 |
bm.edges.layers.freestyle # <BMLayerCollection object at 0x0000029DAD1B9950> freestyle_layer = bm.edges.layers.freestyle.verify() print(freestyle_layer) # <BMLayerItem object at 0x0000029DAD1BB150> |
сама структура данных возвращает нам ошибку NotImplemented
1 2 3 |
bm.edges[0][freestyle_layer] # NotImplemented |
Контролировать отметку ребра как “freestyle” при работе с объектом bmesh, можно соотнеся индексы ребер базового меша и bmesh.
Предварительно получим индексы ребер, отмеченные “freestyle” с базового меша:
1 |
freestyle_edges_ids = [edge.index for edge in bpy.context.object.data.edges if edge.use_freestyle_mark] |
После чего в объекте bmesh можно проверять, соотносится ли индекс текущего ребра с полученным набором индексов ребер.
1 2 3 4 5 6 7 8 |
bm = bmesh.from_edit_mesh(bpy.context.object.data) bm.edges.ensure_lookup_table() for edge in bm.edges: if edge.index in freestyle_edges_ids: print('bmedge:', edge) bm.free() |