Unityで運動量保存の法則を確認
高校で習った物理で、式の上では理解していても、実際に確かめたことはないものが多いですよね。そのような物理現象を、Unityの物理エンジンで確かめたらおもしろいのではないかと思い立ちました。(物理を習ったのは大昔で、Unityも初心者なので、いろいろ突っ込みどころがあるかもしれません。)
今回は運動量保存の法則を確認します。運動量保存の法則についての資料はインターネット上にもたくさんありますが、私が参考にしたのはこちらのページです。
2物体の反発係数 ■わかりやすい高校物理の部屋■
反発係数<1の場合
まずは、反発係数=0.6で試します。物体1と物体2の質量は等しく1kgとし、物体1の初速v1=10m/s、物体2の初速v2=3m/sとします。【A】
衝突前の運動量:m1×v1 + m2×v2 = 1×10 + 1×3 = 13
衝突後の運動量:m1×v'1 + m2×v'2 = 1×4.4 + 1×8.6 = 13
となり、運動量保存の法則が成り立っています。
また、衝突前後の相対速度の比を求めると、
(8.6 – 4.4) / (3.0 – 10.0) = 4.2 / -7.0 = -0.6
となり、反発係数は設定した通りとなっていることがわかります。
反発係数=1の場合
次に、反発係数=1で試します。物体1と物体2の質量が等しい場合、衝突前後で物体1と物体2の速度が交換されます。
【B-1】
【B-2】
【B-3】
反発係数=1、物体1の質量が非常に大きい場合
最後に、反発係数=1で、物体1の質量が非常に大きい場合です(1000kgとした)。
衝突後の物体1の速度v’1と物体2の速度v’2がそれぞれ、
v’1 ≒v1
v’2 ≒ -v2 + v1×2
となることを確認します。【C】
物体1の速度はほとんど変わりません。物体2は衝突前の速度よりも大きな速度になって跳ね返ります。-v2の項はそのままの速度で跳ね返るという意味でわかりやすいですが、v1×2の項は、物体1の速度を2倍したものが加わるということでちょっと不思議ですね。
ちなみに衝突前後の運動量は、しっかり保存されています。
衝突前の運動量:m1×v1 + m2×v2 = 1000×3 + 1×(-5) = 2995
衝突後の運動量:m1×v'1 + m2×v'2 = 1000×2.984 + 1×10.984 = 2994.984 ≒ 2995
高校物理ではB-1だけ台車の模型での実演があった記憶がありますが、他のパターンは見たことがなかったので、作っていておもしろかったです。物理エンジンというだけあって、物理に忠実なんですね。
[付録] Unityオブジェクト設定
今回作成した主なオブジェクトの設定を記載します。
■物体1(Sphere)のコンポーネント設定(記載なしのものはデフォルト)
コンポーネント | 設定 | 備考 | ||||
A | B1~3 | C | ||||
Transform | Position | X | 0 m | |||
Y | 0.5 m | |||||
Z | 0 m | |||||
Sphere Collider | Material | Bounciness (反発係数) | 0.6 | 1 | 1 | MaterialはAssetとしてPhysic Materialを作成し、Sphere Colliderにドラッグ&ドロップして設定する。 |
Rigidbody | Mass | 1 kg | 1 kg | 1000 kg | ||
Use Gravity | チェックなし | 床を転がると減速してしまったので、無重力にした。 | ||||
Script | 初速 | 10 m/s | 10 m/s | 3 m/s | C#スクリプトのStart()で設定する。 |
■物体2(Sphere)のコンポーネント設定(記載なしのものはデフォルト)
コンポーネント | 設定 | 備考 | ||||
A | B1~3 | C | ||||
Transform | Position | X | 0 m | |||
Y | 0.5 m | |||||
Z | 10 m | |||||
Sphere Collider | Material | Bounciness (反発係数) | 0.6 | 1 | 1 | MaterialはAssetとしてPhysic Materialを作成し、Sphere Colliderにドラッグ&ドロップして設定する。 |
Rigidbody | Mass | 1 kg | 1 kg | 1 kg | ||
Use Gravity | チェックなし | 床を転がると減速してしまったので、無重力にした。 | ||||
Script | 初速 | 3 m/s | 1: 0 m/s 2: 3 m/s 3: -3 m/s |
-5 m/s | C#スクリプトのStart()で設定する。 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ball1BehaviourScript : MonoBehaviour { public float v0_z; //Z方向の初速 // Use this for initialization void Start () { //同一のGameObjectが持つRigidbodyコンポーネントを取得 Rigidbody rigidbody = GetComponent<Rigidbody>(); //初速を設定 Vector3 v0 = Vector3.zero; v0.z = v0_z; rigidbody.velocity = v0; } }