制約 — MRTK3

ConstraintManager を使用すると、変換に制約コンポーネントのセットを適用できます。 既定では、制約マネージャーはアタッチされたすべての制約コンポーネントを自動的に収集し、ターゲット オブジェクトに適用します。 ただし、適用される制約のリストを手動で構成して、アタッチされた制約のサブセットのみが使用されるようにすることもできます。

注意

現在、MRTK3 は MRTK 2.x からの制約の限定されたサブセットを提供しています。 開発者ワークフローをソルバーおよびエラスティックと統合するための制約システムのリファクタリングの調査を現在行っています。 ご期待ください。

現在、次の MRTK UX 要素が制約をサポートしています。

制約マネージャーは、次の 2 つのモードで動作できます。

  • 自動による制約選択
  • 手動による制約選択

制約の選択

自動による制約選択

自動選択モード

既定の自動モードでは、アタッチされているすべての制約コンポーネントが一覧表示されます。 [コンポーネントに移動] ボタンを使用してインスペクターでコンポーネントに直接ジャンプすることも、ドロップダウンから新しい制約を追加することもできます。

手動による制約選択

手動選択モード

制約マネージャーが手動モードに設定されている場合は、制約リストでリンクされている制約のみが処理されて変換に適用されます。 初めて手動モードを有効にすると、マネージャーは現在アタッチされているすべての制約をリストに自動的に設定します。

注意

[エントリの削除] アクションは、手動選択リストから制約を削除するだけです。 コンポーネントは引き続き GameObject に存在します。

実行順序

各制約の実行順序は、制約自体の [実行順序] オプションで定義できます。 順序は、制約マネージャーに表示される一覧に反映されます。 制約には、異なる順序で結合されると異なる動作をするものがあるため、それぞれの制約の優先順位に留意し、適切に順序を調整します。

変換の制約

制約を使用して、操作の制限を行うこともできます。 たとえば、あるアプリケーションで回転が必要で、しかもオブジェクトは直立状態に維持することが必要な場合があります。 この場合、RotationAxisConstraint をオブジェクトに追加し、回転を y 軸回転に制限するために使用できます。 MRTK にはいくつかの制約が用意されており、そのすべてについて以下で説明します。

また、新しい制約を定義し、一部のアプリケーションで必要になる可能性がある独自操作の動作を作成するために使用することもできます。 これを行うには、TransformConstraint から継承するスクリプトを作成し、ConstraintType 抽象プロパティと ApplyConstraint 抽象メソッドを実装します。 新しい制約がドロップダウンに表示され、オブジェクトに追加されると自動的に制約マネージャーに登録されます。

MRTK で提供されるすべての制約には、次の共通プロパティがあります。

手の種類 (Hand Type) では、制約を片手、両手、または両方のどの種類の操作に使用するかを指定します。 このプロパティはフラグなので、両方のオプションを選択できます。

  • 片手 (One handed): 選択すると、制約は片手操作時に使用されます。
  • 両手 (Two handed): 選択すると、制約は両手操作時に使用されます。

近接の種類 (ProximityType) では、制約を近く、遠く、または両方のどの種類の操作に使用するかを指定します。 このプロパティはフラグなので、両方のオプションを選択できます。

  • 近く (Near): 選択すると、制約は近くの操作時に使用されます。
  • 遠く (Far): 選択すると、制約は遠くの操作時に使用されます。

FaceUserConstraint

この制約は、オブジェクトが常にユーザーの方向を向くよう、オブジェクトの回転を制限します。 [反対側を向く] オプションでは、正または負の Z 軸のどちらを使用するかを制御します。

FaceUserConstraint のデモ

FixedDistanceConstraint

この制約は、操作されるオブジェクトと別のオブジェクト変換との間の、操作開始時の距離を固定します。 これは、操作されるオブジェクトからヘッド変換までの距離を固定するなどの動作に役立ちます。 [制約変換] フィールドは既定でカメラ変換に設定され、操作されたオブジェクトの距離が固定されているもう 1 つの変換です。

FixedDistanceConstraint のデモ

MaintainApparentSizeConstraint

この制約がオブジェクトにアタッチされている場合、オブジェクトがユーザーからどれだけ離れていても、ユーザーに対して見かけでは同じサイズが維持されます (つまり、ユーザーの視野において同じ割合を占めます)。 これを使用すると、スレートまたはテキスト パネルを操作中も読みやすい状態に維持することができます。

MaintainApparentSizeConstraint のデモ

MoveAxisConstraint

この制約を使用すると、操作されるオブジェクトをどの軸に沿って移動できるかを固定できます。 これは、平面上で、または直線に沿ってオブジェクトを操作する場合に便利です。
[ 移動時の制約] フィールドでは、移動を禁止する軸を指定します。 既定では、これらの軸はローカルではなくグローバルですが、以下で変更できます。 このプロパティはフラグなので、任意の個数のオプションを選択できます。

MoveAxisConstraint のデモ

MinMaxScaleConstraint

この制約により、オブジェクトのスケールが制限され、ユーザーがオブジェクトを使用できないほど小さい、または大きいサイズにスケーリングするのを防ぐのに役立ちます。 ハンドルベースのスケーリング (BoundsControl を使用) と、2 ハンド ダイレクト スケーリング (ObjectManipulator を使用) の両方で動作します。 [初期状態に対する相対] オプションでは、特定の[最小]スケール値と[最大スケール]値が絶対値であるか、またはオブジェクトの初期スケールに対して乗算されるかを定義します。

MinMaxScaleConstraint のデモ

RotationAxisConstraint

この制約を使用すると、操作されるオブジェクトが回転できる軸を固定できます。 たとえば、操作されるオブジェクトを直立させたまま、y 軸を中心にした回転を許可する場合に便利です。
[ 回転時の制約] フィールドは、回転を回避する軸を指定します。 既定では、これらの軸はローカルではなくグローバルですが、以下で変更できます。 このプロパティはフラグなので、任意の個数のオプションを選択できます。

RotationAxisConstraint のデモ