Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 4

стр.

>

>        location=(0,1.2,0.2),

>        rotation=(pi/2, pi/4, pi/2))

>    empty = bpy.context.object


>    # Звено цепи снова делается активным

>    scn = bpy.context.scene

>    scn.objects.active = ob


>    # Добавление модификатора

>    mod = ob.modifiers.new('Chain', 'ARRAY')

>    mod.fit_type = 'FIXED_COUNT'

>    mod.count = 10

>    mod.use_relative_offset = 0

>    mod.use_object_offset = True

>    mod.offset_object = empty


>    # Применение модификатора

>    bpy.ops.object.visual_transform_apply()

>    bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Chain')


>    # Перемещение цепи на место

>    bpy.ops.transform.translate(value=origin)


>    # Пустышка больше не нужна

>    scn.objects.unlink(empty)

>    del(empty)


>    return


>if __name__ == "__main__":

>    run((0,3,0))


Арматуры

Арматура

Эта программа создаёт арматуру.



>#---------------------------------------------------

># File armature.py

>#---------------------------------------------------

>import bpy, math

>from mathutils >import Vector, Matrix


>def createRig(name, origin, boneTable):

>    # Создание арматуры и объекта

>    bpy.ops.object.add(

>        type='ARMATURE',

>        enter_editmode=True,

>        location=origin)

>    ob = bpy.context.object

>    ob.show_x_ray = True

>    ob.name = name

>    amt = ob.data

>    amt.name = name+'Amt'

>    amt.show_axes = True


>    # Создание костей

>    bpy.ops.object.mode_set(mode='EDIT')

>    for (bname, pname, vector) in boneTable:

>        bone = amt.edit_bones.new(bname)

>        if pname:

>            parent = amt.edit_bones[pname]

>            bone.parent = parent

>            bone.head = parent.tail

>            bone.use_connect = False

>            (trans, rot, scale) = parent.matrix.decompose()

>        else:

>            bone.head = (0,0,0)

>            rot = Matrix.Translation((0,0,0))> # Матрица идентичности

>        bone.tail = Vector(vector) * rot + bone.head

>    bpy.ops.object.mode_set(mode='OBJECT')

>    return ob


>def poseRig(ob, poseTable):

>    bpy.context.scene.objects.active = ob

>    bpy.ops.object.mode_set(mode='POSE')

>    deg2rad = 2*math.pi/360


>    for (bname, axis, angle) in poseTable:

>        pbone = ob.pose.bones[bname]

>        # Установка режима вращения в Euler XYZ (Эйлерово),

>        # легче для понимания, чем кватернионы по-умолчанию

>        pbone.rotation_mode = 'XYZ'

>        # Косяк в документации: Euler.rotate(angle,axis):

>        # оси в ['x','y','z'] а не ['X','Y','Z']

>        pbone.rotation_euler.rotate_axis(axis, angle*deg2rad)

>    bpy.ops.object.mode_set(mode='OBJECT')

>    return


>def run(origo):

>    origin = Vector(origo)

>    # Таблица костей в форме (кость, родитель, вектор)

>    # Вектор дан в локальных координатах

>    boneTable1 = [

>        ('Base', None, (1,0,0)),

>        ('Mid', 'Base', (1,0,0)),

>        ('Tip', 'Mid', (0,0,1))

>    ]

>    bent = createRig('Bent', origin, boneTable1)


>    # Вторая оснастка является прямой линией, то есть кости проходят вдоль локальной оси Y

>    boneTable2 = [

>        ('Base', None, (1,0,0)),

>        ('Mid', 'Base', (0,0.5,0)),

>        ('Mid2', 'Mid', (0,0.5,0)),

>        ('Tip', 'Mid2', (0,1,0))

>    ]

>    straight = createRig('Straight', origin+Vector((0,2,0)), boneTable2)


>    # Поза второй остнастки

>    poseTable2 = [

>        ('Base', 'X', 90),

>        ('Mid2', 'Z', 45),

>        ('Tip', 'Y', -45)

>    ]

>    poseRig(straight, poseTable2)


>    # Поза первой остнастки

>    poseTable1 = [

>        ('Tip', 'Y', 45),

>        ('Mid', 'Y', 45),

>        ('Base', 'Y', 45)

>    ]

>    poseRig(bent, poseTable1)

>    return


>if __name__ == "__main__":

>    run((0,5,0))


Меш с оснасткой

Эта программа добавляет арматуру и меш. Арматура имеет три кости (Base (базовая), Mid (средняя), Tip (конечная)) и ограничения:

1. Ограничение IK Mid -> Tip.

2. Ограничение Stretch To Mid -> Tip.

3. Ограничение Copy Rotation Base -> Tip.

Меш деформируется арматурой. Следовательно, создаются модификатор арматуры и соответствующие группы вершин.



>#----------------------------------------------------------

># File rigged_mesh.py

>#----------------------------------------------------------

>import bpy, mathutils


>def createArmature(origin):

>    # Создание арматуры и объекта