[Godot] 2D 스켈레톤

해당 게시물의 Godot 버전: 4.2.stable.mono

목차

  • 준비물
  • 스켈레톤 노드 만들기
  • 뼈와 스프라이트 연결하기
  • Inverse Kinematics 적용하기

준비물

캐릭터의 각 파츠에 맞는 이미지가 필요합니다. 위 사진 처럼 분리된 그림을 한 png 이미지 파일로 만들고 Polygon2D 노드로 하나씩 잘라내어 만들어도 되고 개별 png 파일로 준비해도 됩니다.

Polygon2D 노드는 UV 설정을 할 수 있어서 더 정교한 애니메이션을 만들 수 있습니다. 예를 들면, 캐릭터 애니메이션에 맞게 이미지 파일의 모양을 변형시킬 수 있습니다.

개별 png 파일을 준비한다면 정교한 애니메이션을 만들기는 어렵지만 Polygon2D 노드로 작업하는 것보다는 Sprite2D로 작업하는 게 시간이 훨씬 덜 듭니다.

각 파츠에 맞는 이미지를 모두 준비했다면 예시 이미지를 띄워 놓고 대충 이미지를 맞춰둡시다.

스켈레톤 노드 만들기

캐릭터의 각 파츠를 담당하는 스프라이트가 준비되면 Skeleton2D 노드를 추가합니다.

Skeleton2D 노드의 자식으로 Bone2D 노드를 추가합니다. Bone2D 노드는 캐릭터의 뼈 역할을 하는 노드입니다. 스프라이트 파츠와 뼈를 연결해서 뼈를 회전시킴으로서 캐릭터의 몸동작을 구현할 수 있습니다.

위 사진 처럼 우리가 사용할 스프라이트 파츠들은 우리가 원하는 모습으로 형성돼 있는 게 아니니까 완성될 예시 모습을 보면서 Bone2D 노드 위치를 맞춥니다. 가장 기본이 되는 Bone2D 노드는 Pelvis입니다.

그리고 중요한 것은 캐릭터의 발 위치를 Vector2(0, 0)에 맞춰두고 뼈의 위치를 설정하는 겁니다. 뼈 위치에 스프라이트 파츠들이 위치되기 때문에 캐릭터의 발 위치를 미리 맞춰두고 뼈 위치를 맞추는 게 나중에 편합니다.

Pelvis를 중심으로 이어져있는 뼈를 자식으로 생성합니다. Auto Calculate Length And Angle 속성 덕분에 자식 뼈의 위치를 옮기면 부모 뼈의 길이가 자동으로 맞춰지므로 굳이 길이 하나하나 수정할 필요 없습니다.

인간형 캐릭터의 뼈 트리 구조는 크게 어렵지 않습니다. 예를 들어, Chest 뼈가 회전할 때 같이 움직여야 하는 뼈들을 생각하면 어떤 뼈들을 자식으로 추가해야 하는지 이해하기 싶습니다.

말단 부위의 뼈는 Auto Calculate Length And Angle을 False하고 길이를 적당히 늘려줍니다.

뼈를 모두 작업하면 이젠 뼈와 스프라이트를 이어줘야 합니다.

뼈와 스프라이트 연결하기

스프라이트는 뼈와 연결돼야 합니다. RemoteTransform2D 노드를 사용하면 쉽게 연결할 수 있습니다. Polygon2D 노드로 이미지 파일을 준비했다면 UV 작업을 통해 뼈와 동기화해야 합니다. 해당 게시물은 Sprite2D 노드로 이미지를 준비한 기준으로 설명합니다.

위 사진 처럼 연결할 뼈가 Pelvis라면 Pelvis 자식으로 RemoteTransform2D 노드를 추가합니다.

RemoteTransform2D 노드는 원격 경로(Remote Path)를 지정해야 합니다.

Pelvis 뼈의 자식인 RemoteTransform2D이므로 Pelvis 스프라이트를 연결합니다.

처음 연결하면 우리가 원하는 위치가 아니므로 조정해서 맞춰줍시다. 위와 같이 연결되면 뼈가 회전하거나 움직이면 스프라이트도 같이 움직입니다. 이어서 다른 스프라이트도 모두 연결합니다.

스프라이트의 뷰 카메라에 보여지는 순서는 노드 트리의 Sprite2D 노드의 순서에 맞춰지므로 뼈의 순서 때문에 앞쪽에 위치해야 할 스프라이트가 뒤로갈 걱정은 할 필요 없습니다.

스프라이트와 뼈를 모두 연결한 모습입니다. 뼈 노드에 나타난 경고를 보면 대기 자세를 설정하지 않았기 때문에 나오는 경고입니다.

Skeleton2D 노드를 클릭하고 씬 창 상단에 있는 Skeleton2D 버튼을 클릭해서 “대기 자세 덮어 쓰기”를 선택합니다. 그러면 경고는 모두 사라집니다. 이렇게 스켈레톤 작업은 끝났습니다.

Inverse Kinematics 적용하기

Inverse Kinematics의 정의는 운동학 방정식을 사용하여 원하는 위치에 도달하기 위한 로봇의 움직임을 파악하는 방법입니다. 웬만한 게임 엔진에는 이 기능이 포함돼 있습니다. 게임 엔진에서는 캐릭터의 뼈를 원하는 위치에 자연스럽게 향하도록 도와주는 기능입니다.

만약 팔에 이 기능을 적용한다면, 현재 캐릭터 팔의 뼈는 위팔뼈, 아래팔뼈, 손뼈로 구성돼 있는데 그 세 개의 뼈가 자연스럽게 어울러져 움직이게 해줍니다.

현재 저는 팔과 다리에 IK를 적용할 생각입니다. 그러므로 위 사진 처럼 4개의 Node2D 노드를 생성했습니다. 각 노드는 이름에 해당하는 부위의 IK 위치를 담당할 것입니다.

Skeleton2D 노드의 Modification Stack 속성을 생성합니다.

Modifications 요소를 생성해야 합니다.

꽤 다양한 요소를 생성할 수 있는데 저는 TwoBoneIK를 생성하겠습니다.

TwoBoneIK는 관절 두개를 설정할 수 있습니다. 여기서 Bone2D 노드가 관절이 됩니다. 만약 왼팔을 적용한다고 생각하면 Joint One Bone2D Node는 위팔뼈 노드가 지정돼야 하고 Joint Two Bone2D Node는 아래팔뼈 노드가 지정돼야 합니다. 그리고 가장 위에 Target Nodepath 속성이 있는데 거기에 IK 위치를 담당할 Node2D 노드를 지정합니다.

위 설명대로 지정했다면 위 사진 처럼 될 것입니다.

그리고 Skeleton2D 노드의 Enabled 속성을 사용으로 적용하면 IKArmLeft 노드를 이동하면 왼팔이 잘 움직이는 걸 볼 수 있습니다.

만약 팔이 원하는 방향으로 굽혀지지 않는다면 Skeleton2D 노드의 Modifications에서 TwoBoneIK 요소의 Flip Bend Direction 속성이 있습니다. 이걸 사용으로 설정하면 굽혀지는 방향이 반대가 됩니다.

왼팔을 적용한 것처럼 다른 부위들도 적용하면 IK 설정은 끝납니다. IKArmLeft 노드를 움직였던 것처럼 IK 위치 값으로 설정한 노드를 이동시키면 다른 부위들도 움직일 것입니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다