Version: 2018.4
言語: 日本語
SpatialMapping コンポーネントの一般設定
Spatial Mapping Renderer

Spatial Mapping Collider

Spatial Mapping Collider コンポーネントによってホログラフィックコンテンツと現実のサーフェスの相互作用が可能になります。このコンポーネントは、サーフェスの情報を持つゲームオブジェクトの作成、更新、破棄を処理します。

コンポーネントは定期的にシステムへクエリを送り、現実世界で発生した変化を把握します。システムがサーフェスの変化を通知すると、Spatial Mapping Collider コンポーネントは、変化のあったサーフェスが Unity によってベイクされる順序付けをします。サーフェスがベイクされるたびに、Unity によって新しいゲームオブジェクトが生成されます。Mesh FilterMesh Collider コンポーネントも含みます。Mesh Collider を持つサーフェスは、Unity の他のメッシュと同様にレイキャストによってヒットすることが可能です。詳しくは、カメラからのレイ を参照してください。

ノート: このコンポーネントはサーフェスゲームオブジェクトの Mesh Collider コンポーネントのみを更新します。Mesh Renderer は更新しません。

ノート: Spatial Mapping Collider の更新は Spatial Mapping Mesh Renderer の更新よりも遅延が軽少です。つまり、コライダーの更新はレンダラーよりも速いということです。

Unity エディターの Spatial Mapping Collider コンポーネント
Unity エディターの Spatial Mapping Collider コンポーネント

Collider Settings

項目 説明
Enable Collisions このボックスをチェックすると、サーフェスの Mesh Colliders が有効になります。つまり、ホログラフィックコンテンツはサーフェスに衝突可能になります。
Mesh Layer すべてのサーフェスの Mesh Collider の Layer プロパティーを設定します。レイキャストを使用するためにはレイヤーを設定する必要があることに注意してください。レイキャストを実行するときは、レイの交差をどのレイヤーに対してテストするのかを指定する必要があります。詳細は、Camera Raycast のドキュメントを参照してください。また、後述の スクリプトサンプル、SpatialSurface レイキャスト を参照してください。

デフォルト (Default) では、Unity はすべてのゲームオブジェクトをデフォルトレイヤーに割り当てますが、ゲームオブジェクトを特定のレイヤーに割り当てることが効果的な方法です。Spatial Mapping サーフェス専用の新しいレイヤーを作成し、このレイヤーをMesh Layer プロパティーに割り当てることを奨励します。
Physic Material 各サーフェスゲームオブジェクトの Mesh Collider に割り当てる Physic Material を指定します。デフォルトは None (Physic Material) です。

Physic Material は他の Rigidbody コンポーネントがどのようにサーフェスゲームオブジェクトと相互作用するかを指定します。例えば、サーフェスで氷をシミュレートするときは、その上を動くオブジェクトにより小さな摩擦力を適用します。

Spatial Mapping Collider コンポーネントは、その Physic Material を該当するサーフェスゲームオブジェクトのすべての Mesh Colliders に適用します。詳しくは 物理特性マテリアル を参照してください。

General Settings

SpatialMapping コンポーネントの一般設定

以下は Spatial Mapping RendererSpatial Mapping Collider コンポーネントで共通のプロパティーです。

