第2章 ARKit 堤 修一/@shu223
2.3.1 水平面を検出するためのコンフィギュレーション
床・テーブル等の、現実世界にある「水平な平面」を検出するには、ARWorldTrackingConfigurationクラスのplaneDetectionプロパティに.horizontalをセットします。
worldConfig.planeDetection = .horizontal
このコンフィギュレーションをrun(_:)メソッドの引数に渡してセッションを開始します。
session.run(worldConfig)
planeDetectionプロパティはARWorldTrackingConfiguration.PlaneDetection型(OptionSetに準拠)です。平面検出はデフォルトでは無効になっているので、明示的にこのプロパティに値を指定しないと平面検出は行われません。
なお、iOS 11.0時点ではARWorldTrackingConfiguration.PlaneDetection型のオプションとしてはhorizontalのみが定義されています。垂直平面を認識するためのオプション等はまだ提供されていません。
2.3.2 平面検出に関するイベントをフックする - ARSessionDelegate
ARWorldTrackingConfigurationのplaneDetectionに値をセットしセッションを開始すると、そのセッションが有効な間はARKitはその平面を検出し続け、更新し続けます。
ここで、ARSessionDelegateプロトコルへの準拠を宣言しておき、
class ViewController: UIViewController, ARSessionDelegate
ARSessionオブジェクトのdelegateプロパティに値をセットしておくことで、
sceneView.session.delegate = self
平面検出に関する次のタイミングで、ARSessionDelegateの各デリゲートメソッドが呼ばれるようになります(ここで登場する「アンカー」については次項で解説します)。
■平面が新たに検出された(1つまたは複数のアンカーがセッションに追加された)
func session(_ session: ARSession, didAdd anchors: [ARAnchor])
■検出済みの平面が更新された(1つまたは複数のアンカーが更新された)
func session(_ session: ARSession, didUpdate anchors: [ARAnchor])
■検出済みの平面が削除された(1つまたは複数のアンカーがセッションから削除された)
func session(_ session: ARSession, didRemove anchors: [ARAnchor])
■ARAnchor
ARSessionDelegateの各メソッドの引数にあるARAnchorは、ARシーンの3D空間内に何らかのオブジェクトを設置するための位置・向きを表すクラスです。「アンカー(anchor)」は日本語で「錨(いかり)」のことですが、まさに3D空間に物体を固定する錨としての役割を担います。