이번에는 Human Model에 기본적인 애니메이션을 적용해 보았다. Walk, Rotate, Stop 이렇게 세 가지 동작을 구현했으며, 각각의 동작이 어떻게 이루어졌는지 살펴보자.
Rotate (회전)
Rotate는 항상 활성화된 상태로 존재한다. 캐릭터가 회전하지 않으면 기본적으로 (0.0f, 0.0f, -1.0f) 방향을 계속해서 바라보는 상태가 된다.
Rotate 활성화 (공통)
현재 방향 벡터를 목표 방향 벡터로 회전시킨다. 회전 속도는 rotateSpeed로 제어되며, atan2() 함수를 사용하여 각도를 계산한다.
Rotate 키 입력 시
방향키(화살표)를 누르면 목표 방향 벡터가 해당 방향으로 변경된다.
Rotate 키 입력이 없을 시
목표 방향 벡터는 현재 방향 벡터와 동일하게 설정된다. 이는 캐릭터가 회전하지 않고 한 방향을 계속 바라보는 상태를 만든다.
Walk (걷기)
Walk는 방향키 입력에 따라 캐릭터가 현재 방향으로 이동하는 동작이다.
이동 (z, x 축 방향)
현재 방향 벡터에 moveSpeed 값을 곱하여 캐릭터의 translation에 더해준다. 이때 발을 내딛을 때의 감속 효과를 주기 위해 translation += moveSpeed + sin() * amplitude 형식으로 이동하게 하였다.
팔, 다리 흔들기
sin 함수를 사용해 자연스럽게 팔과 다리가 반대 방향으로 흔들리게 만들었다. 왼쪽과 오른쪽의 주기에 pi만큼의 차이를 줘서 서로 반대 방향으로 움직인다.
0 ~ pi 구간에서는 왼발과 오른팔을 앞으로, pi ~ 2pi 구간에서는 오른발과 왼팔을 앞으로 흔들게 구현하였다.
처음에는 선형 보간을 사용하여 구현했으나, sin 함수를 사용한 방식이 더 자연스러웠다.
위 아래 움직임 (y 축 방향)
사람이 걸을 때 다리를 벌리면서 몸이 약간 아래로 내려갔다가 다시 올라오는 자연스러운 움직임을 구현하기 위해, sin 함수를 사용하여 y 좌표를 -y_min에서 0까지 반복하게 하였다.
sin 함수로 걷기 동기화
모든 파트가 같은 타이밍으로 걷는 모습을 구현하기 위해 walkTheta라는 변수를 도입하여 모든 파트의 움직임을 동기화하였다.
Stop (멈춤)
Stop은 캐릭터가 Walk 또는 Jump 상태가 아닐 때 실행된다. 보통은 걷다가 멈추는 동작을 처리한다.
Walk에서 Stop으로 전환
걷다가 멈출 때 자연스럽게 walkTheta 값을 조정하여 sin(walkTheta) = 0이 되도록 만들어, 발을 멈추는 것이 자연스럽게 이루어지도록 하였다.
멈춘 후 숨쉬기 효과 추가
캐릭터가 완전히 멈춘 후에는 가슴과 어깨의 크기를 미세하게 조절하여 숨쉬는 효과를 추가하였다. sin 함수를 이용해 scale 값을 1.0에서 1.01 사이로 반복하게 하여 생동감 있는 애니메이션을 구현하였다.
이렇게 Rotate, Walk, Stop 애니메이션을 구현하면서 기본적인 캐릭터 동작을 자연스럽게 연결할 수 있게 되었다. sin 함수를 활용한 움직임 조정은 실제 사람의 동작을 모방하는 데 유용했으며, 캐릭터가 멈췄을 때의 숨쉬기 효과까지 추가하여 애니메이션의 디테일을 살릴 수 있었다.
다음에는 Jump 애니메이션을 추가하고, 애니메이션 상태 전환을 더욱 부드럽게 연결하는 작업을 진행할 예정이다.