Reading Skeleton from COLLADA documents

  •  Skeleton 에 대하여 Joints(Bones) 정보를 읽고, Joints간의 계층을 읽어야 한다. 이로서 누가 누구의 자식인지 알수있다! 그리고 누가 다른 Joint의 부모인지 알수 있다. 다음과 같은 형태의 용어들이 이 모든 것을 설명한다.
    Bones와 Joints는 하나이고 같은 것임을 기억하라. 부르기 편한대로 나름이지만 COLLADA에서는 명시적으로 Joint라고 명한다. Bone은 두개의 Joint들이 연결되어 만들어진 한개의 라인이라고 상상하라.
    bones.jpg
  •  다음 그림을 통하여 예제의 skeleton과 스킨을 볼 수 있다.
    Skeleton.jpg
  •  왼쪽 피규어의 빨간 써클은 COLLADA에서 읽은 joint로 이 원들로 연결된 선들이 스킨을 애니메이팅하는 bone을 이루는 것을 상상할 수 있다. 오른쪽은 스킨을 입힌 스켈레톤으로 다른 프레임의 장면이다.
  • 모든 Joints에는 스킨이 더해지며 <library_visual_scenes>에서 만들어지며, 매우 읽기 간편 하도록 되어있다. Joint(bone)의 root를 찾을 수 있다. visual_scene 안의 skeleton의 <node>와 joint의 트리에서 그것을 읽을 수 있다.
  • 이것의 불이익이 되는 것중 하나가 많은 joints들이 고심하여 하나의 스킨을 움직이지만 실제로는 스킨에 영향을 미치지 못하는 것이다. 그리고 만약 모든 뼈에 스킨을 더하지 않았을 때 <node>의 타입이 "JOINT" 이거나"NODE"인 것들이 계층에 섞여 있을 수 있다. 그러나 만약 모든 뼈에 스킨을 더한다면 타입이 오직 "JOINT"인 완전한 트리를 얻을 수 있다. 이것은 많은 engine의 exporter의 기본이다. 만약 <node>의 타입이 "JOINT" 이거나"NODE"인 것들이 계층에 섞여있을때 <library_visual_scenes>의 <instance_controller>에서 <skeleton>을 매번 읽어서 joint를 읽어 올 수 있다.  타입이 "JOINT"가 아닌 <node>는 Joint여도 아무런 효과가 없고 스킨에도 영향을 미치지 못한다.
  •  bone의 계층을 읽기위해서 자식의 넘버와 그를 소유한 부모의 종류를 담을 데이터 STRUCTURE가 필요하다. 또 <node>의 "SID" 를 저장하는 것이 필요하다. 한번 데이터 스트럭처를 셋업하는데 있어서, root를 찾고 자식을 읽고 또 그들의 자식을 읽는 방식을 (재귀적으로) 반복해야한다. 읽는 과정을 다 마친 후에는 누구의 자식 관절(joint) 인가에 대한 물음에 답할수 있도록 데이타 스트럭쳐를 프로세싱 해야한다. 그리고 누가 그 관절의 부모인가도 알아야 함.
  • 이제 어떻게 스켈레톤의 root joint를 찾는가? 우리가 콜라다 도큐멘트에 오직 하나의 모델만 가질수 있게 된것을 알게된 이후로, 우리는 scene이 어느 단계에서 시작된 것인지 찾기 위하여 <scene>을 꼭 읽을 필요가 없다. 우리는 바로 <library_visual_scenes>를 찾고, 오직 <visaul_scene>에 직접적으로 연결된 자식을 접근하여 <node>를 찾고, 자식인 <instance_controller>타입을 찾는다. 또 그 자식인<skeleton>을 읽는다. 이제 이 노드는 우리의 skeleton의 root가 되며 모든것은 이 <node>의 skeleton의 파트로 연결된다.
  •  만약 COLLADA 문서안에 이 <node>의 구조체를 본다면 대부분의 node들이 첫번째 차일드와 같은 <matrix>를 가진것을 보게 될것이다. 그리고 이 <matirx>는 뼈의 관절 Matrix를 이루는 16개의 float 값을 가지고 있을 것이다. 이것은 또한 현재 뼈의 변환 행렬(the local bone transformation matrix.)라고도 불리운다. 모든 조인트(관절)를 연결했을 때 부모의 월드좌표 행렬에 자식의 Joint 행렬을 곱하고 그것을 자식의 the local bone transformation matrix에 저장한다.
  •  이제 skeleton을 읽고 앞서 읽어들였던 각각의<node>의 joint 매트릭스로부터 skeleton의 pose를 할당해주어야만 한다. 다음 섹션은 skeleton에 연결된 skinning information을 읽어보자.

이 글은 스프링노트에서 작성되었습니다.

Posted by BLUE-NOTE