使用增量时间在 while 循环中调节对象的速度

Modulate the speed of the object in a while loop using delta time

int i = 0;
void Car_Animation::update(float delta_time)
{
    glm::tvec3<float> tar = { 0,0,0 };
    tar = curve->curve_points_pos[(i+1) % (curve->points_pos.size())] -
        curve->curve_points_pos[(i) % (curve->points_pos.size())];

    m_model_mat = glm::translate(m_model_mat, tar);
    i++;

}

以上函数在 while 循环中被调用,其中 delta_time 是前一帧和当前帧之间的差异;

while (!glfwWindowShouldClose(window))
    {
            animation->update(delta_time);
}

现在,在 update 函数中,我正在将我的模型转换为 curve->points_pos 中的一组点。 curve->points_pos 包含一组彼此靠近的点,这给人一种模型移动的错觉 continuously.But 问题是,我想调节模型的速度。我该怎么做?我有 delta_time。我可以用那个吗?我只使用 glfw, glew and glm,没有使用 glut

如果我错了请纠正我,但看起来您目前有: * curve->curve_points_pos,这是一个你希望你的模型通过的位置数组; * m_model_mat 这是您模型的当前转换矩阵;和 * i,这是 curve->curve_points_pos.

的当前索引

模型然后从 curve->curve_points_pos 中的一个条目到下一个条目采取完整的步骤,尽管您将它们应用为彼此的偏移量,而不是将它们作为绝对值。

在那种情况下,你基本上拥有的是时间的函数,f(t)t 的积分步骤中计算并存储在 curve->curve_points_pos.

所以,首先:停止考虑更新 m_model_mat,完全按位置计算。例如

m_model_mat = glm::translate(glm::mat4(1.f), 
                             curve->curve_points_pos[(i) % (curve->points_pos.size())]);

如果您还有一些其他转换,您也想应用 - 例如如果您想将其移离原点,请将其作为附加步骤编写。

其次:将i转换为浮点数,并在curve->curve_points_pos中的条目之间进行插值。所以:

const int i_integral = int(i) % curve->points_pos.size();
const int next_i_integral = int(i+1) % curve->points_pos.size();
const float i_fractional = fmodf(i, 1.f);
const auto curve_point = 
    curve->curve_points_pos[i_integral] * (1.f - i_fractional) + 
    curve->curve_points_pos[next_i_integral] * i_fractional;

m_model_mat = glm::translate(glm::mat4(1.f), curve_point);

那里有一些要解压的东西:

  • i 现在是一个浮点数,因此它可以描述 curve->points_pos;
  • 中条目之间的位置
  • 我假设线性插值(模型将在每对列出的点之间走一条直线),所以:
    • 每个位置可以分解为整数部分和小数部分;其中:
    • 积分部分标识模型当前在其间行走的两点——整数本身将标识它最近离开的那个点,并且隐含地,它正在走向下一个点;和
    • 小数部分表示它在这两点之间走了多远,例如如果小数部分是 .0 那么模型实际上还没有离开它的原点,如果它是 .9999 那么模型非常接近下一个点,如果它是 .5 那么模型恰好在两者之间的中间,等等;
  • curve_point 计算然后对该逻辑建模。

抛开观察:

  • 线性插值不一定是最好的插值,但它很容易理解和计算,如果你的点合理地靠近在一起,它可能是可以接受的;但是
  • 如果你的点真的靠得很近,你甚至可以一起放弃插值,只使用积分部分作为直接点查找。然后你的模型会在每个点花费正确的时间后从列出的点到点扭曲,但如果你的点非常接近那么这仍然可以接受。