motoh's blog

主に趣味の電子工作やプログラミングについて書いていきます

Unityで運動量保存の法則を確認

高校で習った物理で、式の上では理解していても、実際に確かめたことはないものが多いですよね。そのような物理現象を、Unity物理エンジンで確かめたらおもしろいのではないかと思い立ちました。(物理を習ったのは大昔で、Unityも初心者なので、いろいろ突っ込みどころがあるかもしれません。)

今回は運動量保存の法則を確認します。運動量保存の法則についての資料はインターネット上にもたくさんありますが、私が参考にしたのはこちらのページです。
 2物体の反発係数 ■わかりやすい高校物理の部屋■

 

 

反発係数<1の場合

まずは、反発係数=0.6で試します。物体1と物体2の質量は等しく1kgとし、物体1の初速v1=10m/s、物体2の初速v2=3m/sとします。【A

 

f:id:mzmlab:20190203105720g:plain

 

衝突前の運動量: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】

f:id:mzmlab:20190203110100g:plain

【B-2】

f:id:mzmlab:20190203110151g:plain

【B-3】

f:id:mzmlab:20190203110221g:plain

 

反発係数=1、物体1の質量が非常に大きい場合

最後に、反発係数=1で、物体1の質量が非常に大きい場合です(1000kgとした)。
衝突後の物体1の速度v’1と物体2の速度v’2がそれぞれ、
v’1 ≒v1
v’2 ≒ -v2 + v1×2
となることを確認します。【C】

 

f:id:mzmlab:20190209120648g:plain

  

物体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オブジェクト設定

 今回作成した主なオブジェクトの設定を記載します。 

■物体1Sphere)のコンポーネント設定(記載なしのものはデフォルト)

コンポーネント 設定 備考
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()で設定する。

 

■物体2Sphere)のコンポーネント設定(記載なしのものはデフォルト)

コンポーネント 設定 備考
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()で設定する。

 

■物体1、2のC#スクリプト

物体1のスクリプトを載せます(物体2のスクリプトも同じ)。

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;
    }
}