상세 컨텐츠

본문 제목

HumanGL: Jump 애니메이션 구현 - (8)

Computer Graphics/HumanGL

by Banjosh 2024. 10. 21. 10:43

본문

이번 글에서는 Human Model에 마지막 애니메이션인 Jump(점프)를 구현한 과정을 정리해 보았다.

Jump (점프)

점프는 space 키를 누르면 활성화되며, 자연스러운 점프 모션을 위해 걷는 중이라면 그 속도발의 위치 그대로 점프가 시작된다.

 

1. 점프 속도 결정

  • x, z 축 방향: 점프 중에도 기존의 이동 속도를 그대로 유지한다.
  • y 축 방향: 점프 시작 시, jumpVelocity만큼 속도를 부여하고, 매 프레임마다 설정된 중력 가속도에 의해 속도가 줄어든다. y축 속도가 -jumpVelocity에 도달하면 점프가 끝난다.

2. 팔과 다리 움직임

  • 팔과 다리의 움직임은 자연스럽게 보이도록 앞에 나와 있는 팔, 다리뒤로 빠져 있는 팔, 다리회전 각도와 타이밍을 다르게 설정했다.
  • sin 함수를 사용하여 팔과 다리의 움직임을 제어하며, y축 속도가 jumpVelocity에서 -jumpVelocity로 변화하는 동안을 기준으로 0 ~ pi 범위에서 움직임을 계산했다.
  • 앞과 뒤의 팔 다리 타이밍은 살짝 다르게 설정해 자연스러움을 더했다.
// jumpTheta[0] = 앞 부분의 팔 다리 주기
// jumpTheta[1] = 뒷 부분의 팔 다리 주기

// 앞 부분의 팔 다리 주기를 0.2 * pi 만큼 앞으로 땡겨서 사용하였다.
float jumpTheta[2] = { std::max(0.0f, std::min(glmath::pi * (gravity / (2 * jumpVelocity)) * jumpTime + glmath::pi * 0.2f , glmath::pi)),
                       std::min(glmath::pi * (gravity / (2 * jumpVelocity)) * jumpTime, glmath::pi)};

// 앞 부분의 팔 다리 주기가 0 부터 시작할 수 있게 구간을 나눠 정의
// 0 ~ 0.4 * pi 구간에는 jumpTheta[0] = jumpTheta[1] * 2.0f 으로 사용
// 0.4 * pi ~ pi 구간에는 jumpTheta[0] = jumpTheta[1] + 0.2f * pi 로 사용 
if (jumpTheta[1] <= glmath::pi * 0.2f) {
    jumpTheta[0] = jumpTheta[1] * 2.0f;
}

 

3. 점프 중 행동 제약

점프 중에는 Rotate를 제외한 다른 행동이 불가능하다.

  • Walk와 Stop 등의 동작은 Jump 상태가 유지되는 동안 무시된다.
  • Jump가 완료될 때까지, m_stateJump가 남아 있으며, Jump 상태일 때는 다른 동작을 실행할 수 없다.

 

결과

 

다음은 구현한 점프 애니메이션의 결과이다.

 

이번 Jump 애니메이션 구현으로 Human Model 프로젝트의 기본적인 애니메이션 시스템이 완성되었다. 팔과 다리의 자연스러운 움직임을 구현하면서, sin 함수와 타이밍 조절을 통해 좀 더 현실적인 모션을 만들어 낼 수 있었다.

 

관련글 더보기