BoundsControl は、 以前 BoundingBox で見つかった操作動作の新しいコンポーネントです。 境界コントロールは、セットアップで多数の機能強化と簡略化を行い、新しい機能を追加します。 このコンポーネントは境界ボックスの代わりに使用されます。これは非推奨になります。
BoundsControl.cs スクリプトは、Mixed Reality でオブジェクトを変換するための基本的な機能を提供します。 境界コントロールには、ホログラムを操作できることを示すボックスが表示されます。 ボックスの角と端のハンドルを使用すると、オブジェクトのスケーリング、回転、または翻訳を行えます。 境界コントロールは、ユーザー入力にも反応します。 たとえば、HoloLens 2では、境界コントロールは指の近接性に応答し、オブジェクトからの距離を認識するのに役立つ視覚的フィードバックを提供します。 すべての操作とビジュアルを簡単にカスタマイズできます。
シーンの例
境界コントロールの構成の例は、 BoundsControlExamples シーンにあります。
Inspector プロパティ
ターゲット オブジェクト
このプロパティは、境界コントロール操作によって変換されるオブジェクトを指定します。 オブジェクトが設定されていない場合、既定では owner オブジェクトになります。
アクティブ化の動作
境界コントロール インターフェイスをアクティブ化するには、いくつかのオプションがあります。
- [起動時にアクティブ化]: シーンが開始されると、境界コントロールが表示されます。
- 近接によるアクティブ化: 連結された手がオブジェクトに近い場合、境界コントロールが表示されます。
- ポインターによるアクティブ化: 境界コントロールは、ハンドレイ ポインターの対象になると表示されます。
- 近接とポインターによるアクティブ化: 境界コントロールは、手線ポインターのターゲットであるか、多関節ハンドがオブジェクトに近い場合に表示されます。
- [手動でアクティブ化]: 境界コントロールは自動的には表示されません。 boundsControl.Active プロパティにアクセスすることで、スクリプトを使用して手動でアクティブ化できます。
境界のオーバーライド
境界計算のオブジェクトからボックス コライダーを設定します。
ボックスのパディング
コントロールの範囲を計算するために使用されるコライダー境界にパディングを追加します。 これは相互作用だけでなく、ビジュアルにも影響します。
フラット化軸
コントロールがいずれかの軸でフラット化され、2 次元になり、その軸に沿った操作が禁止されているかどうかを示します。 この機能は、スレートなどの薄いオブジェクトに使用できます。 フラット化軸が [フラット化自動] に設定されている場合、スクリプトは最も小さい範囲の軸をフラット化軸として自動的に選択します。
スムージング
スムージング セクションでは、コントロールのスケーリングと回転のスムージング動作を構成できます。
ビジュアル
境界コントロールの外観は、対応するビジュアル構成のいずれかを変更することで構成できます。 ビジュアル構成は、リンクされたスクリプト可能なオブジェクトまたはインラインスクリプト可能なオブジェクトであり、「 構成オブジェクト」セクションで詳しく説明されています。
構成オブジェクト
コントロールには、スクリプト可能なオブジェクトとして格納し、異なるインスタンスまたはプレハブ間で共有できる一連の構成オブジェクトが付属しています。 構成は、個々のスクリプト可能なアセット ファイルまたはプレハブ内の入れ子になったスクリプト可能な資産として共有およびリンクできます。 さらに構成をインスタンスで直接定義することもできます。外部または入れ子になったスクリプト可能な資産にリンクする必要はありません。
境界コントロール インスペクターは、プロパティ インスペクターにメッセージを表示することで、構成が現在のインスタンスの一部として共有されているかインライン化されるかを示します。 さらに、共有インスタンスは境界コントロール プロパティ ウィンドウ自体で直接編集することはできませんが、代わりに、共有構成に誤って変更を加えないように、リンク先のアセットを直接変更する必要があります。
現在、境界コントロールには、次の機能の構成オブジェクト オプションが用意されています。
Box の構成
ボックス構成は、コライダー サイズとボックスパディングを使用して定義された境界を持つソリッド ボックスをレンダリングする役割を担います。 次のプロパティを設定できます。
- ボックス マテリアル: 相互作用が発生しない場合にレンダリングされたボックスに適用されるマテリアルを定義します。 ボックスは、このマテリアルが設定されている場合にのみレンダリングされます。
- ボックスグラブ素材: ユーザーが近くまたは遠い相互作用を介してつかんでコントロールと対話するときのボックスの材料。
- フラット化軸の表示スケール: いずれかの軸が フラット化されている場合にボックス表示に適用されるスケール。
スケール ハンドルの構成
このプロパティ ドロワーを使用すると、境界コントロールのスケール ハンドルの動作と視覚化を変更できます。
- ハンドルの材料: ハンドルに適用される材料。
- ハンドルつかまれた材料:つかまれたハンドルに適用される材料。
- ハンドル プレハブ: スケール ハンドルの省略可能なプレハブ。 non が設定されている場合、MRTK はキューブを既定として使用します。
- ハンドル サイズ: スケール ハンドルのサイズ。
- コライダーのパディング: ハンドル コライダーに追加するパディング。
- 操作時にテザーを描画する: アクティブな場合は、操作の開始位置から現在の手またはポインターの位置にテザー線を描画します。
- ハンドルはコライダーを無視します。コライダーがここでリンクされると、ハンドルはこのコライダーとの衝突を無視します。
- ハンドル スレート プレハブ: コントロールがフラット化されたときにハンドルに使用するプレハブ。
- スケール ハンドルの表示: ハンドルの可視性を制御します。
- スケール動作: 均一または非均一スケーリングに設定できます。
回転によって構成が処理されます
この構成では、回転ハンドルの動作を定義します。
- ハンドルの材料: ハンドルに適用される材料。
- ハンドルつかまれた材料:つかまれたハンドルに適用される材料。
- ハンドル プレハブ: ハンドルの省略可能なプレハブ。 non が設定されている場合、MRTK は球を既定として使用します。
- ハンドル サイズ: ハンドルのサイズ。
- コライダーのパディング: ハンドル コライダーに追加するパディング。
- 操作時にテザーを描画する: アクティブな場合は、操作の開始位置から現在の手またはポインターの位置にテザー線を描画します。
- ハンドルはコライダーを無視します。コライダーがここでリンクされると、ハンドルはこのコライダーとの衝突を無視します。
- ハンドル プレハブ コライダーの種類: 作成されたハンドルで使用するコライダーの種類。
- [X のハンドルを表示]: X 軸のハンドルの可視性を制御します。
- Y のハンドルの表示: Y 軸のハンドルの可視性を制御します。
- [Z のハンドルを表示]: Z 軸のハンドルの可視性を制御します。
変換によって構成が処理されます
境界コントロールの変換ハンドルの有効化と構成を許可します。 翻訳ハンドルは既定で無効になっていることに注意してください。
- ハンドルの材料: ハンドルに適用される材料。
- ハンドルつかまれた材料:つかまれたハンドルに適用される材料。
- ハンドル プレハブ: ハンドルの省略可能なプレハブ。 non が設定されている場合、MRTK は球を既定として使用します。
- ハンドル サイズ: ハンドルのサイズ。
- コライダーのパディング: ハンドル コライダーに追加するパディング。
- 操作時にテザーを描画する: アクティブな場合は、操作の開始位置から現在の手またはポインターの位置にテザー線を描画します。
- ハンドルはコライダーを無視します。コライダーがここでリンクされると、ハンドルはこのコライダーとの衝突を無視します。
- ハンドル プレハブ コライダーの種類: 作成されたハンドルで使用するコライダーの種類。
- [X のハンドルを表示]: X 軸のハンドルの可視性を制御します。
- Y のハンドルの表示: Y 軸のハンドルの可視性を制御します。
- [Z のハンドルを表示]: Z 軸のハンドルの可視性を制御します。
リンク構成 (ワイヤフレーム)
リンク構成により、境界コントロールのワイヤフレーム機能が有効になります。 次のプロパティを構成できます。
- ワイヤフレーム マテリアル: ワイヤフレーム メッシュに適用されるマテリアル。
- ワイヤフレームエッジ半径: ワイヤフレームの厚さ。
- ワイヤフレームの形状: ワイヤーフレームの形状は、3 次または円柱形のいずれかです。
- ワイヤフレームの表示: ワイヤフレームの可視性を制御します。
近接効果の構成
手までの距離に基づいて、アニメーションでハンドルを表示および非表示にします。 これには、2 段階のスケーリング アニメーションがあります。 既定値は、スタイルの動作HoloLens 2に設定されます。
- 近接効果アクティブ: 近接ベースのハンドルのアクティブ化を有効にする
- オブジェクトの中距離: 第 1 ステップスケーリングの距離
- オブジェクト近接: 2 番目のステップスケーリングの距離
- ファー スケール: 手が境界コントロールの相互作用の範囲外にある場合のハンドル アセットの既定のスケール値 (上記の距離は 、"中近接の処理" によって定義されます。既定でハンドルを非表示にするには、0 を使用します)
- 中程度のスケール: 手が境界コントロールの相互作用の範囲内にある場合のハンドル アセットのスケール値 (上記の距離は、"近接近接の処理" によって定義されます)。通常のサイズを表示するには、1 を使用します)
- 閉じるスケール: 手がグラブ操作の範囲内にある場合のハンドルアセットのスケール値(上記の距離は「近接近接のハンドル」で定義されています)。大きいサイズを表示するには、1.x を使用します)
- 遠方拡大率: 手が中から遠方に移動したときに、近接スケールされたオブジェクトスケールを評価します。
- 中程度の拡大率: 手が中程度から近接度に移動したときに、近接スケールされたオブジェクトスケールを評価します。
- 拡大率を近づける: 近接度が近いオブジェクトの中心に手が移動したときに、近接スケールされたオブジェクトスケールを評価します。
制約システム
境界コントロールでは、 制約マネージャー を使用して、境界コントロール ハンドルを使用しながら、移動、回転、またはスケーリングの動作を制限または変更できます。
プロパティ インスペクターには、同じゲーム オブジェクトにアタッチされているすべての使用可能な制約マネージャーがドロップダウンに表示され、選択した制約マネージャーをスクロールして強調表示するオプションが表示されます。
イベント
境界コントロールは、次のイベントを提供します。 この例では、これらのイベントを使用してオーディオ フィードバックを再生します。
- 回転開始: 回転開始時に発生します。
- 回転停止: 回転が停止したときに発生します。
- スケール開始: スケーリングの開始時に起動します。
- スケール停止: スケーリングが停止すると発生します。
- 翻訳開始: 翻訳の開始時に起動します。
- 翻訳が停止しました: 翻訳が停止すると発生します。
Elastics (試験段階)
エラスティックは、境界コントロールを使用してオブジェクトを操作するときに使用できます。
エラスティック システムはまだ試験的な状態であることに注意してください。 エラスティックを有効にするには、既存の elastics Manager コンポーネントをリンクするか、[ Add Elastics Manager ] ボタンを使用して新しいエラスティック マネージャーを作成してリンクします。
スタイルを処理する
既定では、 BoundsControl.cs スクリプトを割り当てると、HoloLens 第 1 世代スタイルのハンドルが表示されます。 HoloLens 2スタイル ハンドルを使用するには、適切なハンドル プレハブとマテリアルを割り当てる必要があります。
次に、HoloLens 2 スタイル境界コントロール ハンドルのプレハブ、マテリアル、スケーリング値を示します。 この例は、 BoundsControlExamples シーンにあります。
ハンドル (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 (ハンドルビジュアルよりもグラブ可能なコライダーをわずかに大きくします)
オブジェクト マニピュレーターを使用した変換の変更
境界コントロールを ObjectManipulator.cs と組み合わせて使用すると、ハンドルを使用せずに特定の種類の操作 (オブジェクトの移動など) を可能にすることができます。 操作ハンドラーは、1 つの操作と 2 つの操作の両方をサポートします。
手の追跡 を使用して、オブジェクトを間近で操作できます。
境界コントロールのエッジが、ObjectManipulatorの遠距離の操作を使用して移動するときに同じように動作するには、上のスクリーンショットに示すように、[操作の開始時] / [操作終了] のイベントをそれぞれBoundsControl.HighlightWires / BoundsControl.UnhighlightWiresに接続することをお勧めします。
インスペクターを使用して境界コントロールを追加して構成する方法Unity
- Box コライダーをオブジェクトに追加する
- オブジェクト
BoundsControlスクリプトを割り当てる - 'Activation' メソッドなどのオプションを構成する (下記 の「インスペクターのプロパティ 」セクションを参照)
- (省略可能)HoloLens 2 スタイル境界コントロールにプレハブとマテリアルを割り当てる (後述の「スタイルを処理する」セクションを参照)
注:
複数の子コンポーネントを持つオブジェクト内の特定のオブジェクトとコライダーを割り当てるには、インスペクターの [ ターゲット オブジェクト] フィールドと [ 境界のオーバーライド ] フィールドを使用します。
コードで境界コントロールを追加して構成する方法
キューブ GameObject をインスタンス化する
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);AddComponent<>() を使用して、コライダーを持つオブジェクトにスクリプト
BoundsControl割り当てます。private BoundsControl boundsControl; boundsControl = cube.AddComponent<BoundsControl>();コントロールで直接、またはスクリプト可能な構成のいずれかを使用してオプションを構成します (下記 の「インスペクターのプロパティ と構成」セクション を 参照してください)
// 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;(省略可能)HoloLens 2 スタイル境界コントロールにプレハブとマテリアルを割り当てます。 マテリアルとプレハブを動的に読み込む必要があるため、これは引き続きインスペクターを介した割り当てが必要です。
注:
シェーダーの順列が実行時に見つからない可能性があるため、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 ツール パッケージの一部である移行ウィンドウを使用して、新しい境界コントロールにアップグレードできます。
境界ボックスの個々のインスタンスをアップグレードするには、コンポーネントのプロパティインスペクター内に移行オプションもあります。