Unity を検索

ロボット工学のツールボックスを拡張する:Unity 2022.1 における物理システムの変更点

2022年5月12日 カテゴリ: Engine & platform | 6 分 で読めます
3D rendered wagon on Unity user interface
3D rendered wagon on Unity user interface
3D rendered wagon on Unity user interface

ロボット工学のツールボックスを拡張する:Unity 2022.1 における物理システムの変更点

新しいインバースダイナミクスの力センサーツールを使って、環境を理解する高度なロボットのシミュレーションを行うことができます。完全に刷新された Physics Debugger でダイナミクスを探求しましょう。パフォーマンスが向上した補間処理とバッチクエリもぜひご活用ください。

Physics Debugger の改良

Physics Debugger は、物理エンジンの内部動作を理解したり、プロジェクトで観察される特定の動作を理解するために不可欠なツールです。優れたデバッガーは、説得力のある、現代的で豊かな物理学をオーサリングするための重要なツールです。そんな思いから、ユーザーインターフェース(UI)を全面的に見直し、面白い機能を追加しました。 

より多くの情報を同じスペースに収めるため、プロパティをタブにグループ化し、新たに追加したプロパティで展開しました。

Unity user interface menu

以前は、Rigidbody と ArticulationBody の両コンポーネントには、インスペクターに折りたたむことのできる「Info」セクションがあり、これを展開すると現在の線速度などの追加情報を表示することができました。しかし広げると、エディター全体の性能が大きく低下してしまいます。また、従来は異なる物体のパラメーターを比較する場合、2 つのインスペクターパネルを開く必要があり、煩雑でした。これらの問題を解決するために、すべてのプロパティを Physics Debugger ウィンドウの「Info」タブに移動し、選択したオブジェクトごとにプロパティを表示することで、簡単に並べて比較できるようにしました。 

Unity user interface menu options

接触点を可視化し、接触点の法線と離隔距離を表示することができるようになりました。 

Unity user interface with a red box and manipulation arrows pointing down

Physics.Raycast や Physics.CastSphere などの物理クエリは、通常カスタムのキャラクターコントローラや乗り物のコントローラのような、カスタムな物理動作に組み込まれています。目に見えませんし、デバッグするのも厄介なものです。そのために、今回のリリースでは、物理クエリの視覚化をオプションで提供しています。

Unity user interface with shapes being moved around

インバースダイナミクス

これまで Unity には、オブジェクトの集合とそれらに加わる力が与えられたときに、その軌道を計算するフォワードダイナミクスと呼ばれるものだけをサポートするツールがありました。これは非常に便利なのですが、私たちはロボット工学のツールボックスを拡張したかったのです。そこで、Unity 2022.1 では、インバースダイナミクスに対応しました。オブジェクトと目的の軌道が与えられたとき、その軌道を描くにはどのような力がかかるかをシミュレートして計算するのです。 

この機能はイテレーションを回しつつ構築していくため、複数のリリースにまたがって成果物をご提供していくことになるかと思います。Unity 2022.1 では、ArticulationBody に今かかっている合力のうち、目的の軌道に沿って動かすための外力を加える前に打ち消すべき成分を計算する一連の関数が公開されています。さらに、ソルバーが加える衝撃を打ち消すために必要な関節力など、興味深いコンセプトが今後のリリースで公開される予定です。ぜひお試しいただき、ご意見をフォーラム でお聞かせください。 

具体的には、以下の新機能が加わりました。

  • その駆動体によって現在物体に加わっている力を得る。これはある駆動体が目的の駆動先に到達するために、どれだけ関与しているかを示すものです。駆動体の剛性と減衰力、現在の目標位置との差分と目標速度との差分に依存します。
  • 物体に作用する重力コリオリ力、遠心力を打ち消すために必要なジョイント力を得る。
  • 目的の加速度に達するために必要なジョイント力を得る。 
Unity user interface manipulating two characters

補間・外挿

Rigidbody は補間と外挿を使い分けることで、比較的低い周波数でシミュレーションを行いながら、滑らかな動きを表現することができます。内部的には、更新のたびにトランスフォームポーズを計算することで実装されています。補間の場合、シミュレーションされたポーズのうち最後の 2 つは、このフレームの新しいトランスフォームポーズを計算するために使用されます。外挿の場合、最後にシミュレーションされたポーズと速度が代わりに使用されます。ただし、軽量化のために、これらのポーズを物理エンジンに伝えることはしていません。ポーズは、物理以外のシステム(グラフィックスやアニメーションなど)にのみ提示されます。そのため、たとえばレイキャストでは、補間されたポーズの物体は検出されません。 

物理システムがトランスフォームの変更を検知しないようにするため、ポーズ書き込みの直前に、更新するごとに Physics.SyncTransforms() を呼び出し、その後、内部メソッドを呼び出して物理システムのためにすべてのトランスフォームの更新をクリアする仕組みになっていました。そのため、2 種類の問題が発生しました。

  1. シーンに少なくとも 1 つの補間された物体がある場合、すべての物理コンポーネントに対するすべてのトランスフォームの変更が、更新ごとに物理エンジンと同期されました(FixedUpdate で 1 回だけ必要なことがほとんどであるにもかかわらず)。
  2. 補間機能を持つ Rigidbody コンポーネントを持つトランスフォームに変更が加えられた場合、ユーザーが行ったトランスフォームの変更が物理エンジンに伝播し、最後にシミュレーションされたポーズが実質的に変更されるため、このオブジェクトの補間が壊れてしまっていました(ポーズは別途保存されません。このポーズは物理エンジンがその時使用しているポーズに過ぎないためです)。

