使用增量时间在 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
计算然后对该逻辑建模。
抛开观察:
- 线性插值不一定是最好的插值,但它很容易理解和计算,如果你的点合理地靠近在一起,它可能是可以接受的;但是
- 如果你的点真的靠得很近,你甚至可以一起放弃插值,只使用积分部分作为直接点查找。然后你的模型会在每个点花费正确的时间后从列出的点到点扭曲,但如果你的点非常接近那么这仍然可以接受。
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
计算然后对该逻辑建模。
抛开观察:
- 线性插值不一定是最好的插值,但它很容易理解和计算,如果你的点合理地靠近在一起,它可能是可以接受的;但是
- 如果你的点真的靠得很近,你甚至可以一起放弃插值,只使用积分部分作为直接点查找。然后你的模型会在每个点花费正确的时间后从列出的点到点扭曲,但如果你的点非常接近那么这仍然可以接受。