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', (0,0.5,0)),
('Mid2', 'Mid', (0,0.5,0)),
('Tip', 'Mid2', (0,1,0))
]
straight = createRig('Straight', origin+Vector((0,2,0)), boneTable2)
# Поза второй остнастки
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. Ограничение
2. Ограничение
3. Ограничение
Меш деформируется арматурой. Следовательно, создаются модификатор арматуры и соответствующие группы вершин.
#----------------------------------------------------------
# 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)