Unityは仮想の遊び場であり、実験場です。
しかし、デフォルトのワールド空間は地球と同等の状況ではありません。
例えば、空気抵抗はありません。
どんな形状のモノ、どんな重さのモノを落下させても、落下速度は同じです。
本記事では、
それを少し現実の挙動にするために、空気抵抗を適用させてみます。
■参考になった記事がこちら
↑の記事にあるコードは、
重量によって、速度vは異なるので、
その結果、空気抵抗の強さが変わる式です。
重量が重いものほど、抵抗が弱くなるような力がはたらく処理ということでしょうか・・・?
通常、速度が上がるほど、空気抵抗は強くなるはず。
こちらの記事によると、
Unityのrigidbody.velocityは次の項式で決まるようです。
rigidbody.velocityに関しては
AddForceしても、重量が重いほど、速度の増加は小さいということですね^^;
つまり、速度vが遅くなるほど、
抵抗F=-kvは、負→0に近づき、 速度の反対方向に加わる力が小さくなります。
結果、早く落ちます。
コードを転載させていただくと、次の通り。
このスクリプトをオブジェクトにアタッチし、
coefficientに適当な正の値を入れると
”重量が重いほど落下が早い”という結果が得られます。
using UnityEngine; using System.Collections; public class AirResistance : MonoBehaviour { public float coefficient; // 空気抵抗係数 void FixedUpdate() { // 空気抵抗を与える rigidbody.AddForce(-coefficient * rigidbody.velocity); } }
rigidbody.AddForce(0, 0, 0, ForceMode.Force)が通常の記述ですが、
要素が1つなので、全3軸にこの反対方向への力(抵抗)が加わります。
なんだかこんがらがりそうですね。
しかし、これは厳密ではなく、
弾丸などの高速で動くモノは、次の項式で空気抵抗を実装せよ、とありました。
ρは空気密度、Cは空気抵抗係数、Sは断面積、vは物体に対する空気の相対速度
この計算式であれば、
重量(速度)の他、断面積も考慮されて、空気抵抗が計算されます。
早速、次のスクリプトを作り、アタッチしてみると、冒頭の動画のようになりました。
(注:正しい計算である保証はありません。気になる方だけどうぞ^^;)