0から始めるUnity物理演算③力と加速度
今回は第3回。
加速度と力の大事な関係🖤を紐解いて行きましょう!
Rigidbody.AddForce()についても解説します。
中学レベルの数学で全然クリアーできますよ♪
【Unity道場】物理シミュレーション完全マスターで勉強したことを元にしています。
目次になります。
今日はかなり内容が多いですが、すごく知的好奇心をくすぐられる内容のはずです!
毎度毎度、講義のスライドを見ながらですと理解しやすいです!
早速、力と加速度にどんな関係があるのか、確認しましょう
力と加速度はほぼ同じ。
第1回では、このような図をお見せしました。
「加速度さえわかれば積分して速度も位置もわかっちゃう!」のでした。
しかし、そもそも加速度を測定する方法はあるのでしょうか?また、加速度を変化させるにはどうすれば良いのでしょうか。
答えは、今から300年以上前に見つかっています。
運動方程式
1687年にニュートン博士が発表したこの方程式は、「運動方程式」という力学で最も重要な式です。
これはシンプルですが「加速度は力に依存する」ということを示します。
右側に質量がありますが これは「動きにくさ」と覚えてください。後半で詳しく解説します。
とにかく今は加速度が欲しいので、式をちょいと変形します.
ほら、加速度を求める式が出てきましたね。
この式から、「力を加えると加速度が大きくなる」ことがわかります。
物体に力を加えると、その分加速度が増える。だから、物体は速度を持ち、位置が変化するんですね〜。
ところで、Unityでの物理シミュレーションにおいて、質量はそんなに重要ではありません。
だって、加速度や力の大きさは変わるけど、質量はほとんど変化しないから。
なので、ここからは加速度と力はほぼイコール、同じ意味のもの!と考えることにしましょう。
力を足してみよう
力はベクトル(大きさと、向きを持つ値のこと)です。
ベクトルは足し算ができるので、力も足し算が可能です。
で、ここで大事なのは rigidBodyの関数AddForce()は単純に「足し算」しかしていないので、
例えば摩擦力、重力、浮力が働いていて、その影響を計算する時
- AddForceで1個ずつ足す
- ベクトルの足し算で、3つの力をまとめて足す→AddForceでその合力を足す
この2つの方法は、ほぼ同じことです。つまり、AddForce()は軽い関数だから、好きなように書けば良いのです!
質量Massを詳解
ここからは講義にはない話ですが、力学で大切な話なので解説しますね。
今まで使ってきた質量、Massとは、そもそもどういう意味の値ですか?
実は「重さ」と言う意味ではありません!
「物体の動きにくさ」?半分正解です〜。
実は、意味が2つあります。数値としては同じなんですが。
「動きにくさ」としての質量
1つは、「動きにくさ」。
massが大きいほど、動かすときに大きな力が必要です。安原さんは「宇宙空間で小石を押すとすぐに飛んでくけど、車を押して動かそうとすると大きな力が必要」と例を出していらっしゃいました。この意味で使う質量を特に「慣性質量」と呼びます。
重力と質量
2つ目は、「重力加速度 gravityScaleによる影響の受けやすさ」。
質量を持つ物体は、等しく重力場の影響を受けます。重力場は目に見えない「風」のようなもので、質量を持つ物体だけがこの風の流れを感じて、ストンと落下しちゃうんですね。この時の質量を「重力質量」と特に呼びます。
もっと詳しくいうと、力学には「場の理論」というものが存在していて、「場」を感じるものは「場」を生み出す というルールがあるんです。つまり、質量を持つ物体は重力場を生み出しているんです。あなたも、私も、そのスマートフォンも、自分の方に引き寄せる流れ「重力場」を発生させているのですが、質量が小さいから流れも小さくて済んでいますww ところが、地球とか月になると、まぁ質量が大きいです。だから我々は強い重力場によって地面に縛り付けられているんですね。
勘違いして欲しくないのでもう一度言いますが、慣性質量も、重力質量も、意味が違うだけで値はおんなじです!
で、これをまとめると「質量が大きいほど 動きにくくて、大きな重力を受ける」と言うことなのですが、一つ疑問が生まれませんか?
疑問を解決しよう
「じゃあさ〜、質量をめっちゃ大きくしたら、大きな重力がかかって物体ってめっちゃ早く落下するの?それとも、めちゃんこ動きにくいから 落下しないで止まっちゃうの?」
この疑問に答えるのが、やはり「運動方程式」です!
力に関すること、というか、運動に関することは大抵この方程式を変形していくと解決します!
早速いじっていきましょう!
物体には重力のみかかっていると仮定します。(つまり、空気抵抗とかナシ。)
まず運動方程式は、
ここで重力は質量mと重力加速度gの掛け算なので、
よって運動方程式はこう書ける
⚠️ここで、左辺ののは重力質量、右辺のは慣性質量ですね!
で両辺割って
つまり、落下の運動について、加速度は「質量の影響を受けない」んですね!
よって答えは「質量がどんなに大きく(小さく)なっても、落下の加速度は変化しない。よって、落ちる速度の変化は常に一定である!」
でもこれ、結構不思議じゃないですか?全く違う意味の「慣性質量」と「重力質量」が、数式上は打ち消しあう......。偉大なるアインシュタイン博士は、この式変形に「あれ?なんだこれ?」と疑問を呈したことで、相対性理論発見のきっかけを掴んだのです!
第1回の物理演算スクリプトを改良
ちなみに、第1回で実装した myRigidbody のスクリプトでは「慣性質量」の影響を考えていなかったので、
「質量を大きくすると、落下スピードが早い!」と言う現実にそぐわない状況になっています。
⚠️UnityのRigidbodyは、きちんとそれを考慮して計算しています。
⚠️Drag、空気抵抗のようなものを設定するとまた話は変わります。
これを解決するために、第1回のコードを書き直してみました!
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyRigidbody : MonoBehaviour { public Vector3 acceleration; //加速度。これがないと物理シミュレーションは始まらない。 public Vector3 velocity; //速度。微小時間dtの間の加速度を、積分でいっぱい集めると速度になる public Vector3 position; //位置は速度の時間積分 public float mass; //質量に相当。 public Vector3 gravityScale; //重力加速度 const float dt = 1f/60f; //微小時間dtに相当する部分 public void AddForce(Vector3 force) { //変更部分開始------------------------------------ acceleration += force / mass; //慣性質量が働く分、力をmassで割ってから加速度に入れてあげます! //変更部分開始------------------------------------ } void FixedUpdate () { //変更部分始め---------------------------------------- acceleration += gravityScale; //運動方程式から、両辺m(mass)で割った結果を使います! velocity += acceleration * Time.fixedDeltaTime; //積分に使う微小時間を、デルタタイムに変更! position += velocity * Time.fixedDeltaTime; //速度を時間積分 //変更部分終わり--------------------------------------- //地面と接触したら、跳ね返る表現。 //地面との衝突判定の代わりに、地面に近いところまで落ちたら速度を反転している。 if(position.y < 0.5f) { velocity = -velocity; } transform.position = position; acceleration = Vector3.zero; //加速度をリセット。加えた力の影響を最後にリセット } }
今日のまとめ
- 加速度と力はほぼ同じ意味
- 力は足し算できる。計算が軽くて、たくさん足しても破綻しない!
- 質量は案外奥が深いが、「動きにくさ」と覚えておけば良い。
以上です!