夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MRDL Surfaceを学ぶ SurfacePlacementオブジェクト

本日はMRDLのSurfaceを勉強していきます。

前回まででアプリ起動時に読み込まれる[Startup Scene]を見ています。

今回はこの[Startup Scene]の[SurfacePlacement]オブジェクトを調査していきます。

〇SurfacePlacement

[SurfacePlacement]オブジェクトには[SurfacePlacement]コンポーネントがアタッチされています。

f:id:Holomoto-Sumire:20210318084103j:plain

このコンポーネントはSpatialAwarenessによって生成されるSpatialMeshを使用して、生成される各体験のオブジェクトを適切な位置に配置します。

・DefaultOffset

f:id:Holomoto-Sumire:20210318084728j:plain

DefaultOffsetは[HandMenu]によって生成される各体験のオブジェクトの配置場所になります。

デフォルト値でxyz=0,-0.1,1.15が設定されています。 これによって各オブジェクトはユーザーの1.15m先、10cm下に生成されます。

f:id:Holomoto-Sumire:20210318085412j:plain

また、[SurfacePlacement]のもう一つの働きとして生成される各オブジェクトに対応する指のオブジェクトを配置するというものがあります。

   // Find our finger surface
            FingerSurface fingerSurface = GameObject.FindObjectOfType<FingerSurface>();        
            float fingerSurfaceRadius = fingerSurface.SurfaceRadius;

            // Use our camera to place the surface
           ...
            // Only rotate on y axis
            ...

            Vector3 targetSurfacePosition = placementTransform.TransformPoint(defaultOffset);

            if (fingerSurface == null)
            {
                Debug.LogError("No surface found in surface placement.");
                return;
            }

SurfacePlacementオブジェクトが存在しない場合HandMenuによって生成された各体験のオブジェクトの指の配置が行われません。

f:id:Holomoto-Sumire:20210318085951j:plain

 FingerSurface fingerSurface = GameObject.FindObjectOfType<FingerSurface>();        
            float fingerSurfaceRadius = fingerSurface.SurfaceRadius;

[FingerSurface]はSurfaceプロジェクトで提供されているコンポーネントです。

これは読み込まれる各体験のオブジェクトのルートにアタッチされているコンポーネントから継承されています。

例えばEphemeralの場合次のようになっています。

public class Ephemeral : FingerSurface
{
  ...
}

このFingerSurfaceが手の検知などを行っているようで[SurfacePlacement]コンポーネントではここからユーザーの手の情報を受け取っといます。

float fingerSurfaceRadius = fingerSurface.SurfaceRadius;

[SurfacePlacement]コンポーネントではさらにユーザーの向いている軸などを受け取り適切なばしょに配置を行っています。

外部の様々なオブジェクトとのやり取りが多いコンポーネントのため次回以降も適時のぞいていくことになりそうです。