次の方法で共有


境界ボックス — MRTK2

境界ボックス

注:

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

BoundingBox.cs スクリプトは、Mixed Reality でオブジェクトを変換するための基本的な機能を提供します。 境界ボックスには、ホログラムを操作できることを示すキューブが表示されます。 キューブの角と端のハンドルを使用すると、オブジェクトをスケーリングまたは回転できます。 境界ボックスは、ユーザー入力にも反応します。 たとえば、HoloLens 2では、境界ボックスは指の近接性に応答し、オブジェクトからの距離を認識するのに役立つ視覚的フィードバックを提供します。 すべての操作とビジュアルを簡単にカスタマイズできます。

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

シーンの例

境界ボックスの構成の例は、 BoundingBoxExamples シーンにあります。

境界ボックスの例

Unity Inspector を使用して境界ボックスを追加して構成する方法

  1. Box コライダーをオブジェクトに追加する
  2. オブジェクト BoundingBox スクリプトを割り当てる
  3. 'Activation' メソッドなどのオプションを構成する (下記 の「インスペクターのプロパティ 」セクションを参照)
  4. (省略可能)HoloLens 2 スタイル境界ボックスにプレハブとマテリアルを割り当てる (後述の「スタイルを処理する」セクションを参照)

注:

複数の子コンポーネントを持つオブジェクト内の特定のオブジェクトとコライダーを割り当てるには、インスペクターの [ ターゲット オブジェクト] フィールドと [ 境界のオーバーライド ] フィールドを使用します。

境界ボックス 1

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

  1. キューブ 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 スタイル境界ボックスにプレハブとマテリアルを割り当てます。 マテリアルとプレハブを動的に読み込む必要があるため、これは引き続きインスペクターを介した割り当てが必要です。

注:

シェーダーの順列が実行時に見つからない可能性があるため、Unityの 'Resources' フォルダーまたは 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>();
}

Inspector プロパティ

ターゲット オブジェクト

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

境界のオーバーライド

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

アクティブ化の動作

境界ボックス インターフェイスをアクティブ化するには、いくつかのオプションがあります。

  • [起動時にアクティブ化]: シーンが開始されると、境界ボックスが表示されます。
  • 近接でアクティブ化: 連結された手がオブジェクトに近い場合、境界ボックスが表示されます。
  • [ポインターでアクティブ化]: 境界ボックスは、ハンドレイ ポインターの対象になると表示されます。
  • 手動でアクティブ化: 境界ボックスは自動的には表示されません。 boundingBox.Active プロパティにアクセスすることで、スクリプトを使用して手動でアクティブ化できます。

最小スケール

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

最大スケール

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

ボックス表示

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

[軸のフラット化 ] が [自動フラット化] に設定されている場合、スクリプトは軸に沿った操作を最も小さい範囲で禁止します。 これにより、通常は薄いオブジェクトに使用される 2D 境界ボックスが作成されます。

ハンドル

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

イベント

境界ボックスには、次のイベントが表示されます。 この例では、これらのイベントを使用してオーディオ フィードバックを再生します。

  • 回転開始: 回転開始時に発生します。
  • 回転終了: 回転が終了したときに発生します。
  • スケール開始: スケーリングの開始時に起動します。
  • スケール終了: スケーリングが終了すると起動します。
イベント

スタイルを処理する

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

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

HoloLens 2 スタイルの境界ボックス ハンドルのプレハブ、マテリアル、スケーリング値を次に示します。 この例は、 BoundingBoxExamples シーンにあります。

HandStyles 2

ハンドル (HoloLens 2 スタイルのセットアップ)

  • ハンドル マテリアル: BoundingBoxHandleWhite.mat
  • ハンドルつかまれた素材: BoundingBoxHandleBlueGrabbed.mat
  • スケール ハンドル プレハブ: MRTK_BoundingBox_ScaleHandle.prefab
  • スケール ハンドル スレート プレハブ: MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • スケール ハンドルサイズ: 0.016 (1.6cm)
  • スケール ハンドル コライダーパディング: 0.016 (ハンドルビジュアルよりもグラブ可能なコライダーをわずかに大きくします)
  • 回転ハンドル プレハブ: MRTK_BoundingBox_RotateHandle.prefab
  • 回転ハンドルサイズ: 0.016
  • 回転ハンドル コライダーパディング: 0.016 (ハンドルビジュアルよりもグラブ可能なコライダーをわずかに大きくします)

近接通信 (HoloLens 2 スタイルのセットアップ)

手までの距離に基づいて、アニメーションでハンドルを表示および非表示にします。 これには、2 段階のスケーリング アニメーションがあります。

近接性
  • 近接効果アクティブ: 近接ベースのハンドルのアクティブ化を有効にする
  • 中程度の近接性を処理する: 第 1 ステップスケーリングの距離
  • 近接性の処理: 2 番目のステップスケーリングの距離
  • ファー スケール: 手が境界ボックスの相互作用の範囲外にある場合のハンドル アセットの既定のスケール値 (上記の距離は、"中距離の処理" で定義されます)。既定でハンドルを非表示にするには、0 を使用します)
  • 中程度のスケール: 手が境界ボックスの相互作用の範囲内にある場合のハンドル アセットのスケール値 (上記の距離は、"近接近接の処理" によって定義されます)。通常のサイズを表示するには、1 を使用します)
  • 閉じるスケール: 手がグラブ操作の範囲内にある場合のハンドルアセットのスケール値(上記の距離は「近接近接のハンドル」で定義されています)。大きいサイズを表示するには、1.x を使用します)

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

境界ボックスを ManipulationHandler.cs と組み合わせて、遠い相互作用を使用してオブジェクトを移動可能にすることができます。 操作ハンドラーは、1 つの操作と 2 つの操作の両方をサポートします。 手の追跡 を使用して、オブジェクトを間近で操作できます。

操作ハンドラー

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

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

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

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

境界コントロールの移行