Книга: Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

Действие позирования костей

Действие позирования костей

Эта программа создает арматуру с двумя костями, которые вращаются по некоторым сложным кривым.


#--------------------------------------------------
# File pose_action.py
#--------------------------------------------------
import bpy
import math 
def run(origin):
    # Установка начала и конца анимации
    scn = bpy.context.scene
    scn.frame_start = 1
    scn.frame_end = 250
    # Создание арматуры и объекта
    bpy.ops.object.armature_add()
    ob = bpy.context.object
    amt = ob.data
    # Переименование первой кости и создание второй кости
    bpy.ops.object.mode_set(mode='EDIT')
    base = amt.edit_bones['Bone']
    base.name = 'Base'
    tip = amt.edit_bones.new('Tip')
    tip.head = (0,0,1)
    tip.tail = (0,0,2)
    tip.parent = base
    tip.use_connect = True
    # Установка позиции объекта в режиме объектов
    bpy.ops.object.mode_set(mode='OBJECT')
    ob.location=origin
    # Установка Эйлерова режима вращения (Euler ZYX)
    bpy.ops.object.mode_set(mode='POSE')
    pbase = ob.pose.bones['Base']
    pbase.rotation_mode = 'ZYX'
    ptip = ob.pose.bones['Tip']
    ptip.rotation_mode = 'ZYX'
    # Вставка 26 ключевых кадров для двух вращений FCurves
    # Последний ключевой кадр будет вовне дипазона анимации
    for n in range(26):
        pbase.keyframe_insert(
            'rotation_euler',
            index=0,
            frame=n,
            group='Base')
        ptip.keyframe_insert(
            'rotation_euler',
            index=2,
            frame=n,
            group='Tip')
    # Получение FCurves из вновь созданного действия
    action = ob.animation_data.action
    fcus = {}
    for fcu in action.fcurves:
        bone = fcu.data_path.split('"')[1]
        fcus[(bone, fcu.array_index)] = fcu
    # Модификация ключевых точек
    baseKptsRotX = fcus[('Base', 0)].keyframe_points
    tipKptsRotZ = fcus[('Tip', 2)].keyframe_points
    omega = 2*math.pi/250
    for n in range(26):
        t = 10*n
        phi = omega*t
        kp = baseKptsRotX[n]
        kp.co = (t+1,phi+0.7*math.sin(phi))
        kp.interpolation = 'LINEAR'
        kp = tipKptsRotZ[n]
        kp.co = (t+1, -3*phi+2.7*math.cos(2*phi))
        kp.interpolation = 'LINEAR'
    # Вычисление путей для поз костей
    bpy.ops.pose.select_all(action='SELECT')
    bpy.ops.pose.paths_calculate()
    return 
if __name__ == "__main__":
    run((10,0,0))
    bpy.ops.screen.animation_play(reverse=False, sync=False)

Оглавление книги


Генерация: 0.027. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз