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

Присвоение отношений родитель-потомок

Присвоение отношений родитель-потомок

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


#----------------------------------------------------------
# File epicycle.py
#----------------------------------------------------------
import bpy
import math from math
import pi  
def createEpiCycle(origin):
    periods = [1, 5, 8, 17]
    radii = [1.0, 0.3, 0.5, 0.1]
    axes = [0, 2, 1, 0]
    phases = [0, pi/4, pi/2, 0]
    # Добавление пустышек
    scn = bpy.context.scene
    empties = []
    nEmpties = len(periods)
    for n in range(nEmpties):
        empty = bpy.data.objects.new('Empty_%d' % n, None)
        scn.objects.link(empty)
        empties.append(empty)
    # Назначение каждой пустышке родителя последовательно
    for n in range(1, nEmpties):
        empties[n].parent = empties[n-1]
        empties[n].location = (0, radii[n-1], 0)
    # Вставка двух ключевых кадров для каждой пустышки
    for n in range(nEmpties):
        empty = empties[n]
        empty.keyframe_insert(
            'rotation_euler',
            index=axes[n],
            frame=0,
            group=empty.name)
        empty.keyframe_insert(
            'rotation_euler',
            index=axes[n],
            frame=periods[n],
            group=empty.name)
        fcu = empty.animation_data.action.fcurves[0]
        print(empty, fcu.data_path, fcu.array_index)
    kp0 = fcu.keyframe_points[0]
    kp0.co = (0, phases[n])
    kp0.interpolation = 'LINEAR'
    kp1 = fcu.keyframe_points[1]
    kp1.co = (250.0/periods[n], 2*pi + phases[n])
    kp1.interpolation = 'LINEAR'
    fcu.extrapolation = 'LINEAR'
    last = empties[nEmpties-1]
    bpy.ops.mesh.primitive_ico_sphere_add(
        size = 0.2,
        location=last.location)
    ob = bpy.context.object
    ob.parent = last
    empties[0].location = origin
    return 
def run(origin):
    createEpiCycle(origin)
    bpy.ops.object.paths_calculate()
    return 
if __name__ == "__main__":
    run((0,0,0))
    bpy.ops.screen.animation_play(reverse=False, sync=False)

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


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