衝突判定
Minecraftの衝突判定は至ってシンプル: レイトレーシングによる衝突判定ではなく、単にプレイヤーを各座標軸に沿って順次移動させている。
注意点として、Minecraft内の物理演算の更新レートは毎秒20tickである。プレイヤーの動きと衝突の更新は1tickごとに行われる。
当たり判定
当たり判定は1つ以上のバウンディングボックスから成る。バウンディングボックスとはX/Y/Zそれぞれの座標の最小/最大値で定義されている、単純な直方体。
衝突判定は通常、エンティティとブロック両方が関係する: エンティティ同士/ブロック同士では通常は衝突判定は行われない。
- プレイヤーのバウンディングボックスは1つで、大きさは 0.6×1.8×0.6 m3。位置判定は底部中央(F3で確認できる)。
- ブロックの当たり判定はより複雑(リストを参照)。
注: 「ヒットボックス」はプレイヤーがクリック(エンティティへの攻撃/ボタンの使用/ドアの開閉など)できる範囲のこと。当たり判定と重なっているとは限らない。
衝突判定の順
毎tick、プレイヤーの速度の更新後、以下の手順で衝突判定が行われる:
- プレイヤーをY軸方向に動かす。下方移動中に垂直方向の当たり判定が検出された場合、プレイヤーは地面に接しているとみなされる。
- プレイヤーをX軸方向に動かす。
- プレイヤーをZ軸方向に動かす。
- プレイヤーが地面に接していて壁に衝突した場合、高さが0.6m以下ならその壁に上れる。
垂直方向の衝突判定(Y)
垂直方向の動きは水平方向の動きよりも先に処理される。このため:
- ブロックの判定内から出た1tick後でもジャンプできる。ブロック縁からずらしができるのはこれが理由。
- ブロックに着地するには、ジャンプの最後のtickにプレイヤーのバウンディングボックスがそのブロックの表面と重なっている必要がある。
床か天井にぶつかると、垂直方向の速度は0になる。
水平方向の衝突判定(X/Z)
X方向がZ方向よりも先に処理されるため、壁の角での衝突判定は方向によって異なる。
この現象は、速度が大きい場合により顕著になる。
「X方向」のジャンプと「Z方向」のジャンプの区別が重要となる:
- X方向は東西向きのジャンプを指す。壁の角を避けるのが難しく、壁から離れた所でジャンプしなければならない。
- Z方向は南北向きのジャンプを指す。壁の角に引っかかりにくく、サイド系のジャンプなら助走の角からずらしができる。
ジャンプの方向はF3で確認できる。
一般にサイド系ジャンプはZ方向の方がより直感的で簡単とされているが、猶予はX方向の方が大きい。
- Z方向のサイドは直線ジャンプと非常に類似している(最適な動きをすると想定)。サイドの距離を直線ジャンプに変換するには、距離を1.2増やしてtierを1上げれば良い。例として、3マスサイドは「4.2+0.25」に等しい(構築は不可能だが、このように比較すると分析に有用)。
- X方向のサイドには相当する直線ジャンプは存在しない。Z方向のサイドと比較すると、判定が1tick「ずれて」いる(壁の衝突判定の開始/終了が1tickずつ早い)。このずれによって使用できる助走距離は減少するが、通常はプレイヤーの速度はジャンプ開始時よりも終了時の方が高いため、助走効率はより高くなる。
一部のジャンプは、特定の方向でのみ可能(例として、2マス助走3マスサイドはX方向でのみ可能)。
1.14+
1.14で衝突判定が変更された。どちらの方向が先に処理されるかはプレイヤ-の速度に依存するようになった。
- プレイヤーのZ速度がX速度よりも大きい(絶対値基準)場合、衝突判定の順はY-X-Z。
- それ以外では衝突判定の順はY-Z-X。
ほとんどの場合において、全ての当たり判定がX方向のように感じられるようになった。ただし、壁の角を斜めに通るようなジャンプは、以前とは大きく異なる。