第2章 ARKit 堤 修一/@shu223
2.5.3 トラッキング状態をリセットする / 検出済みアンカーを削除する
ARKitのトラッキング状態をリセットしたり、検出済みアンカーを削除したりしたい場合、ARSessionのrun(_:options:)メソッドの第2引数optionsに渡すARSession.RunOptionsを利用します。
■resetTracking
すでにrunしている、あるいは以前にrunしたセッションに対してrun(_:options:)を呼んだ場合、デフォルトでは、セッションはトラッキング状態をそのまま引き継ぎます注15)。
ここで、前回と同様のコンフィギュレーションでrun(_:options:)を呼ぶ際にresetTrackingオプションを指定すると、トラッキング状態をリセットして(初期状態にして)開始できます。
session.run(worldConfig, options: [.resetTracking])
なお、前回セッションと違うタイプのコンフィギュレーションを設定してrun(_:options:)を呼ぶ場合は、トラッキング状態は必ずリセットされた上で開始します注16)。
■removeExistingAnchor
すでにrunしている、あるいは以前にrunしたセッションに対してrun(_:options:)を呼んだ場合、デフォルトでは、セッションは検出済みアンカーをそのまま維持します。
すべての検出済みアンカーを削除して平面認識をやりなおす場合は、removeExistingAnchorオプションを指定してrun(_:options:)を呼びます。
sceneView.session.run(configuration, options: [.removeExistingAnchors])
アンカーが削除される際、ARSessionDelegateのsession(_:didRemove:)注17)や、それに付随するARSCNViewDelegateのrenderer(_:didRemove:for:)注18)といったデリゲートメソッドも呼ばれます。
なお、ARSession.RunOptionsはOptionSetに準拠しているため、複数オプションの同時指定ができます。
sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
ARKitがデバイスの向きや位置をトラッキングしたり、現実世界の「面」を検出したりする際、ARKitはカメラから得られる画像から「特徴点」を抽出し、その情報をトラッキングや面の検出に使っています注19)。
現状ではARWorldTrackingConfigurationのplaneDetectionプロパティに指定できる値は.horizontalしかないため、垂直面や平面以外の任意の面は検出してくれません。しかし、特徴点は水平面に限らず検出され、さらに特徴点に対してのヒットテストも行えるので、特徴点が得られた3次元座標上に仮想オブジェクトを設置するといった使い方注20)もできます。
また、実際にARKitを実機で動作させるとわかりますが、水平面の検出まで意外と時間がかかります。前述したとおり、特徴点の抽出は水平面の検出の前段となる処理ですので、水平面が検出されるよりもずっと早い段階で特徴点は検出され始めます。また、水平面よりも簡単に・多く検出されます。そこでこれを利用して、水平面がなかなか検出されない場合にも、特徴点を可視化したり、特徴点の検出状況に応じて何らかの情報を提示することで待ち時間のユーザー体験を改善するという活用方法も考えられます。
つまり、特徴点を活用することで、より柔軟に、広範にARKitを応用することが可能になります。本節では、この特徴点の利用方法を解説します。