Hi. I am new to python but i have been using C, C++ & C# for years.
I am trying to create and importer for proprietary models and animation (Game engine) so i have been trying out some code
#---------------------------------------------------
# File armature.py
#---------------------------------------------------
import bpy, math
from mathutils import Vector, Matrix, Euler
def createRig(name, origin, boneTable):
# Create armature and object
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
# Create bones
bpy.ops.object.mode_set(mode='EDIT')
for (bname, pname, vector) in boneTable:
bone = amt.edit_bones.new(bname)
#vector = (vector[0],vector[2],vector[1])
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)
# rtt = Matrix.Rotation(0,radians(90),0)
rot = Matrix.Translation((0,0,0)) # identity matrix
#bone.tail = rot * Vector(vector) + bone.head
bone.tail = Vector(vector) + 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')
for (bname, angle) in poseTable:
pbone = ob.pose.bones[bname] #errrorrrr
# Set rotation mode to Euler XYZ, easier to understand
# than default quaternions
pbone.rotation_mode = 'XYZ'
# Documentation bug: Euler.rotate(angle,axis):
# axis in ['x','y','z'] and not ['X','Y','Z']
pbone.rotation_euler = Euler((angle),'XYZ')
bpy.ops.object.mode_set(mode='OBJECT')
def run(origo):
origin = Vector(origo)
# Table of bones in the form (bone, parent, vector)
# The vector is given in local coordinates
boneTable1 = [
('root_main',None, (0.000000, 0.000000, 0.000000)),
('sk_root_hip','root_main', (0.000000, 1.096121, 0.000000)),
('dsk_hip','sk_root_hip', (0.105644, 0.000000, 0.000000)),
('sk_thigh_l','dsk_hip', (-0.019242, 0.075753, 0.090000)),
('sk_leg_l','sk_thigh_l', (0.421257, 0.000000, 0.000000)),
('sk_foot_l','sk_leg_l', (0.441786, 0.000000, 0.000000)),
('heel_l','sk_foot_l', (0.016031, -0.107840, 0.000000)),
('toe_l','heel_l', (0.000000, 0.000000, 0.161595)),
('sk_thigh_r','dsk_hip', (-0.019242, 0.075753, -0.090000)),
('sk_leg_r','sk_thigh_r', (0.421257, 0.000000, 0.000000)),
('sk_foot_r','sk_leg_r', (0.441786, 0.000000, 0.000000)),
('heel_r','sk_foot_r', (0.016031, -0.107819, -0.002140)),
('toe_r','heel_r', (0.000000, 0.000000, 0.161594)),
('sk_belly','sk_root_hip', (-0.000001, 0.000000, 0.000000)),
('sk_chest','sk_belly', (0.167222, 0.000000, 0.000000)),
('sk_neck','sk_chest', (0.269976, 0.003474, -0.000001)),
('sk_head','sk_neck', (0.110000, 0.000000, 0.000000)),
('sk_shoulder_l','sk_chest', (0.205214, -0.002096, -0.105080)),
('sk_upperarm_l','sk_shoulder_l', (0.089920, 0.000000, 0.000000)),
('sk_forearm_l','sk_upperarm_l', (0.290000, 0.000000, 0.000000)),
('sk_hand_l','sk_forearm_l', (0.290000, 0.000000, 0.000000)),
('finger_l','sk_hand_l', (0.125097, 0.001092, 0.000000)),
('sk_shoulder_r','sk_chest', (0.205216, -0.002096, 0.105082)),
('sk_upperarm_r','sk_shoulder_r', (0.089920, 0.000000, 0.000000)),
('sk_forearm_r','sk_upperarm_r', (0.290000, 0.000000, 0.000000)),
('sk_hand_r','sk_forearm_r', (0.290001, 0.000000, 0.000000)),
('finger_r','sk_hand_r', (0.125091, 0.001092, 0.000000))
]
bent = createRig('Bent', origin, boneTable1)
# Pose first rig
poseTable1 = [
('root_main',(0.000000, 0.000000, 0.000000)),
('sk_root_hip',(0.000000, -90.000000, -100.003000)),
('dsk_hip',(0.000000, -180.000000, 0.000000)),
('sk_thigh_l',(0.001984, 179.988700, 14.785900)),
('sk_leg_l',(0.002106, 0.022232, -10.845950)),
('sk_foot_l',(0.000900, -0.010864, 65.306980)),
('heel_l',(-30.756070, 90.000000, 0.000000)),
('toe_l',(0.000000, 0.000000, 0.000000)),
('sk_thigh_r',(-0.001984, -179.988700, 14.785890)),
('sk_leg_r',(-0.002106, -0.022217, -10.845950)),
('sk_foot_r',(-0.475952, -1.022339, 65.311250)),
('heel_r',(-30.749390, 89.323330, 1.323273)),
('toe_r',(0.000015, -0.000015, 0.000000)),
('sk_belly',(0.000000, 0.000000, -174.728500)),
('sk_chest',(0.000000, -0.000488, -0.184631)),
('sk_neck',(0.000000, 0.000504, -6.018188)),
('sk_head',(0.000000, 0.000000, 10.934170)),
('sk_shoulder_l',(4.916138, -89.999510, -180.000000)),
('sk_upperarm_l',(0.000000, -0.000015, -5.500000)),
('sk_forearm_l',(-0.000015, 0.000076, 15.000000)),
('sk_hand_l',(0.000000, -0.000046, -10.000000)),
('finger_l',(0.000000, 0.000000, 0.000000)),
('sk_shoulder_r',(-4.916138, 90.000490, -179.999800)),
('sk_upperarm_r',(0.000000, 0.000031, -5.500244)),
('sk_forearm_r',(0.000000, -0.000076, 15.000000)),
('sk_hand_r',(0.000015, 0.000061, -10.000000)),
('finger_r',(0.000000, 0.000000, 0.000000))
]
poseRig(bent, poseTable1)
if __name__ == "__main__":
run((0,0,0))
I wrote the above code based on one of the examples in the wiki but for some strange reason this line give me an error
pbone = ob.pose.bones[bname]
I am a bit confused. what did i do wrong?