首先,我们需要了解更多关于物理的知识:
的 存在惯性(运动和/或旋转)? 强>
速度/方向是否立即或缓慢变化?
的 键驱动加速度或速度? 强>
按键/保持/释放时,速度/方向是否立即或连续变化?
的 有没有摩擦? 强>
如果在一段时间后没有按任何键,或者立即或从不按下,
的 现在该如何攻击这个 强>
先看看
通常用于更新物体位置/方向/速度。从那以后,其余的很容易......
例如,假设键驱动加速度,惯性存在,没有摩擦,并且您只有位置 p ,方向 alpha 和速度 v 二维信息。
p
alpha
v
dt
的 消除摩擦 v,omega 如果存在的话 强>
v,omega
只需将速度乘以摩擦力即可获得原始速度...... 的 这必须在加速计算之前完成!!! 强>
的 计算加速度 a,epsilon 从速度 v,omega 强>
a,epsilon
这很容易,只是按时间推导:
a(t)=( v(t)- v(t-dt))/dt epsilon(t)=(omega(t)-omega(t-dt))/dt
哪里 t 是实际的时间和 dt 是更新例程的时间步骤。该 a(t) 意味着实际价值和 a(t-dt) 表示上次更新的上一个值。所以如果你只获得位置信息,你可以做同样的事情:
t
a(t)
a(t-dt)
v(t)=(p(t)-p(t-dt))/dt a(t)=(v(t)-v(t-dt))/dt omega(t)=(alpha(t)-alpha(t-dt))/dt epsilon(t)=(omega(t)-omega(t-dt))/dt
对于角度增量 (alpha(t)-alpha(t-dt)) 你应该确保abs结果总是小于或等于180度,如果没有添加/删除360度直到它。
(alpha(t)-alpha(t-dt))
的 从中移除力场 a 如果存在的话 强>
a
例如,如果你有重力存在...等subbstract它。在加速度中唯一应该留下的是击键驱动加速凸起
的 解码击键 强>
这很容易,例如,如果您的运动模式类似于向左/向右转动并向前/向后移动,那么只需提取信息(+/-您的坐标系更正)。转弯在角加速度中直接可见 epsilon :
epsilon
if (epsilon>+ang_treshold) `D` is pressed; // turn left if (epsilon<-ang_treshold) `A` is pressed; // turn right
现在你只需转换你的运动加速度 a 进入方向,因此它成为你的对象的点对象与LCS(局部坐标系)轴:
lcs_a.x=(a.x*cos(alpha ))+(a.y*sin(alpha )); lcs_a.y=(a.x*cos(alpha-90deg))+(a.y*sin(alpha-90deg));
同样调查颠簸......
if (lcs_a.y>+mov_treshold) `W` is pressed; // move forward if (lcs_a.y<-mov_treshold) `S` is pressed; // move backward if (lcs_a.x>+mov_treshold) `E` is pressed; // move right if (lcs_a.x<-mov_treshold) `Q` is pressed; // move left
如果您的模拟是由速度驱动的,那么您将以相同的方式调查速度而不是加速度。阈值应该更小,但接近实际的键击加速度颠簸,以避免错过一些忘记摩擦的记录或什么永远......开始你可以使用 0 如果错误地检测到击键然后再增加一点......最安全的方法是绘制图形 a 作为时间的函数,当键处于活动状态时读取它的值...所以你实际上立即看到正确的值而不是猜测......
0