Unity の剛体と衝突体コンポーネントの詳細な説明

序文

Unity には完全な物理エンジンが組み込まれており、現実世界のおおよそのシミュレーションを完成させることができます。Unity の物理エンジンでは、剛体成分と衝突体成分が避けられません.剛体成分はオブジェクトに物理的な動作を発生させる成分であり、衝突体成分は剛体をオブジェクトに衝突させる成分です. . 今日はそれを簡単に紹介しましょう. このコンポーネントを知ってください.

前列のリマインダー:この記事は、交換と学習のための個人的な意見のみを表しています.異なる意見がある場合は、コメントを残してください.著者は一生懸命勉強し、毎日進歩しなければなりません.
この記事を読んで、わからないことがあれば、この記事に記載されている参考資料を見て比較することをお勧めします。

Unity版【2019.4.10f1】Dream Xiaotianyou&転載禁止

動画解説:
Unityの剛体と衝突体の詳しい解説_BiLiBiLi

この記事は物理の基礎知識を身につけた方が読みやすい


1. Rigidbody コンポーネントのパラメーター

剛体コンポーネントには、Rigidbody コンポーネントと Rigidbody2D コンポーネントの 2 種類がありますが、この記事では前者の剛体コンポーネントについてのみ説明します。
Unity では、重力の影響を受けるなど、現実世界でオブジェクトに物理的な効果を持たせたい場合、Rigidbody コンポーネントをオブジェクトに追加する必要があります。これは、オブジェクトに物理的な動作を生成させるコンポーネントです。剛体コンポーネントを介して、質量、摩擦、衝突パラメータなどの一般的な物理プロパティをオブジェクトに追加できます。
物理学では剛体を理想モデルと呼びますが、通常、外力が作用しても形や大きさが変化せず、内部の部品の相対位置が一定である理想モデルを剛体と呼びます。
オブジェクト object の Inspector パネルの Add Component ボタンを押し、Rigidbody を検索してコンポーネントを追加します。(または Physics->Rigidbody 分類による)

ここに画像の説明を挿入ここに画像の説明を挿入

1.質量品質

オブジェクトの質量を設定します。既定の質量は 1 キログラム (KG) です。物理法則によれば、オブジェクトに上向きの力 (9.8N) を与えるだけで重力が相殺されます。9.8 よりわずかに大きい場合は、ん、あがれます。

2.引きずり抵抗

オブジェクトの抵抗を設定します。デフォルトは 0 で、抵抗はありません。抵抗の方向は物理的な動きの方向とは逆で、このパラメータの値が大きいほど抵抗が大きくなり、速度の減衰が速くなります。大きすぎると、オブジェクトはすぐに動きを止めます。
ここに画像の説明を挿入

3.Angular Drag コーナー抵抗

オブジェクトの回転方向と反対のオブジェクトの角抵抗(回転抵抗)を設定します。デフォルトは 0.05 です。この値を設定すると、オブジェクトのあらゆる方向の回転運動が影響を受けます。0 に設定すると、オブジェクトは回転を開始しても停止しません (無重力状態)。値が大きいほど、回転の減衰が速くなります。
ここに画像の説明を挿入

この例では、次の物理は無重力をシミュレートするために重力オプションの使用をチェックしません. オブジェクトが外力の影響を受けるとき、角度抵抗がない場合、オブジェクトは連続的に回転します. 抵抗がない場合、オブジェクトは動き続けます。

4.重力を使う 重力を使う

オブジェクトが重力の影響を受けるかどうかを設定し、現実世界の自由落下モーションをシミュレートします。チェックを入れると影響を受け、チェックを外すと無重力環境での運動状態をシミュレートします。
ここに画像の説明を挿入

下の 3 つのオブジェクトはチェックされていません. これが表示されたら、見るだけでなく、自分でプレイしてください。

5.キネマティックはダイナミクスに従います

