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