如何正确动画模型
Posted
技术标签:
【中文标题】如何正确动画模型【英文标题】:How to animate model correctly 【发布时间】:2019-06-06 14:33:28 【问题描述】:我有一个需要动画的动画。我有一些代码示例
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);
正确的动画制作方法是在1.0f / rate
秒内将_flAnimPos
从0
“填充”到1
。
例如,我有一个由 8 帧组成的动画。如果我将_FPS
设置为16
,动画必须在0.5
秒内完成一个完整的循环。
【问题讨论】:
获取tour 并阅读How to Ask。 【参考方案1】:我找到了解决方案。时间点传递不正确。正确的是:
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;
【讨论】:
以上是关于如何正确动画模型的主要内容,如果未能解决你的问题,请参考以下文章
这是绘制许多不同的动态 3D 模型的最优化和正确的方法(它们是动画的并且每一帧都会改变)