夜風のMixedReality

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

HoloLensで落とし穴を作る

本日はHoloLensの表現調査枠です。

HoloLensではSpatialAwareness(空間認識)によってユーザーの周囲の物理情報を認識しMeshを貼ることができます。

今回はこのMeshに穴をあけて落とし穴を作成します。(この落とし穴はHoloLensのアプリ内のデジタルなオブジェクトだけが落ちていきます。現実のボールや人などは落ちません。)

〇穴をあける方法

穴をあける方法として次のようなものを考えました。

①SpatialMeshを部分排除する

これはまさしく穴をあけるという作業になります。SpatialAwarenessnによって生成されるMeshをくりぬき穴をあけ、Meshによってオクルージョン(隠されて)されていたオブジェクトが穴を通して見れるようにするという考えです。

SpatialMeshはランダムで生成され、場所によってはフィル(穴)が発生することもあります。 この方法ではきれいな切り抜きを行うことは難しそうです。

②Shaderによる描画順で穴が開いているように見せる

こちらは前述の方法に比べSpatialMesh自体を操作することはありません。 Shaderには描画順の設定があります。通常この設定値が同じ場合遠い順にオブジェクトが描画され、見た目上は私たちが現実世界で見ているように遠くにあるものは近くにあるものに遮られます。

この描画順は開発者側が変えることができ、例えば文字などのUIはオブジェクトなどで隠れることがないようにするなどの設定が行えます。

これを使用してあるオブジェクトA越しからはオブジェクトBを見ることができるが、それ以外の場所からはオブジェクトBを描画しないという表現が行えます。

これをステンシルと呼びます。

今回はこちらの方法で落とし穴を作成します。

〇環境

・Windows10PC

・Unity2019.4.18f1(LTS)

・MixedRealityToolkit 2.5.3

〇落とし穴の作成

①MRTKが導入されているプロジェクトで新規でマテリアルを作成します。

②作成したマテリアルに[Pitfalls]という名前を付けます。

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

③[Pitfalls]のShaderを[MixedReality Standard Shader]に変更します。

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

④scene上にPlaneを作成し[Pitfalls]をアタッチします。

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

⑤Quadを4枚作成しPlaneがそこになるように壁として配置します。

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

これが落とし穴の形になります。 このままでは前景が見えてしまっています。 またSpatialMeshが生成された場合埋もれてしまいます。

ここからShaderのステンシルを使用します。

⑥Planeを複製してY軸にずらし穴の蓋として配置します。

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

⑦複製したPlaneの名前を[Hole]に設定し、[Pitfalls]を複製したマテリアル[Hole]をアタッチします。

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

⑧[Pitfalls]のinspectorウィンドウから次の様に設定を行います。

・[Enable Stencil Testing]にチェックを入れ有効化します。

・[Stencil Reference]の値を1に設定します。

・[Stencil Comparison]を[Equal]にします。

・[Stencil Operation]の値を[Keep]に設定します。

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

この設定を行うことでシーン上でPlaneの描画が行われなくなります。

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

それぞれの設定に関して軽く解説します。

[Stencil Reference(ステンシル比較)]の[Equal]はピクセルのレファレンス値がバッファの値と等しい場合のみレンダリングします。

これによって描画が行われなくなりました。

[Stencil Operation]の値を[Keep]に設定することでバッファの値が保持されます。(変化しない)

docs.unity3d.com

⑨[Hole]のマテリアルを選択しinspectorウィンドウから次の様に設定を行います。

・[Enable Stencil Testing]にチェックを入れ有効化します。

・[Stencil Reference]の値を1に設定します。

・[Stencil Comparison]を[Always]にします。

・[Stencil Operation]の値を[Replace]に設定します。

・[RenderQueue Override]の値を1999に設定します。 

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

⑩[Hole]のマテリアルをさらに編集します。

・[Rendering Mode]を[Fade]に設定します。

・[Albedo]からα値を下げます。

これによってオブジェクトが透過を持つようになりました。

[Hole]オブジェクト越しにのみ[Plane]が表示されるようになりました。

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

⑪[Quad]に[Pitfalls]をアタッチします。

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

これで次の様に一方のみから見ることができる穴が完成しました。

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

これをSpatialMesh上に配置します。

通常SpatialMeshで穴が覆い隠されてしまうので、今回は以前取り組んだように最初床を認識して落とし穴を配置、その後SpatialMeshを削除するようにしました。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇実機で確認

落とし穴が完成しました。このままではいかにもゲームなどの落とし穴という感じで現実とマッチしていないような印象を受けましたので今回MRDL(MixedRealityDesignLab)で提供されているSurfaceのマテリアルを使用してマグマを再現しました。

youtu.be