- 1
- 2
- 3
- 4
- . . .
- последняя (29) »
уже иметь некоторый опыт программирования на Питоне для Блендера. Эти заметки отлично подходят на случай, если, например, вам нужно быстро подглядеть, какой конкретно метод отвечает за добавление кости в арматуру и какой у него синтаксис, но при этом вы уже имеете общее представление об этом или уже писали такую программу для Блендера 2.4.
Для новичков же моя рекомендация такова: Если вы до этого вообще не сталкивались с этим языком и не писали программ на Питоне, желательно сначала изучить сам язык (в сети достаточно отличных учебников) хотя бы на минимальном уровне (синтаксис, ключевые слова, основные встроенные функции, импорт модулей и т.п.). Когда у вас уже появится представление о программировании на Питоне, рекомендую прочитать книгу Написание скриптов для Blender 2.49 (в оригинале Blender 2.49 Scripting), автор Michel Anders, которую я недавно перевёл. В ней, в отличие от этих заметок, подробно рассказывается о почти каждом аспекте программирования для Блендера, тщательно объясняется назначение большинства строк во всех многочисленных программах-примерах.
Когда вы почувствуете, что ваш уровень в программировании для Блендера приподнялся над отметкой "новичок", тогда эти заметки смогут оказать вам реальную помощь при переходе к использованию API Блендера 2.5.
#---------------------------------------------------------- # File meshes.py #---------------------------------------------------------- import bpy
def createMesh(name, origin, verts, edges, faces): # Создание меша и объекта me = bpy.data.meshes.new(name+'Mesh') ob = bpy.data.objects.new(name, me) ob.location = origin ob.show_name = True # Привязка объекта к сцене bpy.context.scene.objects.link(ob)
# Создание меша из передаваемых списков вершин, рёбер, граней. # Или рёбра или грани должны быть [], иначе Вам нужны проблемы me.from_pydata(verts, edges, faces)
# Обновляет меш с новыми данными me.update(calc_edges=True) return ob
def run(origin): (x,y,z) = (0.707107, 0.258819, 0.965926) verts1 = ((x,x,-1), (x,-x,-1), (-x,-x,-1), (-x,x,-1), (0,0,1)) faces1 = ((1,0,4), (4,2,1), (4,3,2), (4,0,3), (0,1,2,3)) ob1 = createMesh('Solid', origin, verts1, [], faces1) verts2 = ((x,x,0), (y,-z,0), (-z,y,0)) edges2 = ((1,0), (1,2), (2,0)) ob2 = createMesh('Edgy', origin, verts2, edges2, [])
# Сдвигает второй объект с дороги ob1.select = False ob2.select = True bpy.ops.transform.translate(value=(0,2,0))
return if __name__ == "__main__": run((0,0,0))
#---------------------------------------------------------- # File shapekey.py #---------------------------------------------------------- import bpy, random
def run(origin): # Добавление UV-сферы bpy.ops.mesh.primitive_uv_sphere_add( segments=6, ring_count=5, size=1, location=origin) ob = bpy.context.object ob.name = 'ShapeKeyObject' ob.show_name = True
# Создаёт левую (Left) и правую (Right) группы вершин left = ob.vertex_groups.new('Left') right = ob.vertex_groups.new('Right') for v in ob.data.vertices: if v.co[0] > 0.001: left.add([v.index], 1.0, 'REPLACE') elif v.co[0] < -0.001: right.add([v.index], 1.0, 'REPLACE') else: left.add([v.index], 0.5, 'REPLACE') right.add([v.index], 0.5, 'REPLACE')
# Добавление ключа Basis (базовый) bpy.ops.object.shape_key_add(None) basis = ob.active_shape_key
# Добавление ключа FrontForward: # передние вершины сдвигаются на единицу вперёд # Пределы изменения (Slider) от -1.0 до +2.0 bpy.ops.object.shape_key_add(None) frontFwd = ob.active_shape_key frontFwd.name = 'FrontForward' frontFwd.slider_min = -1.0 frontFwd.slider_max = 2.0 for v in [19, 20, 23, 24]: pt = frontFwd.data[v].co pt[1] = pt[1] - 1
# Добавление ключей TopUp: верхние вершины перемещаются на единицу вверх. # TopUp_L и TopUp_R влияют только на левые и правые половины, соответственно keylist = [(None, ''), ('Left', '_L'), ('Right', '_R')] for (vgrp, suffix) in keylist: bpy.ops.object.shape_key_add(None) topUp = ob.active_shape_key topUp.name = 'TopUp' + suffix if vgrp: topUp.vertex_group = vgrp for v in [0, 1, 9, 10, 17, 18, 25]: pt = topUp.data[v].co pt[2] = pt[2] + 1
# Установка позы ключам формы for shape in ob.data.shape_keys.key_blocks: shape.value = random.random() return
if __name__ == "__main__": # Создание пяти объектов с произвольными ключами формы for j in range(5): run((3*j,0,0))
#---------------------------------------------------------- # File chain.py # Creates an array modifier and applies it# Update to API rev. 36523 #---------------------------------------------------------- import bpy import math from math import pi
def run(origin): # Добавление единственного звена цепи к сцене bpy.ops.mesh.primitive_torus_add( #major_radius=1, #minor_radius=0.25, major_segments=12, minor_segments=8, use_abso=True, abso_major_rad=1, abso_minor_rad=0.6, location=(0,0,0), rotation=(0,0,0))
# Масштабирование тора вдоль оси x ob = bpy.context.object ob.scale = (0.7, 1, 1) bpy.ops.object.transform_apply(scale=True)
# Создание пустышки bpy.ops.object.add( type='EMPTY', 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))
Для новичков же моя рекомендация такова: Если вы до этого вообще не сталкивались с этим языком и не писали программ на Питоне, желательно сначала изучить сам язык (в сети достаточно отличных учебников) хотя бы на минимальном уровне (синтаксис, ключевые слова, основные встроенные функции, импорт модулей и т.п.). Когда у вас уже появится представление о программировании на Питоне, рекомендую прочитать книгу Написание скриптов для Blender 2.49 (в оригинале Blender 2.49 Scripting), автор Michel Anders, которую я недавно перевёл. В ней, в отличие от этих заметок, подробно рассказывается о почти каждом аспекте программирования для Блендера, тщательно объясняется назначение большинства строк во всех многочисленных программах-примерах.
Когда вы почувствуете, что ваш уровень в программировании для Блендера приподнялся над отметкой "новичок", тогда эти заметки смогут оказать вам реальную помощь при переходе к использованию API Блендера 2.5.
Меши
Меш
Эта программа создает два меша. Первый — закрытая пирамида, как с треугольными, так и с четырёхугольными гранями. Второй — проволочный треугольник. Имена обоих мешей отображаются. Треугольник сдвигается вбок, так чтобы его можно было увидеть рядом с пирамидой. Для этого требуется его выбрать.#---------------------------------------------------------- # File meshes.py #---------------------------------------------------------- import bpy
def createMesh(name, origin, verts, edges, faces): # Создание меша и объекта me = bpy.data.meshes.new(name+'Mesh') ob = bpy.data.objects.new(name, me) ob.location = origin ob.show_name = True # Привязка объекта к сцене bpy.context.scene.objects.link(ob)
# Создание меша из передаваемых списков вершин, рёбер, граней. # Или рёбра или грани должны быть [], иначе Вам нужны проблемы me.from_pydata(verts, edges, faces)
# Обновляет меш с новыми данными me.update(calc_edges=True) return ob
def run(origin): (x,y,z) = (0.707107, 0.258819, 0.965926) verts1 = ((x,x,-1), (x,-x,-1), (-x,-x,-1), (-x,x,-1), (0,0,1)) faces1 = ((1,0,4), (4,2,1), (4,3,2), (4,0,3), (0,1,2,3)) ob1 = createMesh('Solid', origin, verts1, [], faces1) verts2 = ((x,x,0), (y,-z,0), (-z,y,0)) edges2 = ((1,0), (1,2), (2,0)) ob2 = createMesh('Edgy', origin, verts2, edges2, [])
# Сдвигает второй объект с дороги ob1.select = False ob2.select = True bpy.ops.transform.translate(value=(0,2,0))
return if __name__ == "__main__": run((0,0,0))
Группы вершин и ключи формы
Эта программа добавляет UV-сферу с двумя группами вершин (Left И Right) и четырьмя ключами формы.#---------------------------------------------------------- # File shapekey.py #---------------------------------------------------------- import bpy, random
def run(origin): # Добавление UV-сферы bpy.ops.mesh.primitive_uv_sphere_add( segments=6, ring_count=5, size=1, location=origin) ob = bpy.context.object ob.name = 'ShapeKeyObject' ob.show_name = True
# Создаёт левую (Left) и правую (Right) группы вершин left = ob.vertex_groups.new('Left') right = ob.vertex_groups.new('Right') for v in ob.data.vertices: if v.co[0] > 0.001: left.add([v.index], 1.0, 'REPLACE') elif v.co[0] < -0.001: right.add([v.index], 1.0, 'REPLACE') else: left.add([v.index], 0.5, 'REPLACE') right.add([v.index], 0.5, 'REPLACE')
# Добавление ключа Basis (базовый) bpy.ops.object.shape_key_add(None) basis = ob.active_shape_key
# Добавление ключа FrontForward: # передние вершины сдвигаются на единицу вперёд # Пределы изменения (Slider) от -1.0 до +2.0 bpy.ops.object.shape_key_add(None) frontFwd = ob.active_shape_key frontFwd.name = 'FrontForward' frontFwd.slider_min = -1.0 frontFwd.slider_max = 2.0 for v in [19, 20, 23, 24]: pt = frontFwd.data[v].co pt[1] = pt[1] - 1
# Добавление ключей TopUp: верхние вершины перемещаются на единицу вверх. # TopUp_L и TopUp_R влияют только на левые и правые половины, соответственно keylist = [(None, ''), ('Left', '_L'), ('Right', '_R')] for (vgrp, suffix) in keylist: bpy.ops.object.shape_key_add(None) topUp = ob.active_shape_key topUp.name = 'TopUp' + suffix if vgrp: topUp.vertex_group = vgrp for v in [0, 1, 9, 10, 17, 18, 25]: pt = topUp.data[v].co pt[2] = pt[2] + 1
# Установка позы ключам формы for shape in ob.data.shape_keys.key_blocks: shape.value = random.random() return
if __name__ == "__main__": # Создание пяти объектов с произвольными ключами формы for j in range(5): run((3*j,0,0))
Применение модификатора массива (array)
Эта программа создает цепь из десяти звеньев. Звено является простым тором, масштабированным вдоль оси x. Мы добавляем звену модификатор массива, где смещение управляется пустышкой (empty). Наконец, модификатор массива применяется (apply), создавая из цепи единственный меш.#---------------------------------------------------------- # File chain.py # Creates an array modifier and applies it# Update to API rev. 36523 #---------------------------------------------------------- import bpy import math from math import pi
def run(origin): # Добавление единственного звена цепи к сцене bpy.ops.mesh.primitive_torus_add( #major_radius=1, #minor_radius=0.25, major_segments=12, minor_segments=8, use_abso=True, abso_major_rad=1, abso_minor_rad=0.6, location=(0,0,0), rotation=(0,0,0))
# Масштабирование тора вдоль оси x ob = bpy.context.object ob.scale = (0.7, 1, 1) bpy.ops.object.transform_apply(scale=True)
# Создание пустышки bpy.ops.object.add( type='EMPTY', 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))
Арматуры
Арматура
Эта- 1
- 2
- 3
- 4
- . . .
- последняя (29) »