클래스선언.html

Bone 은 본을 나타내는 트랜스폼(Transform)을 정의합니다. 사용방법은 기존의 Transform 과 동일하나, 본에 영향을 받는 정점(Vertex)들을 본의 로컬 공간(bone’s local space/bone space)으로 옮겨 정점을 본 공간(bone space)에서 변환시키는 함수들을 추가로 제공합니다.

이를 스키닝(skinning) 연산이라고 하는데, 피부(skin)가 뼈(bone)의 움직임에 따라 변형되기 때문입니다. 여기서 말하는 피부는 당연히 Triangle 을 의미하며, 삼각형을 이루는 정점(Vertex)들은 Deformer 를 통해 어떤 본들에게 영향을 받는지를 저장해둡니다. 당연하지만 정점들은 자신의 근처에 있는 본들에 영향을 받아야겠죠:

 로 렌더링한 캐릭터.  ,  를 해주었습니다.

Renderer.renderMesh() 로 렌더링한 캐릭터. wireFrameMode = true , boneVisible = true 를 해주었습니다.

캐릭터의 머리를 구성하는 삼각형들은 머리 쪽의 본들에 영향을 받으며, 왼팔을 구성하는 삼각형들은 왼팔 쪽의 본들에 영향을 받아야 되는 것이죠. 그렇다면 메시와 본을 초기화할 때, 본들은 메시의 위치와 어느정도 일치해야겠네요. 이때의 자세를 바인딩 포즈(bind pose/reset pose/global initial position)라고 합니다.

본을 따라 움직이는 메시.

본을 따라 움직이는 메시.

왼팔을 움직이기 위해서 "rp_nathan_animated_003_walking_upperarm_l" 라는 이름의 본을 회전시켰다고 할까요? 본 입장에서는 자신의 local transform 을 수정하면 될겁니다. 그렇다면 본은 원점(Origin)에서 회전 변환을 수행한 후에, 부모의 world transform 을 곱해서 실제 위치로 옮기는 셈이겠네요.

Transform.#calculateWorld() 에서 달이 지구를 공전하는 과정이 기억나시나요? 먼저 달을 자전시킨 후 공전 궤도로 옮겨야 합니다. 이후 지구의 자전을 달에게도 적용하면 되는 것이었죠. 스키닝(skinning) 연산 또한 마찬가지입니다. 본의 local transform 을 적용하는 시점은 본의 로컬공간, 즉 bone space 에서 수행해야 합니다. 즉 본에 영향을 받는 정점들 또한 먼저 bone space 로 변환시킬 필요가 있다는 것이죠!

이 역할을 하는게 바로 바인딩 포즈(bindPose)입니다. 즉 바인딩 포즈의 역(inverse)인 $bindPose^{-1}$ 을 곱해서 정점들 또한 bone space 로 변환시켜야 합니다. 이에 대해서 Bone.setBindPose() Bone.skinning() 을 읽어보시길 바랍니다.

Static methods

<aside>

Bone.createMesh()

본을 나타내는 Mesh 를 생성합니다.

</aside>

Static properties

<aside>

Bone.renderer

본을 그리기 위한 Renderer 를 얻습니다.

</aside>