Как преобразовать глобальные в локальные координаты в Blender 2.5? - PullRequest
1 голос
/ 20 августа 2011

Я хочу переместить кость в Blender 2.5 с помощью следующего скрипта

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

, но у меня есть глобальный (X2, Y2, Z2).Как я могу преобразовать X2, Y2, Z2 (с матричными манипуляциями) в соответствующие X1, Y1, Z1

Я хочу добиться того же движения, что и

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

Я обнаружил, что сследующий код я могу переместить кость без родителей

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 

Но что делать, если кость имеет родителя и не подключена?

Thanx

1 Ответ

1 голос
/ 14 сентября 2011

Несколько недель назад доступ к записи PoseBose.matrix (матрица костей Armature-Space) был предоставлен API-интерфейсу python.Если вы используете 2.59 или последний ствол, вы можете использовать что-то вроде этого кода:

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())

преобразование в измерение 3, а затем обратно в 4 очищает исходный перевод, а затем вы добавляете вваш globalVector и инвертировать все это, чтобы принять во внимание глобальную матрицу объекта.

Для хороших примеров кода для манипуляции с костями, посмотрите мой аддон Blender для захвата движения, Здесь , на функцию bakeTransformв retargetEndUser.

...