Super Kawaii Cute Cat Kaoani Blender bvh load 관련 알아낸 사실 정리

연구/Blender

Blender bvh load 관련 알아낸 사실 정리

치킨고양이짱아 2023. 3. 20. 16:58
728x90
728x90

File > import > bvh 를 하면 bvh가 import 된다. 

import 된 모션 데이터를 확인하기 위해서는

bpy.data.actions에서 해당되는 인덱스의 action을 뽑아와야한다.

 

나의 경우 'aiming1_subject1.bvh'를 import 했기 때문에

action = bpy.data.actions['aiming1_subject1']

을 하면 내가 import한 bvh의 motion data가 action이라는 변수에 저장되게 된다.

 

action은 여러 정보들로 구성되어있는데 내가 원하는 정보는

매 frame마다 root의 position이 어디에 위치하는지, 그리고 각 관절의 rotation 값은 어떻게 되는지였다. 이를 알기 위해서는 뽑아낸 action에서 fcurves 값을 살펴보면 된다.

>>> fc = action.fcurves
>>> len(fc)
69

action에서 fcurves의 길이를 출력해보면 69가 나온다. 이는 skeleton의 dof 값과 일치하는 값이다.

즉 fcurves 어레이의 첫번째 index에는 root의 xposition 정보, 두번째 index에는 root의 yposition 정보, 세번째 index에는 root의 zposition 정보, 네번째 index에는 root의 euler X 값 정보...

이런식으로 각 인덱스마다 한 dof의 정보를 담고 있다.

>>> root_xpositions = fc[0].keyframe_points
>>> len(root_xpositions)
7184

action.fcurves에서 첫번째 인덱스(root의 xposition을 담고 있는 인덱스)를 추출하여 길이를 보면 bvh의 frame 개수와 같은 7184가 출력되게 된다.

root_xposition의 첫번째 인덱스에는 첫번재 frame의 root xposition

root_xposition의 두번째 인덱스에는 두번째 frame root xposition

...

이런식으로 모든 frame에 대한 정보를 다 담고 있게 된다.

이때 데이터값들을 보고 싶으면 co라는 속성을 살펴보면 된다.

>>> root_xpositions[0].co
Vector((1.0, 0.0))

>>> root_xpositions[1].co
Vector((2.0, -0.0007033082656562328))

>>> root_xpositions[2].co
Vector((3.0, -0.004482544958591461))

이런식으로 co 값들을 출력해보면 길이 2짜리 Vector가 출력되는데

첫번재 index는 몇번재 frame인지에 대한 정보를 담고 있고

두번째 index는 해당되는 frame의 dof position 값을 담고 있다. 이때 주의해야할게 이 값들은 rest pose에 대해 기술된다는 점이다. 다만 rotation 값들은 position은 신경쓰지 않아도 된다고 한다.

 

 

 

728x90
728x90