次回: TNTの座標計算 #2 - 複数の装薬 - えいまぼJEブログ
結論
1つの装薬が図1のような位置で爆発したとき、弾頭の速度・位置は以下の式で表されます。
ただし、
- : 装薬と弾頭との距離のx成分
- : 装薬と弾頭との距離のy成分
- : 装薬と弾頭との距離のz成分
- : 装薬の爆発を受ける前に持っていた速度のx成分
- : 装薬の爆発を受ける前に持っていた速度のy成分
- : 装薬の爆発を受ける前に持っていた速度のz成分
- : 速度のx成分
- : 速度のy成分
- : 速度のz成分
- : x座標の初期座標 (装薬の爆発を受ける点)
- : y座標の初期座標 (装薬の爆発を受ける点)
- : z座標の初期座標 (装薬の爆発を受ける点)
- : x座標
- : y座標
- : z座標
です1。
※z座標・速度のz成分は図に描画していません(できません)。
導出
Minecraft内での処理
Minecraft内のTNTの座標・速度演算は図2のようになっています。 ①はy軸専用の処理です。x, z軸は①がありません。
なお、この図はMinecraft Java Edition 1.17.1のソースコードに基づいて描かれました。ソースコードを見たい場合は逆コンパイルするか、Technical Minecraft Wikiaを覗いてみてください。Technical Minecraft Wikiaのコードは1.17.1と変わりませんでした。ですので、これより古いバージョンでも使える数式だと思われます。 統合版でも適用できるかはわかりません2。
速度のx成分
まずは一番簡単な速度のx成分を導出します。図3は図2から速度のx成分の計算に必要な処理のみを抜粋したものです。
図3から、漸化式が導けます(式1)。
式1を解くと、式2のようになります。
式2の を に、 を に、 を に置き直して完成です(式3)。
速度のy成分
次は速度のy成分を導出します。図4は図2から速度のy成分の計算に必要な処理のみを抜粋したものです。
図4から、以下の漸化式が導けます(式4)。
式4を特性方程式などを使って解くと、式5のようになります。
式5の を に、 を に、 を に置き直して完成です(式6)。
速度のz成分
速度のz成分はxと全く同じです。 () を () に置き換えるだけで成立します。
x座標
次は座標xを導出します。図5は図2からx座標の計算に必要な処理のみを抜粋し、式を導出しやすいよう処理の順番を変えたものです。
図2の時点では座標の更新(②)が最後ではないので、そのまま式を導出できません。そこで、③をループの一番最初に持っていき、その分を④で補います。
導出は、
- 始めは④がなかったものとして計算
- 最後に④を考慮
という方針です。
では、図5の②から漸化式を導きます。式7のようになります。
式7の は、意味合いとしては式2と等価ではありません。しかし、形は変わらないのでそのまま適用します(この意味はy座標を求めるときにわかります)。よって、式2を式7に適用した漸化式は式8のようになります。
式8は式9のように変形できます。
式9を等比数列の和の公式を使って解くと式10のようになります。
ここで、④を展開します。式10で と置き直すと式11のようになります。
ここで式11の を に、 を に、 を に置き直して完成です(式12)。
y座標
最後は座標yを導出します。図6は式を導出しやすいよう図2の処理の順番を変えたものです。
ここからの導出はx座標と同様です。
図2の時点では座標の更新(②)が最後ではないので、そのまま式を導出できません。 そのため、③をループの一番最初に持っていき、その分を④で補います。
導出は、
- 始めは④がなかったものとして計算
- 最後に④を考慮
という方針です。
では、図6の②から漸化式を導きます。式13のようになります。
式13の は、意味合いとしては式5と等価ではありません。ここはx座標と違ってこのまま式5を適用できません。よって、ここで"図6の③・①における" を求めます。漸化式は式14になります。
式14を解くと、式15になります。
ここで式15を式13に適用します。漸化式は式16のようになります。
式16は式17のように変形できます。
式17を等比数列の和の公式などを使って解くと式18のようになります。
ここで、④を展開します。式18で と置き直すと式19のようになります。
ここで式19の を に、 を に、 を に置き直して完成です(式20)。
z座標
z座標はxと全く同じです。 () を () に置き換えるだけで成立します。
弾頭の爆発座標
この記事で導出した座標は弾頭TNT本体の座標になります。弾頭の爆発座標は y に 0.06125 (= 0.98 / 16) を加算した値になります。Carpet Modの/log explosions brief
で出る値は爆発座標なので、取り違えにご注意ください(1敗)。
前々回のブログ記事について
前々回のブログは1gtあとの速度を初速度としています。 そのため、式の形が今回とは違います。 「なんかよくわからんけど2%増しにすると値が合う」と書いたのは1gtあとの速度を初速度としたためだと思われます。
検証環境
Minecraft Java Edition 1.17.1-1.18.1