これらの問題に対処するため、補間コードを更新し、各フレームのすべてのトランスフォームを同期させる必要がないようにしました。この変更によりパフォーマンスも向上したので、新しい補間コードは以前より高速に実行されます(シーンの複雑さにもよりますが)。

フォーラムでのフィードバックへの対応

フォーラムには、物理システム関連技術のさまざまな実験的プレビューを議論するセクションがあり、今回のリリースで実装された変更のいくつかは、そこから派生したものです。

  • 多くのプロジェクト、特に大きなプロジェクトでは、多くのゲームオブジェクトのレイヤーを使用することが多いので、レイヤーの組み合わせを記述し、物理用の接触ペアを生成するマトリックスもかなり大きくなってしまいます。今回のリリースでは、現在選択されている行と列をハイライト表示することで、より使いやすくなっています。
image of grid being selected
  • ジョイントは、2 つの Rigidbody を連結するために使用され、その相対的な運動に対する制約を定義するものです。Unity 2020.2 からは、ジョイントを使用して Rigidbody と ArticulationBody をリンクさせることもできるようになりました。それを可能にするために、インスペクターに表示されるプロパティが各種ジョイントのクラスに追加されました。Rigidbody と ArticulationBody の両方に同時にリンクすることは不可能なので、片方が設定されているのに両方のオプションを表示するのは、無駄に縦長のスペースを取ってしまいます。これで、設定されたプロパティのみが表示されるようになりました。
Items in menu bar being selected
  • キネマティックになっている Rigidbody は、他の物体に影響を与えることができる一方で、他の何ものにも影響を受けない特殊なタイプの物体です。その点では、静的なコライダーと似ていますが、頻繁に動かすことを想定しているのが特徴です。代表的なユースケースは、キャラクターコントローラー、アニメーション駆動の物理演算、VR(バーチャルリアリティ)の手首のシミュレーションなどです。これは、ちょうど 1 つのシミュレーションフレームで物体が到達するキネマティックな目標を設定することで制御されます。ここでの静的コライダーとの主な違いは、キネマティックな目標への到達が瞬間的なテレポート(ポーズ変更)ではなく、1 フレームでゴール到達に必要な線速度と角速度を計算し、その後にソルバーに渡すという点です。そうすれば、その動きは制約ヤコビアン行列に正しく寄与することができ、したがって、取り付けられたジョイントチェーンは正しく反応します(不具合はありません)。今回の Unity リリースでは、1 回の操作でキネマティックな目標の位置と回転の両方を設定できる、新しいメソッドを公開します。
  • Unity 2021.2 で導入された接触点の修正では、ソルバーの接触点に関する制約を作るために使用される直前に、ナローフェーズで生成された接触点の詳細を変更することができます。このリリースでは、カスタムの異方性摩擦のサンプルのような高度なユースケースのために、接触ペア内の物体の速度のゲッターを新たに追加しています 。 
  • PhysX のバージョンは、これまでの 4.x ラインの中で最新の 4.1.2 に更新されました。これはマイナーリリースなので、致命的なバグやクラッシュのみに対応しています。リリースノートはこちらでご覧ください。
  • 動的な物体がコライダーと重なったとき、ソルバーはすべての制約を満たしながら両者を引き離す修正のためのインパルスを見つけようとします。内部的にはこのインパルスはペアの各接触点ごとに計算されますが、私たちはこれまで、すべての点の総和を返す集計値しか得ることができませんでした。今回のリリースでは、各接触点のインパルスを取得することができる ContactPoint 構造体の新しいプロパティを公開します。 
  • ArticulationBody コンポーネントについては、ロボット工学コミュニティからのフィードバックを注視しています。小さなロボット部品の動作の作成と調整を容易にするために、ジョイントの制限ハンドルをスクリーンスペースに固定し、シーン内のコライダーを隠蔽しないようにしました。
zooming in on Unity object
  • 物理システムのバッチクエリは、Unity ハックウィークから得られた成果物であり、特定のユースケースを実現させるためにそのまま製品に盛り込まれましたが、最小限の機能しか備えていません。より高度なスレッドパターンを持つものなど、さらに多くのユースケースを可能にする新機能を搭載し、クエリの種類も多様化するなど、進化を続けています。このリリースでは、バッチクエリを任意の物理シーンで実行できるようにし、新しい種類のバッチクエリを 1 つ追加しています(Physics.ClosestPointCommand)。
  • MeshCollider でメッシュを使用するためには、まずベイクする必要があります。ベイクは、衝突判定に必要な空間探索構造を生成するための高価なプロセスです。通常、MeshCollider のメッシュプロパティが変更されるたびに暗黙のうちに発生し、メインスレッドで実行され、完了するまでそれ以降の作業をブロックします。Unity 2019.3では、オンデマンドでメインスレッドからベイクを実行するためのスレッドセーフなメソッドを公開しました。これは、コンテンツ生成とメッシュベイクをジョブ化することで、より高度なプロシージャルメッシュを実現するためで、スレッド使用率が大幅に向上しました。しかしこの機能の大きな欠点の 1 つに、デフォルトのクッキングオプションでのベイクにしか対応していないことがありました。今回のリリースでは、Physics.BakeMesh の新しいバリアントを公開し、任意のクッキングオプションでのベイクをサポートすることで、これを修正しました。

皆さんが新しい Inverse Dynamics API と刷新された Physics Debugger を使ってどのようなものを作成するか、楽しみにしています。最新の Unity 2022.1 ビルドを今すぐダウンロードし、ロボット工学フォーラム物理システムプレビューのフォーラムでの会話にもぜひご参加ください。 

2022年5月12日 カテゴリ: Engine & platform | 6 分 で読めます