Введение в написание скриптов на Питоне для Блендера 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)
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.