Super Kawaii Cute Cat Kaoani [Blender] matrix, matrix_basis, matrix_local, matrix_world관계

연구/Blender

[Blender] matrix, matrix_basis, matrix_local, matrix_world관계

치킨고양이짱아 2024. 2. 19. 19:14
728x90
728x90

blender에서는 다양한 종류의 matrix를 사용하고 있다. Posebone.matrix, Posebone.matrix_basis, bone.matrix_local...등 다양한 종류의 matrix가 등장하는데..각각의 의미와 이들간의 관계에 대해서 알아보자.

  • Posebone.matrix: armature space에서의 bone의 transformation을 의미한다. 만약 object가 rest pose를 취하고 있다면 Posebone.matrix의 값은 bone.matrix_local의 값과 동일하다.
  • Posebone.matrix_basis: bone space(rest pose에 대해 표현한다는 의미)에 대한 bone의 transformation 값을 담고 있다.
  • bone.matrix_local: armature space에서의 bone의 rest pose transformation을 담고 있다.
  • object.matrix_world: world space에서 armature space의 transformation. global orientation을 구하고 싶을 때 armature space 상에서의 orientation을 구하고 앞쪽에 matrix_world 값을 곱해주면 된다.

위의 값들은 다음 식을 만족하게 된다.

obj = bpy.data.objects['원하는 오브젝트 이름']
pb = obj.pose.bones['원하는 posebone이름']
parent = pb.parent
(parent.bone.matrix_local.inverted() @ pb.bone.matrix_local).inverted() @ (parent.matrix.inverted() @ pb.matrix) = pb.matrix_basis

가 성립한다.

식을 뜯어서 살펴보면

1) parent.bone.matrix_local.inverted() @ pb.bone.matrix_local

: 이 부분은 armature space에 대해 표현된 parent bone의 rest pose transformation의 inverse를 bone의 rest pose transformation에 곱해주고 있다. 이 결과로 나오는 값은 해당 parent bone에 대해 표현된 해당 bone의 rest pose transformation이다.

2) parent.matrix.inverted() @ pb.matrix

이 부분은 armature space에 대해 표현된 bone의 transformation의 inverse를 bone의 pose transformation에 곱해주고 있다. 이 결과로 나오는 값은 parent bone에 대해 표현된 해당 bone의 pose transformation이다.

3) (parent.bone.matrix_local.inverted() @ pb.bone.matrix_local).inverted() @ (parent.matrix.inverted() @ pb.matrix

parent bone에 대해 표현된 해당 bone의 rest pose transformation의 inverse를 parent bone에 대해 표현된 해당 bone의 pose transformation에 곱해주고 있다. 이 결과로 나오는 값은 rest pose에 대해 표현된 해당 bone의 transformation이다. 즉 pose space에서 표현된 pose transformation이다.


+++참고

space에 관련된 개념을 잡는게 어려울 수 있다. 이와 관련해 도움이 될만한 그림이 있어 가져왔다.

출처: https://blender.stackexchange.com/questions/44637/how-can-i-manually-calculate-bpy-types-posebone-matrix-using-blenders-python-ap/121495#121495

 

How can I manually calculate bpy.types.PoseBone.matrix using Blender's Python API?

I have this .blend file which has a simple scene, and a python script. There's a readme section in the script, but to give a general idea: There are two identical meshes in the scene, one skinned, ...

blender.stackexchange.com

728x90
728x90