さっきの偏差射撃の値のロジックについて
まだ正しいかも確かめていないけど、覚えているうちに書く
ところでsqrt()は重いって聞いたけど、これTick()毎に実行して大丈夫かな
基本ベクトルは考えず、距離を考える
基本的に大文字はベクトル、小文字はスカラ
また、a = |A|
と表記(ベクトルの長さを小文字で表現)
半径が時間に比例する2つの円を考える
片方の円をC1, 半径r1 = st, 中心O(原点),
もう片方をC2, 半径r2 = vt, 中心L
とする
円の位置と半径の値がいい感じだと、2つの円の交点が2つできる
これをP, Qとし、直線LOとPQの交点をXとする
このP, Qっていうのは、
「Oから速度s、Lから速度vの弾が発射され、それらが時間tのときに衝突するとしたらこの位置」
っていう点
次に、自機のパラメータを
位置O, 弾速s
敵のパラメータを
位置L, 速度V
Vと直線LOのなす角をθ
とし、さっきの円と同じように考える
(r1 = st, r2 = vt)
弾が敵に当たる場合、点P(またはQ)は敵の移動経路上(L+V*k )にある必要がある(kは正の実数)
このとき、三平方の定理から考えて
|PX| =
√( r1^2 - |OX|^2 ) = √( r2^2 - |LX|^2 )
となる
自機から発射された速度sの弾が時間tに敵に当たるとすると
r1 = st, r2 = vt, |LX| = vtcos(θ)となり
√( (st)^2 - |OX|^2 ) = √( (vt)^2 - (vtcos(θ))^2 )
となる
|OX|のとる値は3パターンある
|OX|
= l - |LX| ( θ <= 90 && l >= |LX| , OXLがこの順で直線状に並ぶ)
= |LX| - l ( θ <= 90 && l < |LX| , XOLがこの順で直線状に並ぶ)
= l + |LX| ( θ > 90 , OLXがこの順で直線状に並ぶ)
よって
|OX|^2
= ( l - |LX| )^2 ( θ <= 90 )
= ( l + |LX| )^2 ( θ > 90 )
これをtについて解くと
θ <= 90°のとき、
t = (lvcos(θ) ± l√(v^2(cos^2(θ)-1) + s^2)) / (v^2 - s^2)
θ > 90°のとき、
t = (-lvcos(θ) ± l√(v^2(cos^2(θ)-1) + s^2)) / (v^2 - s^2)
となる