オブジェクトをダイナミック シミュレーションの対象にするかどうかを設定します。チェックすると、オブジェクトは重力、速度、抵抗、質量などの物理シミュレーションの影響を受けず、スクリプトとアニメーションの影響下でのみ移動します。これは何に使用されますか?たとえば、最初にチェックすると、パフォーマンスの消費が確実に減少します.物理システムはそれを計算しなくなります.第二に、物理シミュレーションの影響を受けませんが、他のオブジェクトに影響を与える可能性があります.移動中 スクリプトはトランスフォームを移動しますが、他のリジッド ボディに衝突する可能性があります。リジッド ボディのみが影響を受けることに注意してください。
ここに画像の説明を挿入

図のように図中の 2 つの障害物は衝突体が追加されているだけで、このオプションをチェックしない剛性は衝突体の影響を受けます。 Rigidbody コンポーネントも持つオブジェクトに影響を与え、プッシュすることができます。目的は読者のイマジネーション次第、ゲームはイマジネーション!
移動するオブジェクトはスクリプト駆動であり、物理的な世界の影響を受けません。コードは次のとおりです。とても簡単な文

    public float speed = 3;
    void Update()
    {
        transform.position += new Vector3(0, 0, Time.deltaTime * speed * -1);
    }

6.補間補間

このパラメーターは、Unity での非同期の物理シミュレーションと画面レンダリングの問題を解決するために使用されます. 補間処理が実行されない場合、計算された物理データは最後の物理シミュレーション時点のデータであり、補間は最も近い現在のレンダリング時間を取得するためのものです.ポイント. データの手段。リジッド ボディが動くと揺れる場合は、このオプションを調整することをお勧めします。
パラメータは2つ

  • 補間:前のフレームに合わせて滑らかに変形
  • 外挿:次のフレームに合わせてスムーズに変形

7.衝突検知 衝突検知

このアトリビュートは、高速で移動するオブジェクトが衝突せずに他のオブジェクトを通過するように制御するために使用されます。

  • 離散離散衝突検出 (デフォルト、ほとんどの剛体に適しています。これは間違いなく最もリソース効率が高く、間違いなく、これは通常の状況でのデフォルトです。変更しないでください)
  • 連続連続衝突検知(高速で衝突する物体に適しています)
  • 連続動的 連続動的衝突検出 (高速で移動するオブジェクトに適しています)
  • 連続投機的連続スキャン衝突検出(うーん、わかりません。情報を見つけるのが非常に難しいです)
    理解するための例を挙げます
    ここに画像の説明を挿入

ここに画像の説明を挿入
最初の衝突検出はデフォルトの離散検出であり、オブジェクトは直接落下します.2番目は連続動的検出で、正常に停止しました.この側面に関する情報はほとんどなく、詳細について話す能力がありません. .

8. 制約制約

オブジェクトの移動と回転を特定の方向に拘束します。既定では拘束されません。各軸の移動と回転は物理システムによって制御されます。これは、例を示すと理解しやすいはずです。
ここに画像の説明を挿入

ここでは、ドアの XYZ 軸の動きと XZ 軸の回転を固定します オブジェクトを使用してドアを押すと、単純なドアの準備が整います。片扉の押し出し効果が欲しければ(ただし、ここではJointsの物理ジョイントを使った方が楽です。関連記事は今後書きます)、読者の方は自分で拡張してください。


2. コライダーコンポーネントの基本パラメータ

物理コンポーネントが衝突体に追加されると、デフォルトで剛体の動きがブロックされます. たとえば、上記の例では、平面を追加すると、重力の影響を受ける剛体の落下がブロックされます。デフォルト。これは、作成時に Collider コンポーネントが付属していたためです。
コリジョン ボディ コンポーネントはオブジェクトの物理的な形状を定義し、コリジョン ボディ自体は目に見えません.空気の壁の例を考えることができます.
Cube を作成すると、オブジェクトには Box Collider が付属します。最も単純で計算効率の高いコライダーは、一連のプリミティブ コライダーです。右クリックして基本モデルのセットを作成すると、基本的なコライダーのセットが付属しています。
オブジェクトは複数のコライダー コンポーネントを持つことができるため、複合コライダーが形成されます。

