今日は、Unityを使って簡単な物理計算をやってみようと思います。
跳ねるボールを作ってみます。
Unity上で球を上空へ配置した状態で、下記のスクリプトをアタッチします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { void FixedUpdate() { //コンポーネントにつけたリジッドボディをとってきて変数rbに代入する var rb = GetComponent<MyRigidbody>(); //変数rbに力を加える rb.AddForce(new Vector3(0f, -9.8f, 0f)); } } |
ゲットコンポーネントしますがUnityのrigidbodyは使用せずにMyRigidbodyというスクリプトを自分で定義します。
MyRigidbodyの中では加速度 速度 位置について時間ごとの計算を行います。
後に次のスクリプトでAddForceメソドを定義しますが、これで任意の方向に力を加えることができます。ここでは重力加速度になるようにy = -9.8としました。
通常のrigidbodyでgravityを定義できますが、今回はなるべく自分で定義していくことをコンセプトとしています。
球にアタッチする2つ目のスクリプトとしてMyRigidbodyを定義します。
加速度 速度 位置の変数をVector3型で用意します。
ステップ幅を1/60sとします。ここを1/600とすると 1/10スローモーションとして演算できます。
初期化のところでは、オブジェクトのtrasform.positionを取得するだけです。
AddForceメソドをpublicとして定義します。1つ目のスクリプトで読み込めるようにするためです。
で、引数として forceを入れます。さっきのVector3 (0f,-9.8f,0f)ですね。
このforceはaccelerationに加算されます。初期ステップ目では -9.8m/s2ということです。
1ステップ更新すると、このaccelerationに対して時間dt=1/60s を掛け算した値であるvelocityが計算され、さらにそのvelocityに時間dtを掛け算した変位(1ステップの移動量)positionが計算されます。
これでpositionはどんどん下がっていくので、床と衝突します。
衝突は、オブジェクトの中心座標分だけ床から浮いた状態を床との接触状態と考えてif文で検知したら速度を反転させ跳ね返るようにします。
最後にaccelerrationはゼロに初期化して、次のステップで再定義されるための準備をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyRigidbody : MonoBehaviour { // 加速度 速度 位置の変数ベクトルを定義 Vector3 acceleration; Vector3 velocity; Vector3 position; // 微小時間を定義 const float dt = 1f/60f; // 初期化 void Start() { //オブジェクトの位置を変数ベクトルpositionに持ってくる position = transform.position; } // スクリプトtestで使用する関数AddForceを定義する public void AddForce(Vector3 force) { acceleration += force; } // 更新 void FixedUpdate() { //加速度から速度と位置を計算する velocity += acceleration * dt; position += velocity * dt; // position.y がオブジェクトの半径以下になったら速度を反転させる if (position.y < 0.50f) { velocity = - velocity; Debug.Log("反転しました"); } // オブジェクトの位置を更新する transform.position = position; //加速度は位置の更新が終わったらゼロクリアしておくこと acceleration = Vector3.zero; } } |
Keita N
最新記事 by Keita N (全て見る)
- 2024/1/13 ビットコインETFの取引開始:新たな時代の幕開け - 2024年1月13日
- 2024/1/5 日本ビジネスにおける変革の必要性とその方向性 - 2024年1月6日
- 2024/1/3 アメリカ債権ETFの見通しと最新動向 - 2024年1月3日