[unity]ばねにつながれた2物体①[慶應入試問題]

この記事は約7分で読めます。

ばねの動きをシュミレーション する①

ばねの動きをシュミレーション する②

の続きになります。

Unityで操作してみたいという人は、ぜひ①、②をご覧になってください。

14’慶應入試問題の内容

物体A、Bはどちらも質量mで大きさは無視でき、同一直線上を運動する。物体A、Bの位置、速度、加速度をそれぞれ\( x_{\rm A} ,x_{\rm B},v_{\rm A},v_{\rm B},a_{\rm A},a_{\rm B}\)とし、\( x_{\rm A}>x_{\rm B}\)とする。

問2 振動子を摩擦のない水平レール上に置いた。

(a) 物体A、Bの運動方程式を答えよ。という問題で、答えは$$
\begin{eqnarray}
ma_{\rm A}&=&-k(x_{\rm A}-x_{\rm B}-L) \\
ma_{\rm B}&=&k(x_{\rm A}-x_{\rm B}-L)
\end{eqnarray}
$$

となります。\(x_{\rm A}-x_{\rm B}\)がばねの長さなので、\((x_{\rm A}-x_{\rm B}-L)\)がばねの伸びです。

(b) 物体A、Bを異なる初速度で動かした。運動方程式から求められる\(x_{\rm A}+x_{\rm B}, x_{\rm A}-x_{\rm B} \)のその後の運動を答えよ。

という問題で、答えは、

\(x_{\rm A}+x_{\rm B} \)は重心運動を表すため、等速直線運動をします。これについては、下の記事でシュミレーション、検証 しました!

\(x_{\rm A}-x_{\rm B} \)は、相対運動(Bから見たAの運動をみたときの運動)を表すため、単振動をします。今回は、このことについてシュミレーション して確認してみたいと思います。

物体Bから見た物体Aの運動をシュミレーションする

カメラの動きを物体に連動させる

物体とカメラの動きを連動させる方法については以下の記事で紹介しています。

Main Cameraに以下のスクリプトをアタッチします。

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

public class CameraControl : MonoBehaviour
{
    public GameObject CubeB;
    public Vector3 offset = new Vector3(0, 0, 0);//CubeBからのずれ


    void Update()
    {
        this.GetComponent<Transform>().position = CubeB.transform.position + offset;
    }
}

Main CameraのコンポーネントのCamera Control内にCubeBをアタッチします。また、Transformを画像のように変更します。また、Offsetも見やすいように変更しました。

グラフを描く

グラフの描画にはunity-ugui-XChartsを使っていきます。XChartsについては以下の記事で紹介しています。

ChartManagerというスクリプトを作成し、以下のコードを入力します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XCharts;  // LineChartにアクセスできるようにする

public class ChartManager : MonoBehaviour
{

    public GameObject LineChart;     //LineChartを宣言
    public GameObject CubeA;       
    public GameObject CubeB;
    public float timeOut = 0.1f;
    public float durationTime = 5.01f;
    private float timeElapsed = 0.0f;
    public float y_min = 0.0f;
    public float y_max = 15f;


    private LineChart linechart;

    Rigidbody rb;
    Transform CubeATransform;
    Transform CubeBTransform;

    void Awake()
    {
        CubeATransform = CubeA.transform;
        CubeBTransform = CubeB.transform;
    }

    void Start()
    {
        linechart = LineChart.GetComponent<LineChart>();
        linechart.RemoveData();
        linechart.AddSerie(SerieType.Line);
        TitleSet();
        YAxisSet();
        XAxisSet1();
    }

    private void YAxisSet()
    {
        linechart.yAxes[0].type = Axis.AxisType.Value;
        linechart.yAxes[0].minMaxType = Axis.AxisMinMaxType.Custom;
        linechart.yAxes[0].min = y_min;
        linechart.yAxes[0].max = y_max;
        linechart.yAxes[0].splitNumber = 5;
    }

    private void TitleSet()
    {
        linechart.title.show = true;
        linechart.title.textStyle.fontSize = 30;
        linechart.title.textStyle.color = new Color(0f, 0.2f, 1f, 1f);
        linechart.title.text = "x-tグラフ";
    }
    private void XAxisSet1()
    {
        linechart.xAxes[0].splitNumber = 2;
        linechart.xAxes[0].boundaryGap = true;

        for (float i = 0; i < durationTime; i += timeOut)
        {
            linechart.AddXAxisData(i + "s");

        }
    }

    private void XAxisAddData(float x)
    {
        linechart.AddData(0, x);
    }


    void FixedUpdate()
    {
        timeElapsed += Time.fixedDeltaTime;

        if (timeElapsed >= timeOut)
        {
            XAxisAddData(CubeATransform.position.x-CubeBTransform.position.x);
            timeElapsed = 0.0f;
        }

    }
}

ChartManagerコンポーネント内のスクリプト内にCubeAとCubeBをそれぞれアタッチし、Y軸の最小値と最大値を変更しておきます。

再生する

このように、物体Aが単振動する様子と、グラフが確認できました!

コメント

タイトルとURLをコピーしました