ここに画像の説明を挿入

1.基本パラメータ

ここに画像の説明を挿入

基本的な衝突体コンポーネントのパラメータは以下の通り. Edit Collider は衝突体のサイズを編集するために使用され, Center と Size は中心と範囲を指定するために使用される. Is Trigger プロパティと Material プロパティ

2.トリガーです

前述のように、コリジョン ボディはデフォルトでリジッド ボディの動きをブロックしますが、2 つのオブジェクトのオーバーラップを検出する必要があるが、物理的なコリジョンを発生させたくない場合は、このオプションをオンにしてコリジョン ボディを回転させる必要があります。トリガーに
この項目をチェックすると、オブジェクトは剛体の動きをブロックしなくなりますが、剛体が現在のオブジェクトと重なると、OnTriggerEnter() メソッドが呼び出されます。
ここに画像の説明を挿入

ここでは、トリガー関数スクリプトを底面に追加し、そのコライダーをトリガーとして設定しました。つまり、Is Trigger がチェックされます

    private void OnTriggerEnter(Collider other) {
        Debug.Log("检测到物体【" + other.name + "】与当前碰撞体发生重叠!");
    }

3.Material 物理的な素材

このオプションは、氷、木、セメント板などの地面のオブジェクトの表面の物理的なマテリアルをシミュレートするために使用されます。物理自体の弾力性、物理自体の滑らかさなど、オブジェクト自体の場合、物理シミュレーションの効果に直接影響します。

物理マテリアルの作成方法は、通常のマテリアルの作成と同じですが、右クリックメニューから物理マテリアルを探すと、図のように物理マテリアルのパラメータが表示されます。
ここに画像の説明を挿入

  • 動的摩擦運動摩擦
    • 値の範囲 0~1
  • 静摩擦 静摩擦
    • 値の範囲 0~1
  • 弾力のある表面の弾力性
    • 値の範囲は 0 ~ 1 です。値が 0 の場合、弾力性はありません。
  • フリクションコンバイン フリクションミックス
    • 衝突する 2 つの Collider オブジェクトの摩擦がどのようにブレンドされるか
    • 最大値は最大値を取ります
    • MuItiply は乗算された値を取ります
    • 最小値は最小値を取ります
    • 平均は平均を取る
  • バウンス コンバイン エラスティック ミックス
    • 衝突する 2 つの Collider オブジェクト間の摩擦の弾性的な方法
    • 最大値は最大値を取ります
    • MuItiply は乗算された値を取ります
    • 最小値は最小値を取ります
    • 平均は平均を取る

氷上の角氷をシミュレートするなどの例を見てみましょう
ここに画像の説明を挿入

同時に3つの衝突体と平面に以下のパラメータの物理マテリアルを与え、平面に少し傾斜角を加えました。
ここに画像の説明を挿入


3.コライダーの分類

衝突体が剛体コンポーネントを持っているかどうか、および動的剛体が剛体コンポーネントに設定されているかどうかによって、このコンポーネントとのオブジェクトの物理的な衝突特性が変化するため、上記の違いに従って、衝突体が分割されます。静的コリジョン ボディ、Rigidbody コライダー、動的 Rigidbody コライダーの 3 つのカテゴリに分けられます。

1.静的コライダー

Rigidbody コンポーネントのないコライダーは、静的コライダーと呼ばれます。
地形、障害物、木など、ゲーム内の固定パーツを作成するためによく使用されますが、これらのパーツは一般的に移動する必要がなく、剛体が当たっても位置が変わらないためです。有名なGTA5、木は無敵です。
コライダーを動かす必要がある場合は、剛体コライダーまたは動的剛体コライダーを使用することをお勧めします。この方法は使用しないでください。そうしないと、物理システムの計算量が増加します。

2.剛体コライダー

