2011-08-20 9 views
1

Je veux déplacer un os dans Blender 2.5 avec le script suivantComment convertir les coordonnées globales en locales dans blender 2.5?

bpy.context.object.pose.bones['hand_ik.L'].location=(X1,Y1,Z1) 

mais j'ai mondial (X2, Y2, Z2). Comment puis-je convertir X2, Y2, Z2 (avec des manipulations de la matrice) à la X1 correspondant, Y1, Z1

Je veux obtenir le même mouvement que

bpy.ops.transform.translate(value=(X2,Y2,Z2),const raint_orientation='GLOBAL') 

Je trouve que le code suivant i peut déplacer un os sans parent

ob = bpy.context.object 
globalVector = Vector((1.0, 0.0, 0.0)) 
mw = bpy.data.armatures['Armature'].bones['hand_IK.R'].matrix.copy() 
bpy.context.object.pose.bones['hand_IK.R'].location = mw.inverted()*globalVector 

Mais que faire lorsqu'un os a un parent et n'est pas connecté?

Thanx

Répondre

1

il y a quelques semaines, l'accès en écriture à PoseBose.matrix (La matrice Induit-Space de l'os) a été accordée à l'API python. Si vous utilisez 2,59 ou le dernier tronc, vous pouvez utiliser quelque chose comme ce code:

from mathutils import Matrix 

ob = bpy.context.object 
globalVector = Vector((1.0, 0.0, 0.0)) 
mw = bpy.data.armatures['Armature'].bones['hand_IK.R'].matrix.copy() 
obGlobal = ob.matrix_world 
bpy.context.object.pose.bones['hand_IK.R'].matrix = ob.matrix_world.inverted()*(Matrix.Translation(globalVector)+mw.to_3x3().to_4x4()) 

la conversion à une dimension de 3, puis revenir à 4 efface la traduction originale, puis vous ajoutez dans votre globalVector et inversez le tout pour prendre en compte la matrice globale de l'objet. Pour de bons exemples de code de manipulation d'os, regardez mon Addon Blender pour Motion Capture, Here, à la fonction bakeTransform dans retargetEndUser.

Questions connexes