本日はMRDLのSurfaceを勉強していきます。
前回まででアプリ起動時に読み込まれる[Startup Scene]を見ています。
今回はこの[Startup Scene]の[SurfacePlacement]オブジェクトを調査していきます。
〇SurfacePlacement
[SurfacePlacement]オブジェクトには[SurfacePlacement]コンポーネントがアタッチされています。
このコンポーネントはSpatialAwarenessによって生成されるSpatialMeshを使用して、生成される各体験のオブジェクトを適切な位置に配置します。
・DefaultOffset
DefaultOffsetは[HandMenu]によって生成される各体験のオブジェクトの配置場所になります。
デフォルト値でxyz=0,-0.1,1.15が設定されています。 これによって各オブジェクトはユーザーの1.15m先、10cm下に生成されます。
また、[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によって生成された各体験のオブジェクトの指の配置が行われません。
FingerSurface fingerSurface = GameObject.FindObjectOfType<FingerSurface>(); float fingerSurfaceRadius = fingerSurface.SurfaceRadius;
[FingerSurface]はSurfaceプロジェクトで提供されているコンポーネントです。
これは読み込まれる各体験のオブジェクトのルートにアタッチされているコンポーネントから継承されています。
例えばEphemeralの場合次のようになっています。
public class Ephemeral : FingerSurface { ... }
このFingerSurfaceが手の検知などを行っているようで[SurfacePlacement]コンポーネントではここからユーザーの手の情報を受け取っといます。
float fingerSurfaceRadius = fingerSurface.SurfaceRadius;
[SurfacePlacement]コンポーネントではさらにユーザーの向いている軸などを受け取り適切なばしょに配置を行っています。
外部の様々なオブジェクトとのやり取りが多いコンポーネントのため次回以降も適時のぞいていくことになりそうです。