Unity勇者の冒険の書

Unityで学んだことや便利なものなど作ったら紹介します

【Unity勇者の奮闘記】Unityで物理の勉強6(指定した地面の位置に落ちる初速を計算する)

こんにちは。

前回は、初速を加えた時に落ちる位置を予測しましたね。

www.lightgive.net

今回は前回の逆で指定した位置に落とすように初速を計算するようにしたいと思います。

f:id:LightGive:20171031000706g:plain

とりあえず、シーンはこんな感じす。
現状は、発射する座標からクリックした位置の方向のベクトルに直接飛んでいくようにしています。これでは見てもらったら分かる通り、重力があるので指定した位置に到着する前に落ちて、少し手前の下に落ちていますね。これではだめです。

最終的にはクリックした位置に指定したn秒数後に落ちるようにしていきたいと思います。

今回使う変数はこんな感じです。

  • sp(球体を発射する座標)
  • ep(落とす座標)
  • t(到着するまでの時間)
  • g(重力加速度)


まず初めに決めておかなければいけないのが、その位置に到着するまでの時間です。これが無いと、無数にパターンがあるので、今回はtとして1秒で指定の位置にたどりつくようにしていきます。

とりあえず比較的簡単なx,zを求めて生きたいと思います。
x,yは等速直線運動なので、距離÷時間で初速が出ます。

多分小学生の時にやったと思いますがあの「きはじ」がとうとう役に立ちますね。笑
f:id:LightGive:20171031001412p:plain

ので、yを除くとこんな感じになると思います。

var x = (ep.x - sp.x) / t;
var z = (ep.z - sp.z) / t;
var vec = new Vector3(x, 0.0f, z);

f:id:LightGive:20171031002122g:plain


まだyが0なので指定の座標まで飛ばないので、初速のyを求めていきたいと思います。
いつもの鉛直投げ上げの公式を使います。

今回はv0を求めたいので、それ以外を埋めていきます。

球体が発射される位置は0ではないので公式にy座標を開始位置の分ずらすようにしておきます。

 y = v0t -{\frac{1}{2}}gt^2 + sp.y

v0t = y + {\frac{1}{2}}gt^2 - sp.y

v0 = {\frac{g}{t}}+{\frac{1}{2}}gt - {\frac{sp.y}{t}}

こんな感じに式を変形できました。
後はこれをプログラムにしていきます。

こんな感じになりました。


これでテストしてみたいと思います。

地面に落ちるまでの時間:1秒
f:id:LightGive:20171031093809g:plain
地面に落ちるまでの時間:2秒
f:id:LightGive:20171031095137g:plain

うまく計算出来ているみたいですね。
これで敵のロケットとか、大砲とか色々使えそうですね。

では。('_')