Proxy の力
Proxy Force (プロキシの力) を使用すると、プロキシを最終位置まで引っ張る柔軟なバネのような力を持った網を表現できます。これらの力は、多くの場合、他のオブジェクトや周囲のサーフェスとの相対的な位置関係を組み合わせたものです。これらを使用して、オブジェクト間にスペースを作成する方法の計算や、オブジェクトを引き寄せてユーザーの手前に置く方法の計算など、一般的な配置シナリオをモデル化できます。
上のスクリーンショットに示したケトルには、複数の力が適用されています。このケトルは、空間を占め、サーフェス上に位置し、垂直な壁と水平面の端の近くにあります。注ぎ口のすぐ上と前にはパディング (空白の空間) があります。マグカップは空間を占め、サーフェス上に存在し、ケトルと一直線上にあります。
以下のセクションでは、アプリケーションで Proxy の力を使用する際の概念とワークフローについて説明します。基本的な力の作成、設定、位置関係の解決の手順を示します。また、初めて取り組む方のために実例も紹介します。このページを読むことで、Proxy の力を Unity MARS アプリケーションに組み込むために必要な知識が得られます。
Force コンポーネント
Proxy の力で利用可能な MARS コンポーネントの詳細については、Force リファレンスガイド を参照してください。
例
以下に 2 つの例があります。
- アバターの視線をサーフェスから自分に向ける単純なワークフロー
- より大きな例 "2 人用ディナー" のウォークスルー
基本: アバターの視線をサーフェスから自分に向ける
Proxy Force とは、プロキシに追加される Unity MARS のコンポーネントです。使用するコンポーネントの組み合わせによって、さまざまな効果を実現できます。Proxy Force は、オブジェクトどうしの間隔を確保したり、近くの端や壁といった他のオブジェクトに対して相対的に位置決めしたりするなど、細かな位置調整を行う際に便利です。これらは、平面内における配置を洗練させる目的で平面条件と一緒によく使用されます。
このセクションでは、カメラに視線を向けて追従するプロキシにアタッチされたシンプルなモデルを作成する方法を説明します。
プロキシの設定 (力を追加する前)
Proxy Force を使用する前に、アバターを置くプロキシを設定する必要があります。そのために水平面プロキシを作成します。これは以下のいずれかから実行できます。
- MARS Panel (Horizontal Plane ボタン)。
- Hierarchy ビュー (右クリックしてコンテキストメニューで MARS > Presets > Horizontal Plane の順に選択)。
次に、Horizontal Plane プロキシにその子としてモデルを追加します。Show Children on Tracking Action オプションが有効になっているため、このモデルは一致がある場合にのみ表示されます。
プロキシへの力の追加
モデルの設定が完了したら、次はそこに力を追加します。モデル (アバター) がカメラの方を向くようにするには、2 つの力が必要です。
- アバターがカメラの方を向くように動かす力
- プロキシがアタッチされている平面に対してアバターを拘束する力
そのためには、以下の手順に従います。
- 水平面プロキシを選択します。
- Forces タブの Add Force... ボタンをクリックし、Align to Camera ボタンをクリックします。
- もう一度 Add Force をクリックして Snap to Plane 2D ボタンをクリックします。
これでプロキシは 3 つのコンポーネントを持ちます。
ProxyForces
。移動などの一般的な力を設定します。ProxyAlignmentForce
。カメラに向けてプロキシを位置調整します。ProxyRegionForcePlane2D
。平面に対してアバターを制約します。
作成した力のテスト
設定を試すには、再生 ボタンをクリックして、ロードされた環境のスキャンを開始します。アバターは最初にスキャンされた平面に置かれ、カメラの方を向くはずです。
結論
以上の手順に従うと、スキャンした任意の平面上に表示されるシンプルなプロキシが完成します。このプロキシには、力の効果によって平面に制約され、カメラの方を向くアバターが含まれています。
このチュートリアルでは、Align to Camera と Snap to Plane 2D の力を使用していますが、他の力を試すこともできます。その例を以下に示します。
- Occupied Region。オブジェクトが他のオブジェクトと重ならないようにします。
- Snap to Vertical Surfaces。(オブジェクト上の) 水平面に引き寄せられるオブジェクトの領域を定義します。
- Align to Other Proxy。オブジェクトを他のオブジェクトに合わせて配置します (例: ベースとなるアイテムの近くに自動で配置されるコントロールパネル)。
前述のとおり、Unity MARS の Force はプロキシに追加できるコンポーネントです。これらの Force をどのように組み合わせるかによって、さまざまな効果を実現できます。各コンポーネントがプロキシに与える影響については、このページの Force のコンポーネント セクションを参照してください。それぞれの Force について詳しく解説しています。
例: 力を使用した 2 人用ディナー
このチュートリアルでは、2 人用 AR ディナーのために、すべてのカトラリー、鍋、ワインを配置するための設定について説明します。すべてのオブジェクトは、力を使用して配置します。
上のサムネイルは、Unity MARS の Proxy Force を使用した例 "2 人用ディナー" の動画にリンクしています。
基本的なシーン環境の設定
まず、ディナーのための基本的なテーブルの設定を作成します。2 人分の皿とその周囲に置かれるカトラリーのメッシュを追加します。
すべてのメッシュを設定したら、それらをプロキシ平面に変換します。そのためには、各ゲームオブジェクトを右クリックし、コンテキストメニューから MARS > Turn Into > Proxy Plane の順に選択します。
最後に、ディナー用に配置されるすべてのゲームオブジェクトのプロキシに、平面の条件をアタッチします。平面のサイズ条件では、最大サイズを無効にし、オブジェクトの底部をカバーするよう最小サイズを設定するようにします。
カメラを自由に動かせるようにするには、以下の手順に従います。
- ReferencePerson ゲームオブジェクトを作成します。
- それをプロキシ平面に変換します。
- Align to Camera Force を追加します。
- Allowed Motion が Move And Rotate Y に設定されていること、Target Relation が Move To And Align With に設定されていることを確認します。
皿の整理
すべての皿の基本設定が完了したら、1 つ目の皿に Align to Other Proxy Force と Snap to Horizontal Surfaces Force を追加します。
1 枚目の皿の Target Proxy を、先ほど作成した Proxy ReferencePerson に設定します。2 つのプロキシの間に緑色の線が表示されます。
2 枚目の皿についても上記の手順を繰り返しますが、Target Proxy は 1 枚目の皿に設定します。また、Target Relation が Scene Initial Relative Pose に設定されていることを確認します。
すべてのカトラリーの設定
すべてのカトラリーについて、すべて のプロキシに以下の条件と力が適用された状態にします。
Proxy の Exclusivity を Shared に設定します。これによって、すべてのプロキシが、検出された同じ平面に配置されます。
Align to Other Proxy を Proxy ReferencePerson に設定します。これによって各ゲームオブジェクトが、ユーザーを基準に正しい位置に設定されます。
(まだ存在しない場合) Alignment Condition を追加し、HorizontalUp に設定します。さらに、Snap to Plane 2D Force を追加します。
最後に、すべてのプロキシに Occupied Region Force (1) を追加して、プロキシどうしが重ならないようにします。そのためには、Occupied Region Force をクリックします。これで Region Occupied ゲームオブジェクト (2) が作成されます。占有ボリュームを設定するには、Region Occupied ゲームオブジェクトの Scale を変更します。
再生 ボタンをクリックし、ロードされた環境内で何も置かれていないテーブルを探します。これらのオブジェクトが目の前に置かれるのを確認できます。
結論
このチュートリアルでは、ユーザーが直接見ているサーフェス上に複数のゲームオブジェクトを配置する手順を説明しました。これらのゲームオブジェクトは、力を使用して自動的にサーフェスに配置されます。このように力は、特定の空間の中で、複数のオブジェクトを互いに関連させて配置したい場合に活用できます。
試しにすべての Proxy Force の Continuous Solve を無効にしてみましょう。オブジェクトは、最初に配置された位置に留まるようになります。
この例のトラブルシューティング
一度に 1 つのオブジェクトしか表示されない場合は、関連するすべてのプロキシの Exclusivity を Shared (すべてのプロキシで同じサーフェスを "共有") に設定してみてください。
オブジェクトが重ならないようにするには、上記の各オブジェクトに Region Occupancy Force を追加して調整します。
皿とカトラリーの間に少し余裕を持たせるには、Padding Region Force を追加し、何もない空間の量を適宜調整します。
以下、参考までに、主要な Force タイプに共通する設定のスクリーンショットを示します。
プロキシなしでの力の使用
Unity MARS では、プロキシを使わずに力を使用できます。これは上級ユーザーにのみ推奨されます。
プロキシを使わずに力を使用するには、プロキシの代わりに、空のゲームオブジェクトに Proxy Forces コンポーネントとその関連力を追加します。この場合、力は最初から有効になります。
これに対して、プロキシの力は、関連するプロキシで一致が検出された後にのみ作用し、力が適用される時間も、その一致がアクティブである間のみです。また、プロキシのポーズが力によって更新されるのも、SetPose などのアクションに到達するまでです。
Proxy Force に関する重要な考慮事項
Proxy Force は Unity の物理演算システムに依存しないため、Proxy Force の領域トランスフォームはトランスフォームによって決定され、そのトランスフォームの境界はスケールで指定されます。Proxy Force の領域トランスフォームの境界を変更したい場合は、リンクされたトランスフォームのスケールを変更して、そのボリュームを設定する必要があります。
トラブルシューティングと FAQ
- カメラが動くときのモーションが "ぎくしゃく" する。
- 解決策: Set Pose Action を無効にし、Follow Match Updates を false に設定します。スキャン時にオブジェクトが飛び跳ねているように見える場合は、Set Pose Action により、オブジェクトがユーザーの移動中に検出された平面の "中心" に更新されていることが原因として考えられます。
- 同じサーフェスに複数のオブジェクトを表示したい。
- 解決策: プロキシの Exclusivity を Exclusive ではなく Shared に設定します。Shared に設定することで、複数のプロキシが同じデータ平面を共有できますが、プロキシが重なり合わないよう Occupied Region を使用することをお勧めします。デフォルトは Reserved で、特定のデータを使用できるプロキシが一度に 1 つのみになっています。Read Only に設定した場合は、そのデータを他のプロキシが予約または共有しているかどうかを調べることなくオブジェクトが配置されます。
- いったん配置したオブジェクトが動かないようにしたい。
- 解決策: リアルタイムの力解決を無効に (Proxy Forces/Continuous Solve オプションを false に設定) します。
- 静的オブジェクトが正しい位置に解決されません。
- 解決策: これを修正する最も簡単な方法は、スクリプトを使用することです。
ProxyForces.TrySingleSolve
を呼び出すか、ProxyForces.continuousSolve
を有効にしてから無効にします。また、ユーザーの対話操作によってポーズを修正する方法もしばしば推奨され、連続解決が有効になっている状態で使用できます。
- 解決策: これを修正する最も簡単な方法は、スクリプトを使用することです。