前回からARKitを利用するプログラムに取り組んでいます。とりあえず前回は、自分のiPadでARKitが動作するかどうかを試すために、簡単なテストプログラム的なものを動かしてみました。そこでは、まずARKitを通してiPad内蔵カメラにアクセスし、現実世界の映像を画面に表示しました。その後、文字列から作った3Dオブジェクトを現実世界の映像に重ねて表示してみました。これで、ひとまず現実世界と非現実のコンピューターグラフィックスを合成することができました。
しかし、前回示した例では、現実世界のどこに何があるかという、人間なら当然認識している情報とはまったく関係なく、プログラム起動時のカメラの正面付近に3Dオブジェクトを配置していました。もちろん、そのオブジェクトは、あたかも現実世界に固定されたかのように振舞います。その後でカメラを動かしても、オブジェクトは元の場所に留まっていました。大きくカメラを動かせば、カメラの視界から消え、また元の方向にカメラを向けると、再び表示されるといった具合です。
しかし前回のような表示では、変な言い方になりますが、非現実的な3Dオブジェクトのリアリティが今ひとつという感じでした。オブジェクトが現実世界とは関係ない位置に浮いていたからです。例えば室内では床の上に、外では地面に3Dオブジェクトが置かれているように配置できれば、現実と非現実が融合した感覚が味わえるはずです。拡張現実というのは、そもそもそういうものですし、もちろんARKitにもそのための機能が備わっています。
そうした表示を実現するには、まず現実世界がどのようになっているのか、認識する必要があります。もう少し具体的に言えば、床や地面、あるいは壁がどこにあって、その平面の座標はどうなっているかを知らなければなりません。それらが分かれば、その座標に合わせて3Dオブジェクトを配置することができます。
今回は、そのような現実世界の認識の第1歩として、カメラで撮影している映像の中にある水平面を認識する機能を試してみることにしましょう。
ARKitのデバッグ用表示をオンにして認識機能の動作を確認
前回に示した最初のプログラムは、ARKitに含まれるシーンビュー(ARSCNView)を画面に表示するだけのものでした。見た目は、単にカメラの映像を画面に垂れ流しているだけのようにしか思えないものでした。実はその際にもARKit内部では、現実世界を認識しようとする機能が動いていたのです。そのような動作の一端は、ARKitのデバッグ機能をオンにすることで、画面で確認できるようになります。
今回もまずは、前回の最初のプログラムとほとんど同じものから始めます。最初にビューコントローラーのviewDidLoadメソッドの中で元のビューをシーンビューに置き換えます。
次に前回と同様に、viewWillAppearメソッドの中でARWorldTrackingConfigurationのオブジェクトを起動します。ただし今回は、そこでシーンビューのデバッグオプションを設定します。複数のオプションを同時に設定可能ですが、とりあえずshowFeaturePointsをオンにします。
これは文字通りフィーチャーポイントを表示するというものです。このフィーチャーポイントは、日本語では「特徴点」と訳すことができます。カメラで撮影している現実世界の物体の位置関係を表す特徴的な点のことです。このオプションをオンにすると、ARKitが検出中の特徴点を黄色いドットとして画面に表示ます。
よく言えば、黄色い光を放つ蛍が飛んでいるような、悪く言えば黄色い虫が這っているような映像が確認できるでしょう。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