弾道計算
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 秒となっています。
弾速 $v$ も重力加速度 $g$ の影響を受け、下方に加速するので再計算されます。
\[v_{i+1} = v_i + g \cdot\Delta t\]衝突判定
衝突の判定は砲弾の 0.1 秒刻みの軌道について行われます。 具体的には軌道の計算で示した $p_i$ と $p_{i+1}$ を結ぶ線分上に、 干渉するエンティティ (車輌、オブジェクト、地形) が存在すれば衝突とみなされます。
衝突判定の詳細についてはまた別の機会に解説する予定です。