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

Арматура

Арматура

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


#---------------------------------------------------
# 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))

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


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