このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング第93回

今が旬のARKitを使ってみよう

ARKitが使えるiPadを識別するプログラム

2018年06月27日 19時15分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 このところ、iOSのフレームワークの中では比較的新しいCoreMLを使って、機械学習の成果を利用できるようにするプログラムに取り組んできました。今回からCoreMLと同様に、iOS 11から利用可能になったARKitを使っていきます。そう、iOSアプリで拡張現実(Augmented Reality)を実現するためのフレームワークです。

 これらのフレームワークは、ちょうど1年ほど前に発表されたもので、世の中のIT技術としても、今最も注目されている領域に属するものです。とはいえ、機械学習と拡張現実に共通するのは、注目度が高いということくらいで、機能としても、目指すところも、もちろんかなり異なります。また、それぞれ実現するための仕組みも異なるため、動作条件も違います。

 前回まで取り組んできたCoreMLは、最新のSwift Playgroundsのアプリが動く環境ならもれなく使うことができました。もう少し正確に言うと、iOS 11のSDKが使えるSwift Playgrounds 1.6以降で利用可能となっています。しかし今回のARKitの動作条件は、それだけではありません。ハードウェアとしてiPad Proから第5世代以降のiPadが必要、ということになっています。

 iPadのユーザーでも、自分の使っているiPadが第何世代なのか、正確に意識している人はそれほど多くないかもしれません。第5世代は、かなり最近のモデルです。別の見方をすると、3Dグラフィック用のGPUチップの世代がApple A9以降ということになるでしょう。ということは、iPad Pro以外では、iPadの2017年モデル以降が該当します。残念ながらiPad miniには該当するモデルはなさそうです。

 今回は、とりあえずARKitの1回目ということで、自分のiPad上でARKitが実際に動作するかどうかを簡単に確かめられる、テストプログラム的なものを作りましょう。それでダメだとわかったら、すぐに新しいiPadを入手するか、ARKitの話題は傍観者として眺めていただくしかありません。もちろん、iPadをアップデートするいい機会と捉えて、iOS 12でさらに発展するARKitに向けた新たな一歩を踏み出す決心をしていただくことに期待しています。

ARKitをインポートしてシーンビューを表示する

 Swift Playgroundsでは、プログラムの開発環境と実行環境が合体しているように見えますが、内部ではそれぞれ別々に動いています。そのため、例えば今回のARKitを利用するプログラムは、ARKitが利用できないiPad上でも、プログラムを入力し、実行開始するところまではできてしまいます。ユーザーにしてみれば、実際に動かしてみるまで、ARKitが動くかどうか確信が持てないということになるでしょう。

 ということで、さっそくARKitをインポートして、本当に動くかどうか確かめるところまでのプログラムを書いてみましょう。ARKitには、UIKitなども含まれているため、あとはPlaygroundSupportをインポートするだけです。

ARKitを利用するには、とりあえずARKitフレームワークをインポートし、ARSCNViewのオブジェクトを作成して通常のビューコントローラーのビューと置き換えます

 ビューコントローラーも、一般的なUIViewControllerですが、拡張現実を表示する画面は、UIViewではなくARSCNViewクラスのオブジェクトとします。それをビューコントローラーのビューとして入れ替えますが、その前に、前回述べたSwift Playgrounds 2.1対策のおまじないとして、ビューのフレームサイズをゼロに設定しています。

 このARSCNViewのオブジェクトのシーンビューは、iPadの内蔵カメラで撮影した現実世界の映像に、3Dオブジェクトを重ねて表示することになります。まずは現実世界を撮影して、それを3D世界として認識させる機能を起動する必要があります。

 それはviewWillAppearメソッドの中で、「セッションを走らせる」というかたちで実行します。また、ビューの表示が終わるときには、そのセッションをポーズさせる処理も必要となります。それはviewWillDisappearメソッドの中で実行します。

ビューが表示される際に、シーンビューのセッションを開始し、ビューの表示が終わる際にはそのセッションを停止するため、それぞれviewWillAppearとviewWillDisappearメソッドを実装して対処します

 Swift Playgroundsの場合には、プログラムの実行とビューの表示のタイミングが常に一致しているので、これらの処理をタイミング良く実行する必然性は薄いのですが、ARKitを使うiOSアプリの定石として取り入れています。セッションの起動だけをviewDidLoadの中で実行しても、特に問題はないかと思います。

 さて、このプログラムを起動すると、とりあえずは黒い画面が表示されます。

ARKitを利用するプログラムの実行に対応していないiPadでは、真っ黒な画面が表示されるだけでその先に進みません。その場合でも、特にエラーは起きないので画面が黒いままかどうかで判断します

 ARKitが利用可能な環境では、あとで示すように、ここでカメラへのアクセスを確認してくるのですが、利用できない環境では何も起こりません。つまり、プログラムがここで止まってしまう場合には、その環境ではARKitは使えないとあきらめるしかありません。

 ARKitが使える場合には、カメラの利用を許可すると、カメラで撮影した映像がそのままビューに表示されるはずです。もちろんそれだけでは、ARKitを利用している意味がないので、次にもう少しプログラムを書き加えましょう。

この連載の記事

週間ランキングTOP5

ASCII倶楽部会員によく見られてる記事はコレだ!

ASCII倶楽部の新着記事

会員専用動画の紹介も!