Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода
Шрифт:
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))
Режим редактирования против режима позы
Атрибуты костей, которые влияют на изначальную позу арматуры (голова, хвост, поворот, родитель, использование соединения, и т.п.), доступны только в режиме редактирования (использование кости в ob.data.edit bones), тогда как атрибуты, которые применяются при позировании, требуют, чтобы арматура была в режиме позы (использование кости в ob.pose.bones). Насколько я знаю, единственный способ переключаться между режимами редактирования и позы — с помощью вызова операторов
Поделиться с друзьями: