WoT の砲弾は主砲の付け根から主砲の方向に向けて発射され、 発射された砲弾は重力の影響を受けて放物軌道を描き着弾します。 実際の着弾判定はサーバ側の処理になりますが、 照準中の着弾点予測のため、クライアントでも同様の計算が行われます。

モジュール

砲弾の軌道の計算は VehicleGunRotator.VehicleGunRotator クラスの __getGunMarkerPosition() の中で行われています。

砲弾パラメータ

砲弾の特性値には、 speed (弾速)、 gravity (重力加速度)、 maxDistance (最大到達距離) があり、これらは定数です (弾速は初速度)。

重力加速度は、現実の世界では一定値ですが、 WoT では放物軌道の調整のため、砲弾の種類によって異なる値が設定されています。

軌道の計算

砲弾は放物軌道を描きますが、車輌や地形その他のオブジェクトとの衝突判定処理のため、 0.1 秒刻みで計算される折れ線状の軌道として処理されます。 0.1 という値は定数 SERVER_TICK_LENGTH として constant モジュールで設定されている値です。

現在の砲弾位置 $p_i$ に対して 0.1 秒後の砲弾位置 $p_{i+1}$ は以下のように求められます。 $p_i$ は前回計算時の砲弾位置 (座標)、$v_i$ は弾速 (ベクトル)、$g$ は重力加速度 (ベクトル) で、 $\Delta t$ は SERVER_TICK_LENGTH で 0.1 秒となっています。

\[p_{i+1} = p_i + v_i\cdot\Delta t + \frac{1}{2} g \cdot \Delta t ^2\]

弾速 $v$ も重力加速度 $g$ の影響を受け、下方に加速するので再計算されます。

\[v_{i+1} = v_i + g \cdot\Delta t\]

衝突判定

衝突の判定は砲弾の 0.1 秒刻みの軌道について行われます。 具体的には軌道の計算で示した $p_i$ と $p_{i+1}$ を結ぶ線分上に、 干渉するエンティティ (車輌、オブジェクト、地形) が存在すれば衝突とみなされます。

衝突判定の詳細についてはまた別の機会に解説する予定です。