ARKit によって追跡される水平面と垂直面を使用して、壁の後ろや実際のオブジェクトの後ろにオブジェクトを隠すにはどうすればよいですか? 現在、部屋を出たときや、オブジェクトが隠れているはずのオブジェクトの前にいるとき、3D で追加されたオブジェクトが壁越しに見えます。では、ARKit から提供されるデータを使用して、オブジェクトが壁越しに表示されずに、より自然な AR エクスペリエンスを提供することは可能ですか?
ベストアンサー1
ここでは 2 つの問題があります。
(そしてあなたは正規表現を使用する!)
ARKit/SceneKit のオクルージョンジオメトリを作成するにはどうすればよいですか?
SceneKitマテリアルのcolorBufferWriteMask
を空の値 ( []
Swift では ) に設定すると、そのマテリアルを使用しているオブジェクトはビューに表示されませんが、レンダリング中に Z バッファに書き込まれるため、他のオブジェクトのレンダリングに影響します。実際には、オブジェクトのような形の「穴」が開き、そこから背景 ( の場合はカメラ フィードARSCNView
) が表示されますが、他の SceneKit オブジェクトが見えなくなる可能性があります。
また、隠蔽されるノードが、隠蔽されるはずの他のノードより先にレンダリングされるようにする必要があります。これはノード階層を使用して行うことができます(親ノードが子ノードより先にレンダリングされるのか、それともその逆なのかはすぐには思い出せませんが、テストするのは簡単です)。階層内のピアであるノードには決定論的な順序はありませんが、renderingOrder
プロパティです。このプロパティのデフォルトは 0 なので、これを -1 に設定すると、すべての前にレンダリングされます。(または、より細かく制御するには、renderingOrder
複数のノードの を値のシーケンスに設定します。)
遮蔽ジオメトリを配置する場所がわかるように壁などを検出するにはどうすればよいでしょうか?
iOS 11.3以降(別名「ARKit 1.5」)では、vertical
平面検出。(vertical
平面アンカーをその位置から離すと、自動的に回転します。そのため、モデルをアンカーに取り付けると、そのローカルの「上」方向は平面に対して垂直になります。) また、iOS 11.3 の新機能として、検出された各平面のより詳細な形状推定値を取得できるようになりました (ARSCN平面ジオメトリ(向きに関係なく)
しかし、水平と垂直があっても、平面の外側の境界は時間とともに変化する推定値にすぎません。つまり、ARKit は壁の一部がどこにあるかをすぐに検出できますが、ユーザーがデバイスを振り回して空間をマッピングするまで、壁の端がどこにあるかはわかりません。また、マッピングされた端が実際の壁の端と正確に揃わないこともあります。
つまり、検出された垂直面を使用して仮想ジオメトリを遮蔽すると、壁の端に完全に隠れていないか、ARKit が実際の壁全体をマッピングしていない場所から見えるため、隠れているはずの仮想オブジェクトが透けて見える場所が見つかる可能性があります。(後者の問題は、ARKit よりも広い範囲を想定することで解決できる可能性があります。)