При работе со сложным ригом, бывает необходимо быстро найти самую верхнюю кость. Так как все кости в риге связаны между собой через систему родитель-ребенок, можно написать простой скрипт, который пройдет по всей иерархии, начиная от текущей активной кости, и найдет самую верхнюю кость.
Пусть у нас имеется сложный риг и на нем активна одна из дочерних костей.
Для наглядности переключимся в режим редактирования. Так мы сможем сразу видеть все выделения в иерархии рига, и плюс, не нужно будет обновлять состояние для выделенных костей.
|
1 2 |
if bpy.context.mode != 'EDIT': bpy.ops.object.mode_set(mode='EDIT') |
Текущая активная арматура.
|
1 2 3 |
armature = bpy.context.active_object.data # <bpy_struct, Armature("Armature") at 0x000001BA07396988> |
И текущая активная кость на ней.
|
1 2 3 |
active_bone = armature.edit_bones.active # <bpy_struct, EditBone("Bone.011") at 0x000001BA071B1618> |
Все кости в риге соединены по принципу родитель-ребенок. В каждой кости есть список указателей на дочерние кости, а также указатель на ее родительскую кость. Он нам и нужен.
|
1 2 3 |
parent = active_bone.parent # <bpy_struct, EditBone("Bone.009") at 0x000001BA06EACB98> |
Организовав цикл While по этому указателю от текущей кости на родительскую для нее, мы можем пройти вверх по ригу до самой верхней кости.
|
1 2 3 4 5 6 |
while active_bone.parent: active_bone = active_bone.parent print('step up: ', active_bone) active_bone.select = True active_bone.select_head = True active_bone.select_tail = True |
Для наглядности мы выделяем каждую последующую родительскую кость по пути следования.
После того как цикл завершится, в переменной active_bone останется указатель на самую верхнюю кость рига, ту, у которой отсутствует родительская кость.
|
1 2 3 |
print('topmost bone: ', active_bone) # topmost bone: <bpy_struct, EditBone("Bone") at 0x000001BA07322098> |
Самая верхняя кость так же будет выделена.
Если нужно просто найти самую верхнюю кость в риге, не выделяя весь путь, операции выделения внутри цикла While можно опустить.

.blend file on Patreon