偏差射撃の実装について
目標
自機が移動する的に当たる弾を発射するために、適切な発射方向を計算する。
定義
太字の英数字はベクトル(e.g. $\mathbf{a}$).
位置$A$と$B$があったとき、$AB$は$A$から$B$へのベクトル。
$|\mathbf{a}|$はベクトル$\mathbf{a}$の長さ。
設定
自機と的がある。
自機は原点Oから弾速sの弾を発射し、 的は位置Lから速度$\mathbf{v}$で移動する。 $l := |OL|,$ $\theta :=$直線$OL$と$\mathbf{v}$の成す角度$(0 \le \theta \le 180[deg]).$
結果
弾を発射してから着弾するまでの時間$t$について、 $$t = \frac{l}{\pm s\sqrt{1-(\frac{|\mathbf{v}|}{s} \sin \theta)^2} - |\mathbf{v}|\cos \theta}.$$ となる。
$t \ge 0$のとき、弾が命中するときの的の位置は$L + \mathbf{v}t$であり、そこに向けて弾を撃てば命中する。
$t$が求められない場合や$t$が負である場合、どの方向に弾を撃っても的に当たらない。
計算
弾が発射され、時間$t$後に的に当たるときの位置を$P$とする。
このとき、 $$|OP| = st, |LP| = |\mathbf{v}|t.$$
$OL \perp PQ$となり、線分$OL$上にある位置$Q$を設定する。 $\angle POQ$の角度を$\theta’$とする。
$O, Q, L$は直線状にあるので、 $$|OQ + LQ| = |OL|$$ $$<=>st\cos\theta’ - |\mathbf{v}|t\cos\theta = l.$$
また、 $$|PQ| = st\sin\theta’ = |\mathbf{v}|t\sin\theta$$ $$<=> 1 - \cos^2\theta’ = \left(\frac{|\mathbf{v}|}{s}\sin\theta\right)^2$$ $$<=> \cos\theta’ = \pm\sqrt{1 - \left(\frac{|\mathbf{v}|}{s}\sin\theta\right)^2}.$$
上の2式より、 $$t = \frac{l}{\pm s\sqrt{1-(\frac{|\mathbf{v}|}{s} \sin \theta)^2} - |\mathbf{v}|\cos \theta}.$$
$t \ge 0$のとき、弾が命中するときの的の位置は$L + \mathbf{v}t$であり、そこに向けて弾を撃てば命中する。
$t$が求められない場合や$t$が負である場合、どの方向に弾を撃っても的に当たらない。
comments powered by Disqus