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

Шрифт
Интервал


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

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

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

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


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.