剛体コンポーネントを搭載したコライダーを剛体コライダーと呼びます。
物理エンジンは常にコライダーの物理状態を計算します。

3.キネマティックリジッドボディコライダー

剛体コンポーネントをマウントし、剛体コンポーネントを動的剛体に設定するコライダーは、動的剛体コライダーと呼ばれます。【回しやすい】
ドアや固定軌道移動のレベル支柱などを作るのによく使われます。


4.剛体の睡眠

コライダーの分類で前述したように、剛体コライダーの物理状態は常に物理エンジンによって計算されます。しかし!これはあまりにも多くのリソースを消費しますか? Unity でそれを解決する方法、これは概念、剛体睡眠を紹介します。

剛体の移動速度と回転が所定のしきい値 (通常は非常に小さく、変更可能) よりも遅く、一定時間維持された場合、剛体は短い時間で比較的静止していたと言えますか?この時点で、オブジェクトは「スリープ」状態に入ったと言え、休眠状態の剛体は物理システムによって無視されるため、「つまり、移動速度と回転高さが所定の値に達したら、運動を開始します。

リジッドボディのスリープは完全に自動的に行われ、リジッドボディのウェイクアップも自動的に行われることに注意してください。

Rigidbody コンポーネントには、sleepVelocity と sleepAngularVelocity プロパティがあり、Unity はこれら 2 つのプロパティを使用して、剛体をスリープ状態にする必要があるかどうかを判断します。しかし、特別な注意が必要です!Unity は現在、これら 2 つのプロパティを廃止し、 sleepThreshold を使用するように切り替えました.公式 API の説明によると、「このプロパティには、品質で正規化されたエネルギーしきい値があります。このしきい値よりも低い場合、オブジェクトはスリープ状態になり始めます。」人間の言葉で言えば、上記の 2 つの属性はいくつかのアルゴリズムによって 1 つに結合され、剛体が眠っているかどうかを判断するには、sleepThreshold があらかじめ設定されたしきい値よりも低いかどうかを判断するだけで済みます。閾値は通常0.005で、下図のように[編集]→[プロジェクト設定]→[物理演算]で設定できます。
ここに画像の説明を挿入

Rigidbody コンポーネントでは、IsSleeping() 関数を使用して、rigidbody がスリープしているかどうかを判断することもできます。しかし、この関数の本質は、sleepThreshold を判断することです。

剛体が休眠状態に入ると、衝突体と衝突できなくなります. 剛体が休眠状態に入るため、その物理システムは計算されなくなり、当然、衝突情報を生成して衝突イベントをトリガーすることはできなくなります.

WakeUp() を使用して剛体を強制的に起動することもできます。

下図の例は、剛体が休止状態の場合、剛体がコライダと衝突しないことを示しています。
ここに画像の説明を挿入

大きな立方体には剛体コンポーネントがあり、他はコライダーのみです. 大きな立方体が落下すると、物理システムの重力の影響を受けて自由に落下し、他のコライダーと衝突します. 落下して静止すると、剛体体はすぐにスリープし、ドラッグして衝突するボディが直接通過します. このとき、剛体はサスペンド状態にあり、物理システムによって目覚め、重力の影響を受けて落下し始め、再び地面に衝突し、そしてすぐ寝ます。

    public Rigidbody rig;
    public bool IsSleeping;
    void FixedUpdate()
    {
        IsSleeping = rig.IsSleeping();
    }

5. 剛体とコライダーの衝突試験とトリガー方法

これを書いた後、基本的に完全なストップを描くことができますが、衝突が発生する前に、剛体と衝突体の間で満たす必要がある条件を列挙する別のセクションがありますか? イベントをトリガーするには、どのような条件を満たす必要がありますか?

まず第一に、衝突が発生するように、両方が衝突するボディでなければならず、動く側は非運動学的な剛体でなければなりません!
次に、コライダーの 1 つが Is Trigger をチェックして、OnTrigger() イベントをトリガーする必要があります

1. 衝突はいつ発生しますか?

