2段ジャンプの最大高と最大幅跳び距離(解説)

問題はこちら:

答え:高さは16m、幅跳びは8m


 今回の2段ジャンプの仕様で、キャラクタは最大16mの高さまで到達でき、8mの距離を横跳びする事ができます。そして双方共に1回目のジャンプをした直後に2回目のジャンプをすると実現できます。なぜそういうタイミングなのかを含め解説します。

解説1:自由落下ジャンプの式

 まず座標を整理しましょう。キャラクタの初期位置を(0,0)とし、横方向をX軸、上方向をY軸と定めます。キャラクタは1秒間に2m横移動できるので、横方向の速度Vxは2m/sです。ジャンプするとY軸方向の移動が伴います。飛び上がった瞬間の初速は不明なのでVy(m/s)としておきます。

 キャラクタのジャンプ時の滞空時間は2秒です。世界の重力加速度gは8m/s²で一定なので、この滞空時間になれる初速Vyが一意にありそうですよね。まずはそれを確定してしまいましょう。

 地面から高さhにいるキャラクタが初速Vyで飛び上がった時、時刻tでの高さ座標y(t)はいわゆる自由落下の式で表現する事ができます:

 キャラクタは飛び上がって2秒後には再び同じ高さにいるので、上式でy(2)=0が言えます。ここから必要な初速vyを求める事ができます:

初速が重力加速度と同じだと2秒間飛び上がれるのがわかりました。これを元の式に代入すれば滞空時間が2秒の自由落下式が作れます:

t=2を入れると元の高さy(2)=hに戻ってますよね。この式をベースに2段ジャンプ時の振る舞いを考えてみましょう。

解説2:2段ジャンプした時の高さと滞空時間

 キャラクタはジャンプし空中にいるどのタイミングでも2回目のジャンプができます。その時の飛ぶ能力は1回目と同じですが、2段ジャンプした時点でのキャラクタの速度に加速するという仕様でした:

 1回目のジャンプからt=t1秒に2段ジャンjプを開始するとして、その時のキャラクタの速度v1は先のy(t)を微分すると求まります:

これに2段ジャンプを開始した時に加わる速度vy=gを加えれば初速v2が求まります:

 では2段ジャンプで到達可能な最大高を求めてみましょう。まず1回目のジャンプからt=t1までは普通のジャンプなので、その時点での高さy1は、

です。t=t1で2段ジャンプを開始。初期位置がy1、初速がv2なのに気を付けると、2段ジャンプを開始してからの経過時間tでの高さy2は、

式をちまちまと整理すれば下段のように表されます。

 この式には2段ジャンプ開始時の時刻t1と、2段ジャンプ開始してからの経過時刻tの2つの変数が含まれています。ここからy2が最大となるt1とtを求めてみましょう。

 大括弧内が2次式なので平方完成してみます:

 大括弧の外にマイナスがある事から、大括弧内をなるべくマイナス方向に大きくする事を考えます。大括弧内のべき乗項は0以上なので、ここは0に抑えたい。1回目のジャンプの範囲は0≦t1≦2秒ですから、全体を-2すれば-2≦(t1-2)≦0を得られます。tは0以上なのでべき乗項はt1の範囲で0になれます。という事は2t1-4をt1の範囲でなるべくマイナス方向に持っていけば良い事になります。つまりt1=0です。この時べき乗項はt=2で0になります。

 t=2、t1=0の時、

16mの高さにあるブロックに飛び乗れる事になります。

解説3:最大幅跳びはy2(t)=0から

 キャラクタは横方向に2m/sの速度で移動できます。ジャンプ中も横移動の速度は変わらないため、この2段ジャンプで飛べる最大の幅跳び距離は、滞空時間×2m/s で求める事ができます。

 2段ジャンプした時の滞空時間は、着地時、つまりy2(t)が0になった時の時間を求めれば良いわけです:

滞空時間はt1+tである事に注意して、左辺にt1+tを抽出します:

 欲しいのは最大滞空時間なので右辺のルートはプラス側を採用します。またルート内が一番大きい時が最大なのでt1=0である事がわかります。以上から、

最大滞空時間は4秒である事がわかりました。よって最大幅跳び距離Dは、

8mとなります。

 つまり今回の仕様での2段ジャンプは1回目のジャンプをした直後に2回目のジャンプをすると高さも飛び幅も最大になるという事です。

 実際に今回の仕様の2段ジャンプをUnityで実現してみました:

(動画は少し早回しをしています)

 1回目のジャンプから1.5秒(青)、1.0(緑)、0.5(赤)、0.0(白)後に2段ジャンプしています。今回導いた通り、白色のジャンプが最も高く、そして最も幅跳びできているのがわかりますね。

 2段ジャンプの仕様はゲームによって様々です。2回目のジャンプをした時に1回目で得た速度を無視するというのもありますし、2回目のジャンプの能力を下げて過度に優位にならないように調整する事もあります。色々なジャンプを数学の式で記述して、それをプログラムにおこす。そんな事を日常的にしているのがゲームプログラマなんです。

ではまた(^-^)/

この記事が気に入ったらサポートをしてみませんか?