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은 신경쓰지 않아도 된다고 한다.
'연구 > Blender' 카테고리의 다른 글
[Blender] viewport에서 시점 변경 python script로 구현하기 (0) | 2024.01.18 |
---|---|
[Blender] Python script로 음악 재생 및 현재 재생 시점 알아내기 (0) | 2023.10.04 |
blender에서 keyframe들 scaling 시키기 (Timeline 창, 코드 이용) (0) | 2023.07.18 |
blender bvh load 관련 알아낸 사실 정리 (2) (0) | 2023.04.18 |
Blender에서 python api 사용하기(operator_simple.py 분석) (1) | 2023.03.17 |