motoh's blog

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

Unityでモンキーハンティングの確認

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

今回はモンキーハンティングです。木の枝にぶら下がったサルに銃の照準を合わせ、引き金を引くと、銃声に驚いたサルが枝から手を放して落下するとします。このとき、銃弾は落下中のサルに必ず命中するという話です。物理の授業で教わりましたが、実験したことはありません。では、さっそくやってみましょう。【A

 

f:id:mzmlab:20190203223354g:plain

 

当たった!

ちなみに、弾丸はどんなに遅くても当たります。(地面に落ちるより前に当たる必要はある。)【B

 

f:id:mzmlab:20190203223448g:plain

 

モンキーハンティングを実際に試そうとすると、かなり大がかりな装置が必要ではないでしょうか。Unityなら数十分でできました。次は何を試そうかな~

 

[付録] Unityオブジェクト設定

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

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

コンポーネント 設定 備考
A B
Transform Position X 30 m  
Y 30 m  
Z 0 m  
Rigidbody Mass 1 kg  
Use Gravity チェックあり  

 

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

コンポーネント 設定 備考
A B
Transform Position X 30 m  
Y 30 m  
Z 0 m  
Rigidbody Mass 1 kg  
Use Gravity チェックあり  
Script 初速 25 m/s 15 m/s C#スクリプトのStart()で設定する。

 

■弾丸のC#スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletScript : MonoBehaviour {

    public Transform monkeyTransform;    //サルのTransform
    public float v0;    //弾丸の初速

    // Use this for initialization
    void Start () {
        // 銃からサルに向かうベクトルを計算
        Vector3 monkeyDir = monkeyTransform.position - GetComponent<Transform>().position;
        monkeyDir.Normalize();    //ベクトルを正規化(大きさを1にする)

        // 弾丸の初速を設定
        GetComponent<Rigidbody>().velocity = v0 * monkeyDir;		
    }
}