인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

최성호님의 프로필 이미지

작성한 질문수

[게임 프로그래머 도약반] DirectX11 입문

애니메이션 #3

frame간 보간에 대해서 질문이있습니다.

작성

·

18

0

영상에서는 ModelAnimator의 update함수에서
keyframeDesc의 sumtime을 갱신해줄 때 다음과 같은 코드로 작성되었는데.

shared_ptr<ModelAnimation> current = model->GetAnimationByIndex(keyframeDesc.animIndex);

if (current)

{

float timePerFame = 1 / (current->frameRate * _keyframeDesc.speed);

if (_keyframeDesc.sumTime >= timePerFame)

{

keyframeDesc.sumTime = 0; //keyframeDesc.sumTime - timePerFame; // 0

keyframeDesc.currFrame = (keyframeDesc.currFrame + 1) % current->frameCount;

keyframeDesc.nextFrame = (keyframeDesc.currFrame + 1) % current->frameCount;

}

keyframeDesc.ratio = (keyframeDesc.sumTime / timePerFame);

}

 

이 부분에서 _keyframeDesc.sumTime = 0;
이런식으로 sumTime을 0으로 하는것보다,
keyframeDesc.sumTime = keyframeDesc.sumTime - timePerFame;

처럼 계산 후 남는 값을 넣어주는 것이 더 정확하지 않을까요?

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 최성호님.

프레임 간 보간과 관련된 질문 주셨네요. 말씀하신 내용에 대해 간단히 설명드리겠습니다.

프레임 간 보간에서 sumTime 값을 0으로 초기화하는 것과 sumTime에서 timePerFrame을 빼주는 것은 실제 구현 시의 목적과 결과에 따라 다릅니다.

현재 코드에서는 sumTimetimePerFrame 이상일 때마다 해당 프레임을 넘어갈 때마다 currFramenextFrame을 갱신하고 sumTime을 0으로 초기화하도록 설정되어 있습니다. 이는 매우 단순하고 직관적인 방식으로 매 프레임 전환 시 시작 지점을 0으로 리셋하여 다음 계산을 위한 초기 상태로 만들려는 의도입니다.

만약 수치적인 완벽한 시간 관리를 원한다면 sumTime = sumTime - timePerFrame; 방식으로 남은 시간을 보존하는 것도 의미가 있습니다. 이를 통해 초과된 시간을 다음 계산에 사용할 수 있어 정밀한 시간 추적이 가능합니다. 이 방식은 매우 세밀한 타이밍이 필요한 경우, 특히 부드러운 애니메이션이나 정확한 물리 계산이 중요한 경우에 유용합니다.

프레임 관리 질문입니다.라는 유사한 질문도 참고하시면 도움이 될 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.