ARKit: 検出平面を頼りに世界座標系上にNodeを配置する

p0dee
May 22, 2021

ARKitを始めてみた。ARKitで検出した平面を鍵に、AR空間にオブジェクトを固定配置しようとして、とっさに以下のような実装を考えた。

ARSCNViewDelegate.rendere(_:didAdd:for:)では、平面検出したsceneView.sessionが、その平面情報をARPlaneAnchorとしてsceneViewに追加、最終的にanchorの位置情報に従ってSCNNodeが追加したことを伝えている。このnodeを親ノードとして、表示したい子ノードを追加すれば良さそうだが、、

しかしこの親nodeは、カメラを動かすごとに更新される平面の検出結果に応じて、移動したり回転したりするのだった。つまり、AR空間に固定したと思った子ノードは、親nodeの移動や回転に追従してしまっていた。

以下のように、平面検出により追加されたnodeの座標を世界座標系に変換し、その座標にもとづきsceneView.rootNode直下に追加することで、期待する結果はひとまず得られた。

ちゃんと調べればより適切な方法がありそう。とはいえ、ノードの入れ子構造や座標系の変換が、UIView的で親近感があった。

--

--