delta-timeについて

kivyのClockのところを読んでいたら、コールバックの引数にdt(delta-time)を渡していた。

んで、dtってなんだろうって調べた。

これは前のフレームとの時間差らしい。

だから、はやさ v pix/sで進ませたければ、そのポジションに前の時間から今の時間の間に進む距離を足せばよいので、

(呼び出される瞬間の位置) = (前の位置) + v*dt

となる。

こっからは自分で考えたんだが、
加速度を用いて
x+=の形にできないだろうかと。

ここで、さっきの式の v*dtはdxであるので(微分のあれ)

 dx = x_{n} - x_{n-1}

こういう関係が成り立っていることがわかる。

これらを考慮すると、先ほどの v*dtは

 dx = v * n * dt + x_{0} - (v * (n-1) *dt + x_{0})

から導き出すことができる。

これを同様にして、加速度を含んだ積分から導き出した物理の公式、

 x = \frac{1}{2}at^{2} + vt + x_{0}

を用いて表してみれば、dxが出ると思った。

よって、

 dx = \frac{1}{2}at_{n}^{2} + vt_{n} + x_{0} - (\frac{1}{2}at_{n-1}^2+vt_{n-1}+x_{0})

コイツに

 t_{n} = n×dt

を代入すると、

 dx = \frac{1}{2}a(2n-1)dt^{2}+vdt

nが消えないので、
x+=の形では表せないようだ。

コード書くときは位置の変数に公式から出した値をぶち込むしかなさそうだ。

ただし、こんな書き方はある

In [19]: def test(dt, v, a):
    ...:     if 10%dt != 0:
    ...:         return
    ...:     x = 0
    ...:     for i in range(10//dt):
    ...:         x += (1/2*a*(2*float(i+1)-1)*dt**2+v*dt)
    ...:     print(x)
    ...:

In [20]: test(2,3,4)
230.0

In [21]: test(5,3,4)
230.0