캐릭터의 몸을 움직이면서 IK 발 타깃을 고정하는 방법
IK 발을 고정하려면 캐릭터의 몸 컨트롤을 움직이는 동안 각 발 타깃의 월드 위치를 일정하게 유지하세요. 움직이는 몸과 고정된 타깃 사이에서 관절이 조정되도록 다리 솔버에 맡기세요. 타깃이 몸의 움직임을 상속한다면 IK를 계산하기 전에 해당 변환 관계를 분리하거나 움직임을 상쇄하세요.
이 가이드는 두 발을 제자리에 둔 채 몸이 위아래로 움직이거나, 기울거나, 이동하도록 포즈를 잡으려는 리깅된 가상 캐릭터 제작자를 위한 것입니다. 아래 작업 흐름은 문서에 설명된 변환 및 IK 동작과 실용적인 진단 절차를 결합합니다. Unity와 Godot의 용어를 구체적인 참고점으로 사용합니다.
발 타깃은 왜 몸과 함께 움직이나요?
타깃의 로컬 좌표가 바뀌지 않아도 씬 안에서 움직일 수 있습니다. 로컬 변환은 오브젝트를 부모를 기준으로 나타내므로, 조상 노드를 움직이면 자식의 월드 변환도 바뀝니다. Godot 문서는 transform과 global_transform을 통해 이 차이를 설명합니다. 3D 변환 사용하기 — Godot Engine
먼저 발 타깃 컨트롤을 표시하고 몸을 옆으로 조금 움직여 보세요. 화면에 보이는 발과 타깃을 따로 관찰하세요. 타깃이 몸과 함께 움직이면 조상 노드를 살펴보세요. 타깃이 골반, 몸 컨트롤 또는 다른 움직이는 그룹의 하위에 있을 수 있습니다.
로컬 위치 필드만 보고 설정을 판단하지 마세요. 움직이기 전후의 타깃 월드 위치를 기록하세요. 이렇게 하면 두 가지 유용한 질문을 구분할 수 있습니다. 타깃이 의도한 위치에서 벗어났나요, 아니면 다리가 고정된 타깃을 따라가지 못했나요?
몸 컨트롤과 발 컨트롤은 어떻게 구성해야 하나요?
몸의 움직임과 고정된 발 타깃을 서로 다른 컨트롤 분기로 구성하세요. 실용적인 구성에서는 스켈레톤과 몸 컨트롤을 한 분기에 두고, 왼발과 오른발 타깃은 정지된 씬 컨트롤 아래의 다른 분기에 둡니다. 핵심은 조작하는 몸 컨트롤이 타깃 분기를 움직이지 않게 하는 것입니다.
몸 아래에 있는 컨트롤만 움직인다면 일반적인 캐릭터 컨트롤 하나에 두 분기를 모두 포함해도 됩니다. 하지만 그 전체 컨트롤을 움직이면 두 분기가 모두 움직입니다. 컨트롤을 선택하기 전에 작업이 “고정된 발 위로 몸을 이동”하는 것인지, “캐릭터 전체를 이동”하는 것인지 정하세요.
앱에서 변환 상속을 독립적으로 설정할 수 있다면 또 다른 방법이 될 수 있습니다. 예를 들어 Godot의 Node3D.top_level을 사용하면 노드가 부모의 변환을 상속하지 않습니다. 이는 문서화된 변환 기능이며, 그 자체로 IK 솔버를 설정하지는 않습니다. Node3D — Godot Engine
타깃의 부모나 상속 모드를 변경할 때는 기존 월드 포즈를 유지하세요. 먼저 월드 위치와 방향을 기록한 다음 관계를 변경하고, 해당 포즈를 복원하세요. 몸을 다시 움직이기 전에 결과를 확인하세요.
타깃을 움직이는 부모 아래에 둬야 한다면 어떻게 하나요?
고정된 월드 포즈를 별도로 저장하고, 부모의 현재 변환을 기준으로 타깃에 필요한 로컬 포즈를 계산하세요. 위치 관계는 다음과 같습니다. 타깃 로컬 위치 = 현재 부모 월드 변환의 역행렬 × 저장된 타깃 월드 위치. Unity는 InverseTransformPoint를 통해 월드에서 로컬로 변환하는 기능을 제공합니다. Transform.InverseTransformPoint — Unity
위치 이동만 있는 간단한 예를 살펴보겠습니다. 타깃이 월드 X = 1.0에 고정되어 있고, 부모는 X = 0.0에서 시작합니다. 따라서 로컬 X는 1.0입니다. 부모를 X = 0.3으로 이동하면 타깃이 월드 X = 1.0에 머물기 위해 로컬 X를 0.7로 설정해야 합니다. 로컬 X를 1.0으로 그대로 두면 타깃은 월드 X = 1.3으로 움직입니다.
이 뺄셈은 단순화된 예에만 적용됩니다. 회전 또는 스케일이 적용된 부모에는 전체 변환 계산이 필요합니다. Unity의 TransformPoint는 로컬 위치를 월드 공간으로 변환하며 스케일도 반영한다고 명시되어 있습니다. 따라서 위치를 변환할 때는 방향 연산이 아니라 점 연산을 사용해야 합니다. Transform.TransformPoint — Unity
발이 고정 상태에 들어갈 때 고정 포즈를 캡처하세요. 몸이 움직이는 동안 저장된 값을 재사용하세요. 타깃이 움직임을 상속한 뒤 다시 캡처하면 그 이동량이 새 기준값으로 저장될 뿐입니다. 방향도 고정해야 한다면 위치뿐 아니라 타깃 방향도 함께 저장하고 변환하세요.
다리 IK가 타깃을 따라가도록 어떻게 설정하나요?
큰 포즈 변화를 시험하기 전에 솔버의 체인 할당을 확인하세요. Unity Animation Rigging 1.4.1의 Two Bone IK는 Root, Mid, Tip 트랜스폼과 Target, 선택 사항인 Hint를 사용합니다. 두 부분으로 이루어진 단순한 캐릭터 다리에서는 각각 허벅지 관절, 무릎 관절, 발목 관절에 해당합니다. Hint는 굽힘 방향을 제어합니다. Two Bone IK — Unity Animation Rigging
초기 테스트에서는 컨스트레인트 영향도와 타깃 위치 영향도를 최대로 설정하세요. 타깃 회전 영향도는 별도로 확인하세요. Unity는 이 값을 각각 따로 제공하므로 위치를 따라가는 동작과 방향 일치를 독립적으로 테스트할 수 있습니다. Unity의 Maintain Target Offset 설정은 팁과 타깃 사이의 초기 위치 또는 회전 차이를 유지합니다. Two Bone IK — Unity Animation Rigging
컨스트레인트를 활성화하기 전에 의도한 발목 포즈에 타깃을 맞추세요. 오프셋을 사용한다면 그것이 무엇을 나타내는지 기록하세요. 처음부터 오프셋이 설명되지 않으면 나중에 타깃과 솔버가 계산한 관절을 비교하기 어렵습니다.
Hint 또는 폴 컨트롤로 의도한 무릎 굽힘을 설정한 다음 몸을 조금 움직여 보세요. 테스트 내내 Hint의 위치를 이해하기 쉽게 유지하세요. 타깃, 몸, 굽힘 컨트롤을 동시에 바꾸면 예상과 다른 결과의 원인을 찾기 어려워집니다.
두 발을 고정한 채 몸을 얼마나 움직일 수 있나요?
타깃을 고정해도 가능한 모든 몸 위치에 다리가 닿는 것은 아닙니다. 관절이 제한 없이 움직이고 늘어나지 않는 이상적인 두 세그먼트 체인에서는 다리 루트와 타깃 사이의 거리가 |위쪽 세그먼트 길이 − 아래쪽 세그먼트 길이|과 위쪽 세그먼트 길이 + 아래쪽 세그먼트 길이 사이여야 합니다. 실제 관절 제한으로 이 범위가 더 좁아질 수 있습니다.
세그먼트 길이가 각각 씬 단위 0.45인 캐릭터를 예로 들어 보겠습니다. 최대 기하학적 도달 거리는 0.90단위입니다. 엉덩이가 발목 타깃보다 0.80단위 위에 있고 수평으로 0.30단위 떨어져 있다면 둘 사이의 거리는 √(0.80² + 0.30²), 약 0.854단위입니다. 이상적인 범위 안에 들어갑니다. 수평 거리를 0.50단위로 늘리면 거리는 약 0.943단위가 되어 해당 범위를 벗어납니다.
이 계산을 통해 도달 거리 문제와 변환 문제를 구분하세요. 타깃은 고정되어 있지만 체인이 닿지 못한다면 몸의 이동량을 줄이거나 두 다리를 모두 고려해 몸의 위치를 조정하세요. 각 다리를 따로 살펴보세요. 옆으로 이동하면 한쪽 타깃은 가까워지고 다른 쪽은 멀어질 수 있습니다.
처음 제대로 작동하는 포즈에서는 두 다리가 눈에 띄게 굽혀진 상태를 유지하고 작은 움직임부터 테스트하세요. 각 다리가 도달 한계에 가까워지는 지점을 확인한 뒤에만 몸의 움직임 범위를 늘리세요. 다른 캐릭터의 이동량을 그대로 적용하지 말고 리그에 맞는 결과로 판단하세요.
발목만이 아니라 발 전체를 고정하려면 어떻게 하나요?
리그에서 “고정”이 어떤 의미인지 정하세요. 발목 타깃을 움직이지 않게 하면 관절 위치는 유지되지만, 발에는 의도한 방향도 필요합니다. 발바닥 접촉 지점과 발목 회전축은 서로 다른 기준점이므로, 컨트롤을 배치할 때 설계된 오프셋을 유지하세요.
유용한 진단 방법은 발목 위치를 고정하고 몸만 회전하는 것입니다. 뒤꿈치와 발끝을 관찰하세요. 발목을 중심으로 움직인다면 발 방향 컨트롤과 별도의 발가락 컨트롤이 있는지 확인하세요. 이 테스트는 눈에 보이는 접촉 상태와 타깃 위치를 분리해 살펴볼 수 있습니다.
의도한 고정 방향을 위치와 함께 저장하세요. 몸이 움직이는 동안 두 값 모두 저장된 포즈와 비교하세요. Godot의 변환 문서는 변환이 원점과 방향 및 스케일을 나타내는 기저 벡터를 결합한다고 설명합니다. 이는 완전한 포즈를 이해하는 데 유용한 참고 자료입니다. 3D 변환 사용하기 — Godot Engine
발이 미끄러지는 문제를 일관된 순서로 어떻게 진단하나요?
아래 순서는 위에서 설명한 변환 및 솔버 동작을 바탕으로 한 실용적인 진단 방법입니다. 문제를 재현하는 가장 작은 몸 움직임부터 시작해 한 번에 조건 하나만 바꾸세요.
| 관찰 결과 | 먼저 확인할 항목 | 다음 조치 |
|---|---|---|
| 타깃이 몸과 함께 움직임 | 움직이는 조상 노드와 상속된 변환 | 컨트롤 분기를 분리하거나 저장된 월드 포즈 복원 |
| 타깃은 고정되어 있지만 발목이 닿지 않음 | 체인 할당, 위치 영향도, 도달 거리 | 설정을 확인한 다음 몸의 이동량 줄이기 |
| 발목은 고정되어 있지만 뒤꿈치나 발끝이 움직임 | 발 방향과 접촉 오프셋 | 의도한 고정 방향 복원 |
| 무릎 굽힘이 예상과 다르게 변함 | Hint 또는 폴 위치 | 몸을 조금 움직이며 굽힘 컨트롤 테스트 |
| 드래그할 때와 재생할 때 결과가 다름 | 각 컨트롤에 값을 쓰는 시스템과 시점 | 재생 중 계산된 변환 확인 |
애니메이션 또는 절차적 설정에서는 명시적인 처리 순서를 사용하세요. 몸 포즈를 설정한 다음 저장된 타깃을 복원하거나 변환하고, 마지막으로 다리 IK를 계산합니다. 앱이 이 작업들을 어떤 순서로 처리하는지 확인하세요. 콜백 이름만으로는 솔버가 같은 계산 단계에서 갱신된 타깃을 읽는다고 단정할 수 없습니다.
마지막으로 짧은 반복 동작을 테스트하세요. 몸을 옆으로 움직이고, 낮추고, 조금 회전한 다음 시작 포즈로 되돌립니다. 각 타깃의 월드 포즈를 반복해서 저장된 기준 포즈와 비교하세요. 타깃이 고정된 뒤에는 남은 조정 항목을 구체적으로 살펴볼 수 있습니다. 몸이 움직일 수 있는 범위, 일관된 무릎 방향, 의도한 접촉을 유지하는 데 필요한 발 방향입니다.
