
Control Rig · 약 3분
발 IK를 켜고 끄는 조건과 착지 전환
낙하 중의 잘못된 지면 추적을 막고 목표 오프셋과 적용 오프셋을 분리합니다.
Wolfgadeok · 업데이트
애니메이션 리그에 상태를 전달하기
발 IK의 목적은 서 있거나 걷는 발을 바닥에 맞추는 것입니다. 점프 정점에서 발 아래의 땅을 찾았다고 다리를 그곳까지 늘리면 원래 점프 포즈가 무너집니다. 그래서 캐릭터의 이동 상태를 읽어 이번 평가에서 지면 보정을 적용할지 판단해야 합니다. ShouldDoIKTrace는 이 판단을 Control Rig에 전달하는 Boolean 입력의 예제 이름입니다.
CharacterMovement의 IsFalling은 이동 모드에 대한 판단입니다. 눈에 보이는 발과 땅 사이의 거리만으로 결정되는 값이 아닙니다. 수영, 비행, 래더, 컷신 이동 같은 상태가 있다면 IsFalling의 반전 하나로 모든 접지 상태를 정의해서는 안 됩니다. 프로젝트가 허용한 상태에서만 발 IK가 작동하도록 조건을 한 곳에 모읍니다.
목표값과 현재값을 따로 보관하기
왼발과 오른발을 같은 지면 조사 함수로 처리하고 결과에서 각 발의 목표 높이를 계산합니다. 이 함수를 여기서는 FootTrace라고 부릅니다. 목표 높이는 이번 프레임의 센서 결과에 해당합니다. 실제 포즈에 적용되는 값은 그 목표를 부드럽게 따라가는 별도의 현재 오프셋입니다. 두 값이 섞여 있으면 지난 보정이 다음 추적의 출발점이 되어 불필요한 누적이 생기거나, 디버그 화면에 무엇이 측정값인지 구분되지 않습니다.
추적이 실패했을 때에도 정책이 필요합니다. 이전 목표를 무한히 유지하면 절벽을 벗어난 발이 허공에 고정될 수 있습니다. 기본 포즈로 돌아가되 적용 가중치를 줄이는 방식과 목표 오프셋을 0으로 되돌리는 방식을 구분해 시험합니다. 착지 순간의 반응은 빠르게, 지면에서 떨어질 때는 점프 포즈를 방해하지 않게 조정할 수 있지만 모든 캐릭터에 같은 속도가 정답인 것은 아닙니다.
전환 지점을 검증하기
평지에서 걷기만 해서는 상태 버그가 잘 드러나지 않습니다. 계단 끝에서 한 발만 지면을 벗어나는 순간, 이동 중 점프, 낮은 턱에서 떨어짐, 경사 위 착지를 반복합니다. 디버그에는 현재 이동 모드, IK 허용 여부, 양발의 추적 성공 여부, 목표 오프셋과 적용 오프셋을 함께 표시합니다. 그래야 흔들림이 센서 입력 때문인지 보간 때문인지 솔버 때문인지 분리할 수 있습니다.
- 캐릭터가 결정한 접지 허용 값을 AnimInstance에서 리그 입력으로 전달합니다.
- 각 발의 추적 성공 여부를 먼저 검사한 뒤 목표값을 갱신합니다.
- 비활성 상태에서는 남아 있는 보정 상태를 명시적으로 해제합니다.
- 착지·재점프·낭떠러지 경계에서 포즈와 캡슐 움직임을 동시에 확인합니다.