3 番目のセクションでは、衝突体の分類について説明しました.静的衝突体、剛体衝突体、および運動学的剛体衝突体の 3 つのタイプがあります.これらをペアで組み合わせます.以下に、考えられる状況の簡単なリストを示します.合計9種類の状態。

ここに画像の説明を挿入

ここでわからない場合は、第 3 セクションに進んでもう一度見ることをお勧めします。
注: 衝突が発生すると、両方の当事者が OnCollision() イベントをトリガーし、衝突がない場合、どちらの当事者もイベントをトリガーしません。

2. OnTrigger はいつトリガーされますか?

ここで、コライダがトリガーになることについての説明を 2 番目のセクションに戻してください。上記によると、OnTrigger() イベントは、コライダーの Is Trigger がチェックされている場合にのみトリガーされます. チェックされていない場合は、OnCollision() イベントのみがトリガーされます. ここで, 読者が明確な心を持って、めちゃくちゃにしないでください。セクションを読むたびに、自分で実験を行い、時間をかけてください。
OnTrigger が発生する可能性のある状況の一覧を以下に示します. 全部で 36 種類あります.

ここに画像の説明を挿入

注: 一方が OnCollision をトリガーし、もう一方が OnTrigger をトリガーする状況は決してありません. フォームにチェックを入れると、両方の当事者が OnTrigger イベントをトリガーする必要があることを意味します! 同じことが前の図にも当てはまります.フォームがチェックされている場合、両方の当事者が OnCollision イベントをトリガーする必要があります!

3.衝突とトリガー方法

上記は理解できます。これらは間違いなく問題ではないため、ナンセンスはありません。

トリガー検出
1.OnTriggerEnter( Collider other ) トリガーに入る時
2.OnTriggerExit( Collider other ) トリガーから出る時
3.OnTriggerStay( Collider other ) トリガーに留まっている時

衝突検出:
1.OnCollisionEnter( Collision other ) コライダーに入る時
2.OnCollisionExit( Collision other ) コライダーから出る時
3.OnCollisionStay( Collision other ) コライダーに留まる時


6. まとめと参考文献

1. まとめ

  • 衝突体コンポーネントには、Mesh(グリッド)衝突体、Wheel(ホイール)衝突体、Terrain(地形)衝突体もありますが、スペースが限られているため、これらのコンポーネントについては後で詳しく説明します。
  • 両方の側にコライダーが必要であり、移動する側は衝突する非運動学的な剛体でなければなりません (N 回強調、この文は非常に重要です!)
  • 衝突体の分類: 静的衝突体、剛体衝突体、運動学的剛体衝突体。
  • リジッド ボディがスリープ状態になると、コライダーと衝突できなくなります。
  • Is Trigger をチェックして、コライダーをトリガーにします。

2.参考文献

[1] Wu Yafeng. 「Unity3D ゲーム開発標準コース」
[2] Ma Yao. 「Unity 3D スクリプト プログラミングとゲーム開発」
[3] Zheng Hongzhi. Unity Rigid Body 詳細説明
[4] Dong Juzi. Unity3d Rigidbody と Collider の理解
[5] Baimengren. [Untiy Study Notes] Rigidbodyコンポーネントとその一般的に使用される関数
[6] Yiyang. Unity は Rigidbody と Collider ( Collider) と trigger (Is Trigger) を理解し、 Rigidbody Sleeping (Rigidbody Sleeping)
[7] Tonge. Unity3D 簡単に言うと - Physics Materials (物理マテリアル)
[8] Cangxia を待つだけ.衝突検出の役割について
[9] Moonset Wutiao Frost Moonfall. [Unity 22] 簡単な使用Unity フォース、トルク、剛体、およびトリガーの
[10] ネットワーク. Unity オブジェクトが速すぎて衝突検出を実行できないという問題を解決します (衝突検出貫通)
[11] ネットワーク. Unity の聖典と公式 API および Baidu 百科事典の一部

おすすめ

転載: blog.csdn.net/weixin_43147385/article/details/124042051