При обращении к геометрии меша – его точкам, ребрам и полигонам, Blender оперирует исходными данными без учета наложенных на объект модификаторов.
Например количество точек для активного объекта, которое можно получить с помощью команды:
1 |
len(bpy.context.active_object.data.vertices) |
будет возвращено без учета наложенного на объект модификатора Subdivision, который подразделяет геометрию меша, увеличивая ее значения.
Так для куба, на который наложен модификатор Subdivision:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import bpy cube = bpy.context.active_object print('vertices: ', len(cube.data.vertices)) print('edges: ', len(cube.data.edges)) print('faces: ', len(cube.data.polygons)) print('all vertices ', cube.data.vertices) # vertices: 8 # edges: 12 # faces: 6 # all vertices <bpy_collection[8], MeshVertices> |
Для того, чтобы определить геометрию объекта с учетом изменяющих ее модификаторов нужно обратится к объекту через структуру depsgraph, которая дает возможность обращаться к реальному состоянию сцены.
Для начала нужно получить объект depsgraph для текущего контекста:
1 |
depsgraph = bpy.context.evaluated_depsgraph_get() |
Далее, через него получить “evaluated”версию нужного объекта, в которой уже учтено воздействие всех модификаторов:
1 |
cube_eval = cube.evaluated_get(depsgraph) |
И уже для полученного объекта запрашивать данные по геометрии.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import bpy cube = bpy.context.active_object depsgraph = bpy.context.evaluated_depsgraph_get() cube_eval = cube.evaluated_get(depsgraph) print('vertices: ', len(cube_eval.data.vertices)) print('edges: ', len(cube_eval.data.edges)) print('faces: ', len(cube_eval.data.polygons)) print('all_vertices ', cube_eval.data.vertices) # vertices: 26 # edges: 48 # faces: 24 # all_vertices <bpy_collection[26], MeshVertices> |
Как мы видим, для куба получены реальные данные по его геометрии с учетом наложенного модификатора Subdivision.