2020年4月1日水曜日

【Unity】transform.Rotateだと遠心力が発生しない謎。

transform.Rotateって、位置が毎フレーム変わってるだけ説ある?


どうも、0128studio編集者のkou0128(@kouutajikkyou)です。



今回、Unityを使っていてある事を知りました。

まずは、下の映像をご覧ください。

(映像はアップ出来次第貼ります。)

今回、私はリアルの仕事の関係で、

「遠心力がかかった時に水が何秒で坂を駆け上がって無くなるか?」

という事を考えていました。


しかし悲しいかな、最後に物理を勉強してたのは6年前で計算結果に全然自信が持てません。

ならばUnityで簡易シミュレーションをしてみよう!

と考えて作っている間に発生した問題です。


回転中心になるオブジェクトを置いて、距離と重量と大きさの単位をそろえてシーンを作りました。

そして、「transform.Rotate」で回したところ、

全く動かない。

そして速さを上げてみても全然変わらず。

以下使用したプログラムです。


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

public class TurnSys1 : MonoBehaviour
{
    public GameObject TurnItem1;

    private int Sys1;


    void Start()
    {
        Sys1 = 0;
    }


    void FixedUpdate()
    {
        if(Input.GetKey(KeyCode.Space))
        {
            Sys1 = 1;
        }
        if (Sys1 == 0)
        {
            Debug.Log("Sys1");

        }
        if (Sys1 == 1)
        {
    //スペース押して動く
            TurnItem1.transform.Rotate(0, 180.0f * Time.deltaTime, 0);
        }

    }

}


で、気になって地面側の傾きを0にしてみても、

やはり動かない。

しかし、Unityには重力の概念は存在しているので、円運動が起きている時には遠心力が発生するはず。


ここで思い出した事が、

transform.positionは毎フレームの瞬間移動をしている

という仕組み。


まさかとは思いますが、

transform.Rotateでも同じように円運動に見える様に毎フレーム瞬間移動してるんじゃないか?

という事です。

力がかかって回っているのではなく、物体がフレーム毎に瞬間移動するという現実にあり得ない状況の為、見落としていました。

でも、位置の瞬間移動なら確かにどんなに回転しても遠心力も発生しないはずなので現状の結果に説明が出来ます。


こうなってくると他の回転させるプログラムを使わないといけませんね・・・

それで動いてくれると嬉しいなぁ・・・・

こうなってくると物理の勉強を必要なとこだけし直した方が早い説も出てきます。
(自宅で自主的に作っているので、会社の検討資料として出せないですし。)


プログラムが分かり次第、また追記いたします。

プログラムの特性をちゃんと理解して使用しないと、こういった予想外の状況にぶち当たるといういい勉強になりました。


それでは今日はこの辺で終わりになります。

最後までお付き合い頂き有難うございました。

また明日。

【Unity】transform.Rotateだと遠心力が発生しない謎。

transform.Rotateって、位置が毎フレーム変わってるだけ説ある? どうも、0128studio編集者のkou0128( @kouutajikkyou )です。 今回、Unityを使っていてある事を知りました。 まずは、下の映像をご覧...