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에 관련된 개념을 잡는게 어려울 수 있다. 이와 관련해 도움이 될만한 그림이 있어 가져왔다.
'연구 > Blender' 카테고리의 다른 글
[Blender] Faceit : Facial Expressions And Performance Capture 살펴보기 (6) | 2024.03.12 |
---|---|
[Blender] Armature(뼈대)에 Mesh 연결하기 (0) | 2024.02.27 |
[Blender] blender에서 skeleton joint orientation 구하기 (0) | 2024.02.16 |
[Blender] blender에서 skeleton bone position 구하기 (0) | 2024.01.29 |
[Blender] viewport에서 시점 변경 python script로 구현하기 (0) | 2024.01.18 |