物理連結とは、一群の Articulation Body を論理ツリーに整理したもので、各親子関係には相互に制約された相対的な動作が反映されます。
物理連結の主な目的は、ゲーム以外のジョイントを使用する産業用および商業用のアプリケーションにリアルな物理動作を提供することです。例えば、物理連結を使うと、通常のジョイント よりもずっと簡単に、ロボットアームやキネマティックチェーンなどをシミュレートできます。
2 つの物理ボディを 1 つのジョイントでリンクさせるという最も基本的なシナリオでは、以下の表に示すように、連結を構築するか、通常のジョイントを使用します。
|
| 連結設定 | 通常のジョイント設定 |
|-|————————|——————————|
| 階層 | • ゲームオブジェクト + Articulation Body
• ゲームオブジェクト + Articulation Body | • ゲームオブジェクト + リジッドボディ
• ゲームオブジェクト + リジッドボディ + ジョイント |
| 関係 | ゲームオブジェクトには階層 (親子) 関係があります。
注意物理エンジンでは、Unity の Transform 階層を使って親子関係を表現します。 | ゲームオブジェクトには親子関係が必ずあるとは限りません。
注意より高度なシナリオでは、キネマティックループを自由にシミュレートできます。 |
| 物理ボディ | どちらのゲームオブジェクトも、物理ボディのプロパティやその他を定義する Articulation Body コンポーネントを持っています。 | どちらのゲームオブジェクトも、物理ボディやその他のプロパティを定義する Articulation Body コンポーネントを持っています。 |
| ジョイント | 子ゲームオブジェクトの Articulation Body にはジョイントプロパティがあり、ジョイントのタイプを選択できます。 | ゲームオブジェクトの 1 つには Joint コンポーネントもあります。ジョイントのプロパティは、加えた Joint コンポーネントのタイプによって異なります。 |
ただし、結果として生じる全体的な動作は、両方の場合で同じではありません (特に、この原理を複数の物理ボディやジョイントに拡張した場合)。
ラグドール、ロボットアーム、複数の共有ヒンジを持つメカニズムなどのキネマティックチェーンを通常のジョイントで作ろうとすると、物理エンジンが解決できないシナリオに遭遇し、特定の制約が満たされない場合があります。その結果、スタッターが発生したり、非現実的な動きになったりすることがあります。このようなジョイントは見た目が奇妙になるだけでなく、実際のデバイスのシミュレーションに使用することができず、工業デザインのモデル化やプロトタイプ化に支障をきたすことになります。
Unityで物理連結を構築するには、連結を構成する各ゲームオブジェクトに Articulation Body コンポーネントを追加する必要があります。各 Articulation Body コンポーネントは、1 つの場所でまとめて設定を行うことができます。
対応するゲームオブジェクトの物理ボディのプロパティ。基本的には、その質量と物理環境への反応の仕方。
ゲームオブジェクトとその親ゲームオブジェクトを紐づけるジョイントのタイプとプロパティ (連結のルートを除く)。
以下の例では、3 つの物理体と 2 つのジョイントを含む単純な物理連結を示しています。
このような連結を Unity で構築するには以下を行います。
3 つのゲームオブジェクトの直線的な階層を作ります。
この 3 つのゲームオブジェクトそれぞれに、Articulation Body コンポーネントを追加します。
各 Articulation Body コンポーネントを設定します (上の図を参照)。
| ゲームオブジェクト | Articulation Body コンポーネントの設定 |
|---|---|
| A (ルート) | ゲームオブジェクト A に対してのみ、物理ボディのプロパティを定義することができます。 |
| B | 以下を定義できます。 • ゲームオブジェクト B の物理ボディのプロパティ。 • ゲームオブジェクト A とのジョイントのタイプとプロパティ。 |
| C | 以下を定義できます。 • ゲームオブジェクト C の物理ボディのプロパティ • ゲームオブジェクト B とのジョイントのタイプとプロパティ。 |
注意定義によって、連結は 1 つのルートしか持つことができず、キネマティックループを持つことはできません。キネマティックループが必要な場合は、通常のジョイント を使用してください。
制限事項:長い連結チェーンを構築する場合、Unity がサポートする最大階層深度は 64 ゲームオブジェクトであることに注意してください。
1 つの Articulation Body で選択および設定できるのは、以下の 4 種類の連結ジョイントです。
Fixed Joint: ボディの間に硬く壊れず、伸縮しない連結を設定します。
Prismatic Joint: 特定の軸に沿ってスライドする以外のすべての動きができないようにします。
Revolute Joint: 特定の軸を中心に回転させることができます (ヒンジなど)。
Spherical Joint: 解剖学的な関節であり、2 つの軸でスイング、1 つの軸でツイストが可能です。
連結のロックされた自由度はすべて、設計上、壊れることも伸縮することもできません。これを実現するために、物理演算エンジンは縮小された座標スペースを使用します。このスペースでは、ボディはロックされていないモーション軸に関する座標のみを持ちます。
一方、通常の反復ジョイントでは、物理エンジンは最大座標空間を強制し、ソルバーが一連の反復後に収束できる場合にのみ制約を満たすことを保証します。
Unity Robotics Demos では連結ジョイントを使用したシリアルリンクロボットアームのデモを確認できます。