第2章 ARKit 堤 修一/@shu223


 特に、3D空間の描画は基本的にSceneKitが担当します注7)。SceneKitには、描画する3次元のシーン(SCNScene)を、UIKitベースのUI階層内で共存して描画するためのSCNViewというUIViewを継承したクラスがあり、

class SCNView : UIView, SCNSceneRenderer, SCNTechniqueSupport

そのSCNViewを継承してARKit関連の機能を持たせたものが、ARSCNViewクラスです。

class ARSCNView : SCNView

 ARSCNViewは、上述したARSessionオブジェクトをプロパティで保持しており、また「2.7 AR空間におけるインタラクションを実現する」で後述するヒットテストの機能も持っています。すなわちARSCNViewは、「ARKit関連の機能を取り扱いつつ、UIKitベースのUI階層内で3次元シーンを描画するためのクラス」といえます。

 ちなみに、先ほど書いたコードにはARSessionオブジェクトを生成する処理はありませんでした。ARSCNViewオブジェクトを生成した時点で、そのsessionプロパティにはすでにARSessionオブジェクトが生成されて入っているためです。そのおかげで、ARSCNViewオブジェクトを用意すればあとはセッションをrunするだけという手軽さでARが実現できるようになっています。

sceneView.session.run(configuration)

 前節では最小実装でARKitを体験しました。次のステップでは現実世界の「水平面」を検出してみましょう。

 現実世界における水平面とは、たとえば地面や床、テーブル等のことです。ARKitは、カメラからの入力という2次元の画像から、水平な平面を「3次元的に」検出し、それをデバイスの動きに追従して認識し続けます。

 平面検出の内部処理は非公開ですが、カメラから得られる毎フレームの画像から「特徴点」を取得しており、それらをシーン解析に用いていることは公式ドキュメントでも明記注8)されていて、WWDCのセッション 注9) で「より高品質なトラッキング結果を得るためには、テクスチャのある環境で実行しましょう」と明言されてもいたので、特徴点を利用した次のような処理を行っていると考えられます。

1. 特徴点を検出する注10)

2. 時間的に連続した2フレーム間で特徴点のマッチングを行い対応点を得る

3. 複数の対応点の動きが平面上の動きとみなせる場合に平面として検出する

 この機能をゼロから自分で実装すると大変ですが、ARKitだととても簡単です。基本的にはコンフィギュレーションにひとつ設定を追加するだけです。具体的に見ていきましょう。

サンプルコード:02_PlaneDetection

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川 克己,所 友太,永野 哲久,
  • 製本版,電子版
  • 続きを読む