境界ボックス — MRTK2

境界ボックス

Note

境界ボックスは非推奨の機能であり、後継の境界コントロールに置き換わります。 いずれかの移行オプションを使用して、既存のゲームオブジェクトをアップグレードします。

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

詳細については、Windows デベロッパーセンターの境界ボックスとアプリバーを参照してください。

シーンの例

境界ボックスの構成の例を、BoundingBoxExamplesシーンで確認できます。

境界ボックスの例

ユニティ インスペクターを使用して境界ボックスを追加し構成する方法

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

Note

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

境界ボックス 1

コードで境界ボックスを追加し構成する方法

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

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

    private BoundingBox bbox;
    bbox = cube.AddComponent<BoundingBox>();
    
  3. オプションを構成します (下記のインスペクター プロパティのセクションを参照)。

    // Make the scale handles large
    bbox.ScaleHandleSize = 0.1f;
    // Hide rotation handles
    bbox.ShowRotationHandleForX = false;
    bbox.ShowRotationHandleForY = false;
    bbox.ShowRotationHandleForZ = false;
    
  4. (オプション) HoloLens 2 スタイルの境界ボックスにプレハブとマテリアルを割り当てます。 マテリアルとプレハブを動的に読み込む必要があるため、この場合はインスペクターによる割り当ても必要です。

Note

実行時にシェーダーの順列が欠落している可能性があるため、ユニティの「リソース」フォルダーまたは Shader.Find を使用してシェーダーを動的に読み込むことはお勧めしません。

bbox.BoxMaterial = [Assign BoundingBox.mat]
bbox.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
bbox.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
bbox.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
bbox.ScaleHandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
bbox.ScaleHandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
bbox.ScaleHandleSize = 0.016f;
bbox.ScaleHandleColliderPadding = 0.016f;
bbox.RotationHandleSlatePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
bbox.RotationHandleSize = 0.016f;
bbox.RotateHandleColliderPadding = 0.016f;

例:MinMaxScaleConstraint を使用して境界ボックスの最小、最大スケールを設定します。

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

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bbox = cube.AddComponent<BoundingBox>();
// Important: BoundingBox creates a scale handler on start if one does not exist
// do not use AddComponent, as that will create a  duplicate handler that will not be used
MinMaxScaleConstraint scaleConstraint = bbox.gameObject.GetComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

例:ゲーム オブジェクトの周囲に境界ボックスを追加します。

オブジェクトの周囲に境界ボックスを追加するには、BoundingBox コンポーネントを追加するだけでよいです。

private void PutABoxAroundIt(GameObject target)
{
   target.AddComponent<BoundingBox>();
}

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

ターゲット オブジェクト

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

境界オーバーライド

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

アクティブ化の挙動

境界ボックスのインターフェイスをアクティブ化するための複数のオプションがあります。

  • 起動時におけるアクティブ化:シーンを開始すると境界ボックスは可視になります。
  • 近接によるアクティブ化:多関節手がオブジェクトに近づくときに境界ボックスは可視になります。
  • ポインターによるアクティブ化:ハンドレイ ポインターによってターゲット設定が行われるときに境界ボックスは可視になります。
  • 手動でのアクティブ化:境界ボックスは自動的に可視になりません。 スクリプトを介して boundingBox.Active プロパティにアクセスすることで境界ボックスを手動でアクティブ化できます。

スケールの最小化

最小許容スケールです。 このプロパティは非推奨であり、MinMaxScaleConstraint スクリプトを追加することをお勧めします。 このスクリプトを追加した場合、最小スケールは境界ボックスではなくそのスクリプトから取得されます。

スケールの最大化

最大許容スケール。 このプロパティは非推奨であり、MinMaxScaleConstraint スクリプトを追加することをお勧めします。 このスクリプトを追加した場合、最大スケールは境界ボックスではなくそのスクリプトから取得されます。

ボックス表示

境界ボックスのさまざまな視覚化オプションです。

軸の平坦化が自動平坦化に設定されている場合、スクリプトは、最小程度でも軸に沿った操作を許可しません。 その結果、通常シン オブジェクトに使用される 2D 境界ボックスをもたらします。

ハンドル

マテリアルとプレハブを割り当ててハンドルスタイルをオーバーライドできます。 ハンドルが割り当てられていない場合、既定のスタイルで表示されます。

イベント

境界ボックスは以下のイベントを提供します。 この例では、これらのイベントを使用してオーディオ フィードバックを再生します。

  • 回転開始:回転が始まるときに発生します。
  • 回転終了:回転が終わるときに発生します。
  • スケール開始:スケーリングが始まるときに発生します。
  • スケール終了:スケーリングが終わるときに発生します。
events

ハンドルのスタイル

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

境界ボックス ハンドルのスタイル

HoloLens 2 スタイルの境界ボックスのハンドルのプレハブ、マテリアル、スケーリング値は以下のとおりです。 この例は BoundingBoxExamples シーンで見つかります。

HandStyles 2

ハンドル (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
  • 回転ハンドルのコライダーのパディング:0.016 (つかむことが可能なコライダーをハンドルのビジュアルよりも少し大きくします)

近接 (HoloLens 2 スタイルに設定します)

手までの距離に基づいて、アニメーション付きでハンドルを表示し非表示にします。 2 段階の拡大縮小アニメーションがあります。

近接通信
  • 近接効果のアクティブ化:近接に基づいたハンドルのアクティブ化を有効にします。
  • ハンドルへの中距離近接:第1段階のスケーリングのための距離
  • ハンドルへの近距離近接:第2段階のスケーリングのための距離
  • 遠距離スケール: 手が境界ボックスの相互作用の範囲外にある場合のハンドル アセットの既定のスケール値 (上記の距離は 、"中距離のハンドル" で定義されます)。既定でハンドルを非表示にするには、0 を使用します)
  • 中スケール: 手が境界ボックスの相互作用の範囲内にある場合のハンドル アセットのスケール値 (上記の 「ハンドル近接」で定義された距離)。通常のサイズを表示するには、1 を使用します)
  • 閉じるスケール: 手がグラブ操作の範囲内にある場合のハンドル アセットのスケール値 (上記の 「近接のハンドル」で定義された距離)。1.x を使用して大きなサイズを表示する)

操作ハンドラーを使用してオブジェクトを移動可能にします。

境界ボックスを ManipulationHandler.cs と組み合わせて、遠距離対話式操作を使用してオブジェクトを移動可能にすることができます。 操作ハンドラーは、1 本の手による対話式操作と 2 本の手による対話式操作の両方をサポートします。 ハンド トラッキングは、すぐ近くにあるオブジェクトの操作に使用できます。

操作ハンドラー

境界ボックスの辺の挙動を、ManipulationHandler の遠距離対話式操作を使用して移動するときと同じようにするには、上記のスクリーンショットで示されるように、操作開始時 / 操作終了時のイベントをそれぞれBoundingBox.HighlightWires / BoundingBox.UnhighlightWiresに関連付けることをお勧めします。

境界コントロールへの移行

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

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

境界コントロールの移行