境界コントロール — MRTK2

境界コントロール

BoundsControl は、以前は BoundingBox にあった操作動作の新しいコンポーネントです。 境界コントロールにより、セットアップにおいて多くの機能強化と簡略化が行われ、新しい機能が追加されます。 このコンポーネントは、非推奨となる境界ボックスに代わるものです。

BoundsControl.cs スクリプトは、Mixed Reality でオブジェクトを変換するための基本的な機能を提供します。 境界コントロールは、ホログラムが操作可能であることを示すために、ホログラムの周囲にボックスを表示します。 ボックスの隅と辺のハンドルを使用すると、オブジェクトを拡大縮小、回転、または移動できます。 境界コントロールは、ユーザー入力にも反応します。 たとえば HoloLens 2 では、境界コントロールは指の近さに反応して、オブジェクトからの距離を認識するのに役立つ視覚的なフィードバックを提供します。 すべての対話式操作とビジュアルは簡単にカスタマイズできます。

シーンの例

境界コントロールの構成の例は、BoundsControlExamples シーンで確認できます。

境界コントロールの例

インスペクターのプロパティ

ターゲット オブジェクト

このプロパティは、境界コントロールの操作によって変換されるオブジェクトを指定します。 オブジェクトが設定されていない場合、既定でオーナー オブジェクトが設定されます。

アクティブ化の動作

境界コントロールのインターフェイスをアクティブ化するオプションは複数あります。

  • [Activate On Start] (開始時にアクティブ化): シーンが開始されると境界コントロールが表示されます。
  • [Activate By Proximity] (近接によりアクティブ化): 多関節ハンドがオブジェクトに近づくと境界コントロールが表示されます。
  • [Activate By Pointer] (ポインターによりアクティブ化): ハンド レイ ポインターによってターゲットが設定されると境界コントロールが表示されます。
  • [Activate By Proximity and Pointer] (近接とポインターによりアクティブ化): ハンド レイ ポインターによってターゲットが設定されるか、多関節ハンドがオブジェクトに近づくと、境界コントロールが表示されます。
  • [Activate Manually] (手動でアクティブ化): 境界コントロールは自動的には表示されません。 これをスクリプトを使用して手動でアクティブ化するには、boundsControl.Active プロパティにアクセスします。

境界のオーバーライド

境界計算のためにオブジェクトからのボックス コライダーを設定します。

ボックスのパディング

コントロールの範囲を計算するために使用されるコライダー境界にパディングを追加します。 これは対話式操作に影響するだけでなく、ビジュアルにも影響します。

平面化軸

コントロールを軸の 1 つで平面化して 2 次元にし、その軸に沿った操作を禁止するかどうかを示します。 この機能は、スレートのような薄いオブジェクトに使用できます。 平面化軸が [Flatten Auto] (自動的に平面化) に設定されている場合、スクリプトによって、範囲が最も小さい軸が平面化軸として自動的に選択されます。

スムージング

スムージング セクションを使用すると、コントロールの拡大縮小と回転のスムージング動作を構成できます。

ビジュアル

境界コントロールの外観は、対応するビジュアル構成のいずれかを変更することで構成できます。 ビジュアル構成は、リンクされているかインライン化されたスクリプト作成可能なオブジェクトです。詳しくは、構成オブジェクトに関するセクションを参照してください。

構成オブジェクト

コントロールには、スクリプト作成可能なオブジェクトとして保存でき、異なるインスタンスまたはプレハブ間で共有できる一連の構成オブジェクトが用意されています。 構成は、スクリプト作成可能な個別アセット ファイルとして、またはプレハブ内で入れ子になったスクリプト作成可能なアセットとして共有およびリンクできます。 さらに、外部のまたは入れ子になったスクリプト作成可能なアセットにリンクすることなく、インスタンスで構成を直接定義することもできます。

境界コントロール インスペクターは、プロパティ インスペクターにメッセージを表示することによって、構成が共有されているか、または現在のインスタンスの一部としてインライン化されているかを示します。 また、共有インスタンスは、境界コントロール プロパティ ウィンドウ自体で直接編集できません。代わりに、共有構成を誤って変更しないようにするために、リンク先のアセットを直接変更する必要があります。

現在、境界コントロールには、次の機能の構成オブジェクト オプションが用意されています。

ボックス構成

ボックス構成は、コライダー サイズとボックス パディングによって定義された境界を持つ実線のボックスのレンダリングを担当します。 次のプロパティを設定できます。

  • [Box material] (ボックス素材): 対話式操作がない場合にレンダリング対象ボックスに適用する素材を定義します。 ボックスは、この素材が設定されている場合にのみレンダリングされます。
  • [Box grabbed material] (つかんだ状態のボックスの素材): ユーザーが近接または遠隔の対話式操作によってつかむことでコントロールを操作したときのボックスの素材。
  • [Flatten axis display scale] (平面化軸の表示スケール): 軸の 1 つが平面化された場合にボックス表示に適用するスケール。

拡大縮小ハンドルの構成

このプロパティ ドロワーを使用すると、境界コントロールの拡大縮小ハンドルの動作と視覚エフェクトを変更できます。

  • [Handle material] (ハンドルの素材): ハンドルに適用する素材。
  • [Handle grabbed material] (つかんだ状態のハンドルの素材): つかまれたハンドルに適用する素材。
  • [Handle prefab] (ハンドルのプレハブ): 拡大縮小ハンドルのオプションのプレハブ。 未設定の場合、MRTK では既定で立方体が使用されます。
  • [ハンドルのサイズ]: 拡大縮小ハンドルのサイズ。
  • [Collider padding] (コライダーのパディング): ハンドル コライダーに追加するパディング。
  • [Draw tether when manipulating] (操作時にテザーを描画する): アクティブにすると、対話式操作の開始地点から現在の手またはポインターの位置までテザー線が描画されます。
  • [Handles ignore collider] (ハンドルでコライダーを無視する): コライダーがここにリンクされている場合、ハンドルはこのコライダーとの衝突を無視します。
  • [Handle slate prefab] (ハンドルのスレート プレハブ): コントロールが平面化されたときにハンドルに使用するプレハブ。
  • [Show scale handles] (拡大縮小ハンドルの表示): ハンドルの表示を制御します。
  • [Scale behavior] (拡大縮小の動作): 均等または不均等の拡大縮小に設定できます。

回転ハンドルの構成

この構成では、回転ハンドルの動作を定義します。

  • [Handle material] (ハンドルの素材): ハンドルに適用する素材。
  • [Handle grabbed material] (つかんだ状態のハンドルの素材): つかまれたハンドルに適用する素材。
  • [Handle prefab] (ハンドルのプレハブ): ハンドルのオプションのプレハブ。 未設定の場合、MRTK では既定で球体が使用されます。
  • [ハンドルのサイズ]: ハンドルのサイズ。
  • [Collider padding] (コライダーのパディング): ハンドル コライダーに追加するパディング。
  • [Draw tether when manipulating] (操作時にテザーを描画する): アクティブにすると、対話式操作の開始地点から現在の手またはポインターの位置までテザー線が描画されます。
  • [Handles ignore collider] (ハンドルでコライダーを無視する): コライダーがここにリンクされている場合、ハンドルはこのコライダーとの衝突を無視します。
  • [Handle prefab collider type] (ハンドル プレハブ コライダーの種類): 作成されたハンドルで使用するコライダーの種類。
  • [Show handle for X] (X のハンドルを表示): X 軸のハンドルの表示を制御します。
  • [Show handle for Y] (Y のハンドルを表示): Y 軸のハンドルの表示を制御します。
  • [Show handle for Z] (Z のハンドルを表示): Z 軸のハンドルの表示を制御します。

移動ハンドルの構成

境界コントロールの移動ハンドルを有効化し、構成することができます。 移動ハンドルは既定では無効になっていることに注意してください。

  • [Handle material] (ハンドルの素材): ハンドルに適用する素材。
  • [Handle grabbed material] (つかんだ状態のハンドルの素材): つかまれたハンドルに適用する素材。
  • [Handle prefab] (ハンドルのプレハブ): ハンドルのオプションのプレハブ。 未設定の場合、MRTK では既定で球体が使用されます。
  • [ハンドルのサイズ]: ハンドルのサイズ。
  • [Collider padding] (コライダーのパディング): ハンドル コライダーに追加するパディング。
  • [Draw tether when manipulating] (操作時にテザーを描画する): アクティブにすると、対話式操作の開始地点から現在の手またはポインターの位置までテザー線が描画されます。
  • [Handles ignore collider] (ハンドルでコライダーを無視する): コライダーがここにリンクされている場合、ハンドルはこのコライダーとの衝突を無視します。
  • [Handle prefab collider type] (ハンドル プレハブ コライダーの種類): 作成されたハンドルで使用するコライダーの種類。
  • [Show handle for X] (X のハンドルを表示): X 軸のハンドルの表示を制御します。
  • [Show handle for Y] (Y のハンドルを表示): Y 軸のハンドルの表示を制御します。
  • [Show handle for Z] (Z のハンドルを表示): Z 軸のハンドルの表示を制御します。

リンクの構成によって、境界コントロールのワイヤーフレーム機能が有効になります。 次のプロパティを構成できます。

  • [Wireframe material] (ワイヤーフレームの素材): ワイヤーフレーム メッシュに適用する素材。
  • [Wireframe edge radius] (ワイヤーフレームのふち範囲): ワイヤーフレームの太さ。
  • [Wireframe shape] (ワイヤーフレームの形状): ワイヤーフレームの形状は、立方体または円柱のいずれかです。
  • [Show wireframe] (ワイヤーフレームの表示): ワイヤーフレームの表示を制御します。

近接効果の構成

手までの距離に応じて、アニメーション付きでハンドルを表示するか非表示にします。 2 段階の拡大縮小アニメーションがあります。 既定値は HoloLens 2 スタイルの動作に設定されます。

境界コントロール近接
  • [Proximity Effect Active] (近接効果でアクティブ化): 近さに基づいたハンドルのアクティブ化を有効にします
  • [Object Medium Proximity] (オブジェクトまでの近さ (中)): 第 1 段階の拡大縮小の距離
  • [Object Close Proximity] (オブジェクトまでの近さ (近)): 第 2 段階の拡大縮小の距離
  • 遠距離スケール: 手が境界コントロールの相互作用の範囲外にある場合のハンドル アセットの既定のスケール値 (上記の距離は 、"ハンドル中近接度" で定義されています)。既定でハンドルを非表示にするには、0 を使用します)
  • 中程度のスケール: 手が境界コントロールの相互作用の範囲内にある場合のハンドル アセットのスケール値 (上記の距離は、"ハンドル近接" によって定義されます)。標準サイズを表示するには、1 を使用します)
  • 閉じるスケール: 手がグラブ操作の範囲内にある場合のハンドルアセットのスケール値(上記の距離は「近接近接のハンドル」で定義されています)。1.x を使用して大きなサイズを表示する)
  • [Far Grow Rate] (遠距離拡大率): 手が中程度の近さから遠くに移動したときの、近さで拡大縮小するオブジェクトのスケールを設定。
  • [Medium Grow Rate] (中距離拡大率): 手が中程度の近さから近くに移動したときの、近さで拡大縮小するオブジェクトのスケールを設定。
  • [Close Grow Rate] (近距離拡大率): 手が極めて近くからオブジェクトの中心に移動するときの、近さで拡大縮小するオブジェクトのスケールを設定。

制約システム

境界コントロールでは、境界コントロール ハンドル使用時の移動、回転、または拡大縮小を制限または変更するために、制約マネージャーの使用をサポートしています。

プロパティ インスペクターにより、同じゲーム オブジェクトにアタッチされている使用可能なすべての制約マネージャーがドロップダウンに表示されます。このドロップダウンには、選択した制約マネージャーをスクロールおよび強調表示するためのオプションがあります。

境界コントロールの制約

イベント

境界コントロールでは、次のイベントが提供されます。 この例では、これらのイベントを使用して、オーディオ フィードバックを再生します。

  • [Rotate Started] (回転開始): 回転が開始されると発生します。
  • [Rotate Stopped] (回転停止): 回転が停止すると発生します。
  • [Scale Started] (拡大縮小開始): 拡大縮小が開始されると発生します。
  • [Scale Stopped] (拡大縮小停止): 拡大縮小が停止すると発生します。
  • [Translate Started] (移動開始): 移動が開始されると発生します。
  • [Translate Stopped] (移動停止): 移動が停止すると発生します。
境界コントロール イベント

エラスティック (試験段階)

エラスティックは、境界コントロールを介してオブジェクトを操作するときに使用できます。 エラスティック システムはまだ試験段階であることに注意してください。 エラスティックを有効にするには、既存のエラスティック マネージャー コンポーネントをリンクするか、Add Elastics Manager ボタンを使用して新しいエラスティック マネージャーを作成してリンクします。

境界コントロールエラスティック

ハンドルのスタイル

既定では、BoundsControl.cs スクリプトを割り当てただけの場合、HoloLens 第 1 世代スタイルのハンドルが表示されます。 HoloLens 2 スタイルのハンドルを使用するには、適切なハンドルのプレハブと素材を割り当てる必要があります。

境界コントロール ハンドル のスタイル 2

HoloLens 2 スタイルの境界コントロール ハンドルに対するプレハブ、素材、拡大縮小の値は以下のとおりです。 この例は BoundsControlExamples シーンで確認できます。

Bounds コントロール HandleStyles

ハンドル (HoloLens 2 スタイルの設定)

  • [Handle Material] (ハンドルの素材): BoundingBoxHandleWhite.mat
  • [Handle Grabbed Material] (つかんだ状態のハンドルの素材): BoundingBoxHandleBlueGrabbed.mat
  • [Scale Handle Prefab] (拡大縮小ハンドルのプレハブ): MRTK_BoundingBox_ScaleHandle.prefab
  • [Scale Handle Slate Prefab] (拡大縮小ハンドルのスレート プレハブ): MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • [Scale Handle Size] (拡大縮小ハンドルのサイズ): 0.016 (1.6 cm)
  • [Scale Handle Collider Padding] (拡大縮小ハンドルのコライダーのパディング): 0.016 (つかむことができるコライダーをハンドルのビジュアルより少し大きくする)
  • [Rotation Handle Prefab] (回転ハンドルのプレハブ): MRTK_BoundingBox_RotateHandle.prefab
  • [Rotation Handle Size] (回転ハンドルのサイズ): 0.016
  • [Rotation Handle Collider Padding] (回転ハンドルのコライダーのパディング): 0.016 (つかむことができるコライダーをハンドルのビジュアルより少し大きくする)

オブジェクト マニピュレーターによる変換の変更

境界コントロールを と ObjectManipulator.cs 組み合わせて使用すると、ハンドルを使用せずに特定の種類の操作 (オブジェクトの移動など) を行うことができます。 操作ハンドラーは、片手と 2 本の手による対話式操作の両方をサポートします。 ハンド トラッキングは、すぐ近くにあるオブジェクトの操作に使用できます。

境界コントロール オブジェクト マニピュレーター

境界コントロールのエッジが '遠距離相互作用' を使用してObjectManipulator移動するときに同じように動作するためには、上のスクリーンショットに示すように、操作が終了したときに開始 / された操作時のイベントをそれぞれ にBoundsControl.HighlightWires / BoundsControl.UnhighlightWires接続することをお勧めします。

Unity Inspector を使用して境界コントロールを追加および構成する方法

  1. ボックス コライダーをオブジェクトに追加します
  2. BoundsControl スクリプトをオブジェクトに割り当てます
  3. "アクティブ化" 方法などのオプションを構成します (下記「インスペクターのプロパティ」セクションを参照)
  4. (オプション) HoloLens 2 スタイルの境界コントロール用のプレハブと素材を割り当てます (下記「ハンドルのスタイル」セクションを参照)

Note

複数の子コンポーネントがあるオブジェクトで特定のオブジェクトとコライダーを割り当てるには、インスペクターの [ターゲット オブジェクト] および [Bounds Override] (境界のオーバーライド) フィールドを使用します。

境界コントロール

コードで境界コントロールを追加および構成する方法

  1. cube という GameObject のインスタンスを作成します

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
  2. AddComponent<>() を使用して、コライダーのあるオブジェクトに BoundsControl スクリプトを割り当てます

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. オプションの構成は、コントロールで直接行うか、スクリプト作成可能な構成のいずれかを使用して行います (下記「インスペクターのプロパティ」および「構成」セクションを参照)

    // Change activation method
    boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer;
    // Make the scale handles large
    boundsControl.ScaleHandlesConfig.HandleSize = 0.1f;
    // Hide rotation handles for x axis
    boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
    
  4. (省略可能) HoloLens 2 スタイルの境界コントロールに対してプレハブと素材を割り当てます。 素材とプレハブは動的に読み込む必要があるため、この場合もインスペクターを使用して割り当てる必要があります。

Note

シェーダーの順列が実行時に見つからない場合があるため、Unity の "Resources" フォルダーまたは Shader.Find を使用してシェーダーを動的に読み込むことはお勧めしません。

BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;

例: MinMaxScaleConstraint を使用して、境界コントロールの最小、最大スケールを設定する

最小および最大スケールを設定するには、MinMaxScaleConstraint をコントロールにアタッチします。 境界コントロールは、制約マネージャーを自動的にアタッチしてアクティブ化するため、MinMaxScaleConstraint がアタッチされ構成されると、変換の変更に自動的に適用されます。

MinMaxScaleConstraint を使用して ObjectManipulator の最小および最大スケールを設定することもできます。

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

例: ゲーム オブジェクトの周囲に境界コントロールを追加する

オブジェクトの周囲に境界コントロールを追加するには、BoundsControl コンポーネントをオブジェクトに追加するだけです。

private void PutABoundsControlAroundIt(GameObject target)
{
   target.AddComponent<BoundsControl>();
}

境界ボックスからの移行

境界ボックスを使用している既存のプレハブとインスタンスは、MRTK ツール パッケージの一部である移行ウィンドウを使用して新しい境界コントロールにアップグレードできます。

境界ボックスの個々のインスタンスをアップグレードするために、コンポーネントのプロパティ インスペクター内にも移行オプションがあります。

境界コントロールの移行

関連項目