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

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

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

Эта программа добавляет арматуру и меш. Арматура имеет три кости (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):
    # Создание арматуры и объекта
    amt = bpy.data.armatures.new('MyRigData')
    rig = bpy.data.objects.new('MyRig', amt)
    rig.location = origin
    rig.show_x_ray = True amt.show_names = True
    # Привязка объекта к сцене
    scn = bpy.context.scene
    scn.objects.link(rig)
    scn.objects.active = rig scn.update()
    # Создание костей
#next two lines by PKHG SVN 36504 W32
    bpy.ops.object.editmode_toggle()
# bpy.ops.object.mode_set(mode='EDIT')
#original does not work??!! bpy.ops.object.mode_set(mode='EDIT')
    base = amt.edit_bones.new('Base')
    base.head = (0,0,0)
    base.tail = (0,0,1)
    mid = amt.edit_bones.new('Mid')
    mid.head = (0,0,1)
    mid.tail = (0,0,2)
    mid.parent = base
    mid.use_connect = True
    tip = amt.edit_bones.new('Tip')
    tip.head = (0,0,2)
    tip.tail = (0,0,3)
    # Ограничения костей. Арматура должна быть в режиме позы.
    bpy.ops.object.mode_set(mode='POSE')
    # Ограничение IK Mid -> Tip
    pMid = rig.pose.bones['Mid']
    cns1 = pMid.constraints.new('IK')
    cns1.name = 'Ik'
    cns1.target = rig
    cns1.subtarget = 'Tip'
    cns1.chain_count = 1
    # Ограничение StretchTo Mid -> Tip с влиянием 0.5
    cns2 = pMid.constraints.new('STRETCH_TO')
    cns2.name = 'Stretchy'
    cns2.target = rig
    cns2.subtarget = 'Tip'
    cns2.influence = 0.5
    cns2.keep_axis = 'PLANE_X'
    cns2.volume = 'VOLUME_XZX'
    # Ограничение Copy rotation Base -> Tip
    pBase = rig.pose.bones['Base']
    cns3 = pBase.constraints.new('COPY_ROTATION')
    cns3.name = 'Copy_Rotation'
    cns3.target = rig
    cns3.subtarget = 'Tip'
    cns3.owner_space = 'WORLD'
    cns3.target_space = 'WORLD'
    bpy.ops.object.mode_set(mode='OBJECT')
    return rig
def createMesh(origin):
    # Создание меша и объекта
    me = bpy.data.meshes.new('Mesh')
    ob = bpy.data.objects.new('MeshObject', me)
    ob.location = origin
    # Привязка объекта к сцене
    scn = bpy.context.scene
    scn.objects.link(ob)
    scn.objects.active = ob
    scn.update()
    # Список координат вершин.
    verts = [
        (0.5, 0.5,0), (0.5,-0.5,0), (-0.5,-0.5,0), (-0.5,0.5,0),
        (0.5,0.5,1), (0.5,-0.5,1), (-0.5,-0.5,1), (-0.5,0.5,1),
        (-0.5,0.5,2), (-0.5,-0.5,2), (0.5,-0.5,2), (0.5,0.5,2),
        (0.5,0.5,3), (0.5,-0.5,3), (-0.5,-0.5,3), (-0.5, 0.5,3)
    ]
    # Список граней.
    faces = [
        (0, 1, 2, 3),
        (0, 4, 5, 1),
        (1, 5, 6, 2),
        (2, 6, 7, 3),
        (4, 0, 3, 7),
        (4, 7, 8, 11),
        (7, 6, 9, 8),
        (6, 5, 10, 9),
        (5, 4, 11, 10),
        (10, 11, 12, 13),
        (9, 10, 13, 14),
        (8, 9, 14, 15),
        (11, 8, 15, 12),
        (12, 15, 14, 13)
    ]
    # Создание меша из передаваемых списков вершин, рёбер, граней.
    # Или рёбра или грани должны быть [], иначе Вам нужны проблемы
    me.from_pydata(verts, [], faces)
    # Обновление меша с новыми данными
    me.update(calc_edges=True)
    return ob
def skinMesh(ob, rig):
    # Списки вершин в группах, в форме (вершина, вес)
    vgroups = {}
    vgroups['Base'] = [
        (0, 1.0), (1, 1.0), (2, 1.0), (3, 1.0),
        (4, 0.5), (5, 0.5), (6, 0.5), (7, 0.5)]
    vgroups['Mid'] = [
        (4, 0.5), (5, 0.5), (6, 0.5), (7, 0.5),
        (8, 1.0), (9, 1.0), (10, 1.0), (11, 1.0)]
    vgroups['Tip'] = [(12, 1.0), (13, 1.0), (14, 1.0), (15, 1.0)]
    # Создание групп вершин и добавление вершин и весов
    # Первый аргумент в назначении — список, чтобы можно
    # было назначать несколько вершин сразу
    for name in vgroups.keys():
        grp = ob.vertex_groups.new(name)
        for (v, w) in vgroups[name]:
            grp.add([v], w, 'REPLACE')
    # Добавление меш-объекту модификатора арматуры, с использованием
    # групп вершин, а не envelopes
    mod = ob.modifiers.new('MyRigModif', 'ARMATURE')
    mod.object = rig mod.use_bone_envelopes = False
    mod.use_vertex_groups = True
    return
def run(origin):
    rig = createArmature(origin)
    ob = createMesh(origin)
    skinMesh(ob, rig)
    # Перемещение и вращение кости Tip в режиме позы
    bpy.context.scene.objects.active = rig
    bpy.ops.object.mode_set(mode='POSE')
    ptip = rig.pose.bones['Tip']
    ptip.location = (0.2,-0.5,0)
    rotMatrix = mathutils.Matrix.Rotation(0.6, 3, 'X')
    ptip.rotation_quaternion = rotMatrix.to_quaternion()
    return
if __name__ == "__main__":
    run((0,0,0))

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


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