Unity

【Unityで物理】空気抵抗による物の落下速度をかんたんに再現してみた【重量や断面積を考慮したコード】

本記事内には、アフィリエイトリンクを含む場合があります

Unityは仮想の遊び場であり、実験場です。

しかし、デフォルトのワールド空間は地球と同等の状況ではありません。

例えば、空気抵抗はありません。

どんな形状のモノ、どんな重さのモノを落下させても、落下速度は同じです。

本記事では、

それを少し現実の挙動にするために、空気抵抗を適用させてみます。

■参考になった記事がこちら

↑の記事にあるコードは、

F=-kv Fは物体に及ぼす空気抵抗の抗力、vは物体の移動速度、kは空気抵抗係数(>0)

重量によって、速度vは異なるので、
その結果、空気抵抗の強さが変わる式です。

重量が重いものほど、抵抗が弱くなるような力がはたらく処理ということでしょうか・・・?

通常、速度が上がるほど、空気抵抗は強くなるはず。  
こちらの記事によると、
Unityのrigidbody.velocityは次の項式で決まるようです。

rigidbody.AddForce(Vector3.forward * 0.1f, ForceMode.Force); rigidbody.velocity += (Vector3.forward * 0.1f) * Time.fixedDeltaTime / rigidbody.mass; と等価のようです。

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軸にこの反対方向への力(抵抗)が加わります。

重いとvelocityが小さい → 速度の反対にかかる力が小さくなる → 落下速度の減速が小さい

なんだかこんがらがりそうですね。

しかし、これは厳密ではなく、
弾丸などの高速で動くモノは、次の項式で空気抵抗を実装せよ、とありました。

F = \cfrac{\rho C S v^2}{2}
ρは空気密度、Cは空気抵抗係数、Sは断面積、vは物体に対する空気の相対速度

この計算式であれば、
重量(速度)の他、断面積も考慮されて、空気抵抗が計算されます。

早速、次のスクリプトを作り、アタッチしてみると、冒頭の動画のようになりました。
(注:正しい計算である保証はありません。気になる方だけどうぞ^^;)

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA