Как правильно анимировать модель - PullRequest
0 голосов
/ 06 июня 2019

У меня есть анимация, которую нужно анимировать. У меня есть пример кода

void CAnimationEditor::OnTimer(UINT nIDEvent)
{
    if (nIDEvent == 2)
    {
        if (_flAnimPos >= 1.0f)
            _flAnimPos = 0.0f;
        std::chrono::duration<float> elapsed_seconds = std::chrono::steady_clock::now() - _start;
        float time = elapsed_seconds.count();
        float rate = (float)_FPS / m_pAnimation->GetFramesCount();
        _flAnimPos += time * rate;
        if (_flAnimPos >= 1.0f)
            _flAnimPos = 0.0f;
        m_pAnimation->Update();
        m_oglAnimationPreview.Draw();
        _start = std::chrono::steady_clock::now();
    }
    CDialog::OnTimer(nIDEvent);
}

Я нажимаю на флажок и устанавливаю таймер

SetTimer(2, 0, NULL);

Правильный способ анимации - «заполнить» _flAnimPos от 0 до 1 за 1.0f / rate секунд.

Например, у меня есть анимация, которая состоит из 8 кадров. Если для _FPS установлено значение 16, анимация должна пройти полный цикл за 0.5 секунд.

1 Ответ

0 голосов
/ 10 июня 2019

Я нашел решение. Временные точки были доставлены неправильно. Правильно было:

if (nIDEvent == 2)
{
    _start = std::chrono::steady_clock::now();
    std::chrono::duration<float> elapsed_seconds = _start - _last;
    float time = elapsed_seconds.count();
    float rate = (float)_FPS / m_pAnimation->GetFramesCount();
    _flAnimPos += time * rate;
    if (_flAnimPos > 1.0f)
        _flAnimPos = fmod(_flAnimPos, 1.0f);
    m_pAnimation->Update();
    m_oglAnimationPreview.Draw();
    _last = _start;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...