項目 説明
Surface Parent Surface Parent となるゲームオブジェクトを選択します。Spatial Mapping コンポーネントが作成するサーフェスの情報を持つゲームオブジェクトはこの Surface Parent オブジェクトを継承します。 None (Game Object) のままにすると、自動的に Surface Parent ゲームオブジェクトが作成されます。
Freeze Updates これを有効にすると、コンポーネントがシステムに対しサーフェスの変更をクエリすることを停止します。ノート: 各 Spatial Mapping コンポーネントは定期的に現実世界のサーフェスの変化のデータをクエリします。サーフェスに関するクエリとベイクはメモリ、パフォーマンス、バッテリーに対し負荷となります。ほぼ静的であることが予測できる環境では、ユーザーが周囲の環境を見回せるくらいの間、サーフェスゲームオブジェクトを更新しないでおくことをお勧めします。シミュレーションの環境がほとんど静的で変更がない場合 (例えば、ボードゲーム)、アプリケーションの開始時にサーフェスのデータをできる限りスキャンしておき、Freeze Updates プロパティーを 有効 に設定し、更新を防ぎます。こうすると、パフォーマンスが若干よくなり、バッテリーの消費が抑えられます。
Time Between Updates 現実世界のサーフェス変化に関するクエリの間隔を 1/10 秒単位で指定します (例えば、3.7 や 4.6 など)。デフォルトは 2.5 秒です。間隔が短いほど、メモリ、パフォーマンス、バッテリーに対する負荷が高くなります。
Removal Update Count サーフェスゲームオブジェクトがシステムによって削除される前に発生する更新の数を指定します。ここでは、更新はフレームと同じ意味です。デフォルトは 更新数は 10 回です。ノート: Removal Update Count のカウントダウンは、サーフェスゲームオブジェクトが SurfaceObserver のバウンディングボリュームに存在しなくなったこと (つまり、サーフェスゲームオブジェクトが決められた領域から消えたこと) を、Spatial Mapping がコンポーネントに通知すると開始されます。この設定によって、Spatial Mapping がサーフェスのゲームオブジェクトが領域から消えた後、かつ、削除する前に発生する更新の数を指定できます。
Level of Detail コンポーネントが生成するメッシュの品質 (LowMediumHigh)。 デフォルトは Medium です。品質が高くなるとコライダーとレンダリングはより正確になり、品質が低くなるとパフォーマンスとパワーにかかる負担が軽減されます。Level Of Detail の 3 つのモードの例は、以下の画像を参照してください。
Bounding Volume Type アプリケーションが Spatial Mapping のデータを取得するコンポーネントのバウンディングボリューム領域の形状。 Sphere または Axis Aligned Box。デフォルトは Axis Aligned Boxノート: バウンディングボリュームはシステムが現実世界のサーフェスの変化を報告し、Spatial Mapping メッシュの拡張を制限するための定義された領域です。
Size In Meters コンポーネントが使用するバウンディングボリュームのサイズ (単位はメートル)。Sphere は半径で設定します。デフォルトの半径は 2 メートルです。Axis Aligned Box は範囲で設定します。デフォルトは Vector3 (4,4,4)。ノート: オブザーバーのバウンディングボリュームは、Spatial Mapping が現実世界のサーフェスの変化を報告する範囲です。

Level of Detail (LOD)

Spatial Mapping コンポーネントでは、各コンポーネントが生成する空間メッシュの LOD を、以下の画像に表示された 3 種類 Low、Medium、High のいずれかに指定できます。

Spatial Mapping メッシュの 3 つの LOD モード
Spatial Mapping メッシュの 3 つの LOD モード

可能な場合は、Spatial Mapping Colliders の Level of Detail を Low に設定します。これにより、衝突計算のパフォーマンスが向上し、パワーの消費が軽減されます。ただし、Level of DetailLow に設定すると、アプリケーションの視覚的効果に悪影響をもたらす可能性があります。

Spatial Mapping Collider の使用

サーフェスゲームオブジェクト

シーンで、Spatial Mapping Collider をゲームオブジェクトに加えると、 ゲームオブジェクトはランタイムにもう 1 組のサーフェスゲームオブジェクトを作成します。これは、親のサーフェスゲームオブジェクトの親にあたるシーンに表示されます。

Spatial Mapping Collider によって作成されたサーフェスゲームオブジェクトには、以下のコンポーネントが含まれます。

Spatial Mapping Collider によって作成されたサーフェスゲームオブジェクトのコンポーネント
Spatial Mapping Collider によって作成されたサーフェスゲームオブジェクトのコンポーネント

