ゲーム開発中に、オブジェクトを一定距離移動させる場合に加減速移動をしたいとき、何フレーム加速して何フレーム減速すればいいのかわからず困った。
気合で計算したのでメモ。
問題設定
とあるオブジェクトを距離 d (ピクセル) だけ動かしたい。
この場合、等速移動であれば簡単だ。距離を速度で割ればよい。
ただ等速運動だと味気ないので加減速移動で指定距離を移動したいと考えたところ、途端に計算が難しくなった。
移動したい距離 d(ピクセル) は与えられて、加速度 a(ピクセル / フレーム^2) は自由に設定できる。この時、何フレーム目まで加速して、何フレーム目から減速すればいいのかわからない。
時間と速度の関係から考えてみる
仮に加速度を1(ピクセル / フレーム^2)とした場合の、速度と時間のグラフを以下に示す。
加速と減速の加速度の絶対値が同じだと考えると、このような2等辺三角形が描画できる。
距離 = 速度 × 時間 であるため、この3角形の面積が移動距離ということになる。
- 移動距離 = 最高速度 × 時間 ÷ 2
今回得たいのは時間であるため、移項すると、
- 時間 = 移動距離 / 最高速度 × 2 ・・・①
時間が分かれば、時間÷2が加速するフレーム数になるため、上記式が計算できれば問題が解ける。
最高速度は以下の式から求められる。
- 最高速度 = 加速度 × 時間 ÷ 2
今回は初速が0であるため、加速する分のみを考えればよい。この式を式①に代入すると、
- 時間 = 移動距離 / (加速度 × 時間 ÷ 2) × 2
- 時間 ^ 2 = 移動距離 / 加速度 × 4
- 時間 = √(移動距離 / 加速度 × 4)
これで移動距離と加速度だけで所要時間を求めることができた。
今回求めたかった加速するフレーム数は時間÷2なので、
上記式が、今回の問題に対する回答になる。
まとめ
今回求めた加速フレーム数だけ加速して、そこから減速することで、ほぼぴったり指定距離を移動することができた。
ただし、フレーム数が小数点になってしまった場合、フレーム数は整数しか取れないため、丸めると誤差が発生する。
その場合はあらかじめ目標位置を計算しておき、移動の最終フレームで目標位置をオブジェクトに代入することでズレを補正しよう。
ただズレが大きくなると若干瞬間移動したように見えるので、下記式で移動にかけるフレーム数を設定したうえで加速度を求めたほうが良いかも。
おそらく適当な加速度用いるよりは誤差が減少するはず。ただ誤差がなくなるわけではないので、少しでもズレると困る場合は目標位置の代入をやっておこう。