Nexus Lab. Blog

0から始めるUnity物理演算⑥慣性テンソルとトルク

f:id:nexusyuumilo:20180127121355p:plain

Milo です。
第6回は動画の紹介のみになります。
今回は、物体の回転運動に関する内容です
【Unity道場】物理シミュレーション完全マスターで勉強したことを元にしています。

この記事を書いたひと




目次です
今回はAddTorque()についてよくわかる2本の動画を紹介します。これだけあれば全て理解できるのですが、一応補足としてコードにコメントを足しておきました。

[Unity道場 札幌スペシャル]プロが教える脱初心者スクリプト術! - YouTube

www.youtube.com

今回の該当箇所は24分〜です。

講義で使われたコードにコメントを足して見ました。ただ動かして見たい方どうぞ

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

public class SimplePlane : MonoBehaviour {

	//加速したのち終端する、目的の速度
	public float target_kmph_ = 100f;

	// Use this for initialization
	void FixedUpdate (){
		var hori = Input.GetAxis("Horizontal");
		var vert = Input.GetAxis("Vertical");
		var rb = GetComponent<Rigidbody>();

		//自分に対しての向きで、トルクをかける
		rb.AddRelativeTorque(new Vector3(0, hori, -hori) * 2f);	//左右でy軸回転
		rb.AddRelativeTorque(new Vector3(vert, 0, -vert) * 2f);	//上下でx軸回転

		//x軸方向の水平を保つ
		var left = transform.TransformVector(Vector3.left);	//機体の左を向くベクトルを、ローカル→ワールド座標に変換する!
		var horizontal_left = new Vector3(left.x, 0f, left.z).normalized;	//上で求めたベクトルをx-z平面(水平)上のベクトルに補正し、単位ベクトルにする。
		rb.AddTorque(Vector3.Cross(left, horizontal_left) * 6f);	//外積を取る。傾いているほど大きいトルク。(ばねのように)
		
		//機体から見てz軸方向にも水平を保つ。
		var forward = transform.TransformVector(Vector3.forward);
		var horizontal_forward = new Vector3(forward.x, 0f, forward.z).normalized;
		rb.AddTorque(Vector3.Cross(forward, horizontal_forward) * 6f);

		//機体を前に発進させるエンジン
		var force = (rb.mass * rb.drag * target_kmph_ / 3.6f) / (1f - rb.drag * Time.fixedDeltaTime);	//ある終端そくどに向かうための力を求める!
		rb.AddRelativeForce(new Vector3(0f,0f, force));
	}
	
}

まとめ

こんだけ詳しい動画があればぶっちゃけ自分が解説するまでもなかった・・・
まぁ動画の内容って検索しても出てこないから文章化する意義は間違いなくあると思うのです。
そして、このブログでは古典力学の部分の説明を色々できたので・・・よかったのではないかと