Apple Engine

Apple, iPhone, iOS, その周辺のことについて

SceneKit の SCNNode のレンダリングオーダーでどこでもドア的表現をする

そう言ってみれば説明していなかったなとということで、SCNNode の Rendering Order について書いておこうと思う。

マテリアルの Writes depth や Reads depth は深度情報の重なりの順序を無視し前面や背面にジオメトリ表示するが、
こちらはノードのレンダーされる順番が変更される。
初期値は 0 で、数値が大きいものほど後にレンダリングされる。

Rendering Order は Photoshop や Illustrator のレイヤー、PowerPoint や Keynote の重ね順の様なもので、
例えば、AR の表現でよくあるどこでもドアの様な外からは見えないが、扉の様なものをくぐると別世界に行ける的なことができる。

  f:id:x67x6fx74x6f:20171128172559g:plain

 

 

どこでもドア試してみる

今回は、内側の壁とそれを隠す外側の壁、中にキャラを置いている。

 

f:id:x67x6fx74x6f:20171128172654p:plain

 

外側の壁が邪魔なので、外側の壁を選択し Material Inspector( Command + Option + 5)で Transparency を 0.001 に変更して限りなく透明にする。 (完全に透明にするとレンダリングの影響を受けなくなるため)

 

f:id:x67x6fx74x6f:20171128172822p:plain

 

すけすけになってしまうため、中で表示するノードを選択し Node Inspector( Command + Option + 3)の Rendering Order を 1 にする。

 

f:id:x67x6fx74x6f:20171128172857p:plain

 

ノードの選択解除と Scene Editor のグリッド表示をオフ(Editor > Display > Hide Grid)にするとわかりやすい。
(Scene Editor のバグで Show Grid が変わらず Hide Grid と表示されない場合あり)

 

f:id:x67x6fx74x6f:20171128172922p:plain

 

内側の壁とキャラクタが、外側のジオメトリを含んだノードのレンダリング後に シーンへレンダリングされるためこの様な形となる。

 

ARKit で平面認識をする必要がなければ、Scene Editor で作成したものをそのまま使うことができるし、 ドア的なジオメトリを置いてアニメーションさせても良いだろう。

 

注意点

ジオメトリを透明にしているだけで、完全にものがないわけではない。
外側の壁である透明な場所にものを置きたいなどの場合は、素直に Metal を使ってマルチパスレンダリングからジオメトリを消すべし。

 

サンプルコード

github.com