シーンに複数の Spatial Mapping Collider コンポーネントを追加すると、各コンポーネントはそれぞれサーフェスゲームオブジェクトの組を生成します。例えば、シーン内の 2 つのゲームオブジェクトに Spatial Mapping Collider が含まれている場合、シーンにはランタイムに各コンポーネントによって生成された 2 組のサーフェスゲームオブジェクトが含まれます。これは、最適化においては注意する必要があります。注意: Spatial Mapping システムによって最初に生成されたとき、すべての サーフェスゲームオブジェクトDefault レイヤー に割り当てられています。ただし、レイキャスティングは実行に高価な計算が必要であるため、ゲームオブジェクトを特定のレイヤーに割り当てることが有効です。レイヤーを使用することで、どのゲームオブジェクトに対してレイキャスト計算を実行しているかをフィルタリングし、パフォーマンスを最適化することができます。デフォルト レイヤーに複雑なメッシュが多数ない場合は、衝突のレイキャストテストを実行してもパフォーマンスが大幅に低下することはありません。ただし、衝突を実行する際のレイキャストテストの複雑さを軽減するために、ゲームオブジェクトをレイヤーに整理するのが最善です。特定の Spatial Mapping Collider コンポーネントによって生成されたすべてのサーフェスゲームオブジェクトに割り当てられたレイヤーを変更するには、Collider Settings > Mesh Layer プロパティーを変更します。

サンプルスクリプト: タップジェスチャーイベントによる SpatialSurface レイキャスト

以下の例は、SpatialSurface レイヤーのゲームオブジェクトに対しレイキャストする方法と、GestureRecognizer を使ってタップジェスチャーイベントの検出時にレイキャストを始める方法を紹介しています。


using UnityEngine;
using System.Collections; 

//Gesture Recognizer に必須
using UnityEngine.XR.WSA.Input;


public class CustomLayerCollision : MonoBehaviour
{

    //ジェスチャーイベントを取得するためにこれを使用します

    private GestureRecognizer GR_recognizer;

    void Start()
    {
        //GestureRecognizer を初期化します

        GR_recognizer = new GestureRecognizer();

        //ジェスチャー取得を始めます

        GR_recognizer.StartCapturingGestures();

        //GestureRecognizer にどのイベントをリッスンするかを指示します

        GR_recognizer.SetRecognizableGestures(GestureSettings.Tap);

        //DetectCollisions メソッドに Tapped イベントをサブスクライブさせます

        //これにより GestureRecognizer がタップイベントを検出するたびに、このメソッドを呼び出します

        GR_recognizer.Tapped += DetectCollisions;

        //ユーザーがタップジェスチャーを始めると、DetectCollisions メソッドが   

        //Tapped イベントデリゲートによって呼び出され Raycasting を使って衝突テストを行います

        //詳しくは [GestureRecognizer API reference](../ScriptReference/XR.WSA.Input.GestureRecognizer.html) を参照してください。
    }
    //タップイベントでレイキャストを発射するメソッド
    public void DetectCollisions(TappedEventArgs tapEvent)
    {
        // Spatial Surface かUI レイヤーのすべてのゲームオブジェクトに対して
        // レイキャストします

        int layerMask = 1 << LayerMask.NameToLayer("SpatialSurface");

        //ユーザーの頭の position と forward 方向を使って Ray を構築します。
        Ray GazeRay = new Ray(tapEvent.headPose.position, tapEvent.headPose.forward);

        //Gaze から構築した Ray を使ってレイキャストし、衝突を行列 hits に保存します 

        RaycastHit[] hits = Physics.RaycastAll(GazeRay, float.MaxValue, layerMask);

        if (hits.Length > 0)
        {
            foreach (RaycastHit hit in hits)
            {
                Debug.Log(string.Format("Hit Object **\"**{0}**\"** at position **\"**{1}**\"**", hit.collider.gameObject, hit.point));
            }
        }
        else
        {
            Debug.Log("Nothing was hit.");
        }
    }
}

詳細は、ドキュメントの レイヤーカメラからのレイ を参照してください。

  • 2018–05–01 編集レビュー を行ってパブリッシュされたページ

  • Hololens の空間マッピングは 2017.3 に更新

SpatialMapping コンポーネントの一般設定
Spatial Mapping Renderer