Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода [Thomas Larsson] (fb2) читать постранично, страница - 3
- Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода 7.17 Мб, 118с. скачать: (fb2) - (исправленную) читать: (полностью) - (постранично) - Thomas Larsson
[Настройки текста] [Cбросить фильтры]
- 1
- 2
- 3
- 4
- 5
- . . .
- последняя (38) »
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))
#--------------------------------------------------- # 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',
# Добавление ключа 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))
Арматуры
Арматура
Эта программа создаёт арматуру.#--------------------------------------------------- # 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',
- 1
- 2
- 3
- 4
- 5
- . . .
- последняя (38) »
Последние комментарии
32 минут 23 секунд назад
9 часов 1 минута назад
9 часов 14 минут назад
9 часов 48 минут назад
10 часов 20 минут назад
1 день 1 час назад