Lesson 3A.1 The Augmented Reality Template

ARKitの最初のレッスンへようこそ。拡張現実を中心とした新しいアプリを構築する場合でも、既存のアプリに拡張現実を追加する場合でも、追加のXcodeプロジェクト構成を学ぶ必要があります。次に、拡張現実フレームワークの基本を掘り下げるように設定されます。

あなたが学ぶこと

ARKitを使用して新しい拡張現実ベースのプロジェクトを作成する方法

既存のXcodeプロジェクトにARKitを追加する方法

SceneKitとARKitの連係

ARアプリのさまざまなデバッグオプションを有効にする方法

Vocabulary
ARConfiguration
ARKit
ARSCNView
ARSession
origin
scene
SceneKit

p.444 
Xcodeを開き、新しいプロジェクトを作成します。ARKitをすばやく使い始めるには、拡張現実アプリと呼ばれる新しいXcodeテンプレートを使用できます。このテンプレートには、ARプロジェクトに必要な設定ファイルとコードが便利に含まれています。以前のレッスンで使用した標準のシングルビューアプリケーションテンプレートからこのテンプレートを選択します。

次の画面では、新しいオプションであるコンテンツテクノロジーを指定する必要があります。選択したSceneKit、SpriteKit、またはMetalは、XcodeがARKitと組み合わせてオブジェクトを拡張された世界に追加するために使用するフレームワークを決定します。SpriteKitフレームワークは2Dアセットの操作に重点を置いており、SceneKitとMetalは3Dに焦点を当てています。このガイドでは、SceneKitのみを使用します。今すぐ選択してください。

プロジェクトに「ARKit-Template」という名前を付けます。物理デバイスをコンピュータに接続し、シミュレータではなくターゲットデバイスとして設定します。先に進む前に、デバイスのiOSをアップデートする必要があるかもしれません。アプリのテストは、デバイスがARKitをサポートするiOSバージョンを実行している場合にのみ機能します。それ以外の場合は、デバイスをターゲットとして選択できません。

p.445
アプリが初めて起動すると、デバイスのカメラを使用する許可を求められます。ARKitは許可なく、新しいセッションを開始できません。アクセスを確認すると、背面カメラが有効になり、デバイスを動かすと3D船がシーンに浮かんでいるのがわかります。また、画面の下部にバーが表示され、左側のプラス記号(+)を選択して、メモリとパフォーマンスに関する統計を表示できます。

数分かけて、ARKitが現実世界でデバイスの位置と向きをどのように追跡するかを試してみてください。動き回ると、船が宇宙に固定されていないように見えることに気付くかもしれません。体験の忠実度に影響を与える特定の条件はありますか?このフレームワークは、ARを可能にするためにバックグラウンドで多くの重い作業を行っており、視覚的な手がかりが豊富な環境を持つことに依存しています。環境を変更して、それがアプリにどのように影響するかを観察してみてください。

プロジェクトテンプレートの解剖

このXcodeプロジェクトと、以前のレッスンで作成したプロジェクトの違いは何ですか?Swiftコードに飛び込む前に、プロジェクトナビゲーターを使用してARKit-Templateアプリの他のファイルを調べます。シングルビューアプリケーションテンプレートで見慣れているファイルと比較してください。

比較が終わったと思ったら、調査結果が以下の違いのリストと一致するかどうかを確認してください。

art.scnassetsカタログには、アプリに含まれるすべてのSceneKitアセットが含まれています。最初のアセットship.scnは、サイズ、色、位置決めなど、3Dモデルの詳細を含むSceneKitシーンファイルです。通常、3Dアーティストにこれらのファイルを作成してもらいますが、インターフェイス内で独自のファイルを作成できます。2番目のアセットtexture.pngは、3Dオブジェクトに適用されるテクスチャです。たとえば、この平らな画像が船のモデルの周りに完全に曲がって接着されていると想像できます。

p.446 
Main.storyboardでは、ビューコントローラーのビュープロパティが置き換えられました。UIViewの代わりに、ARSCNViewです。この特別なサブクラスは、ユーザーのカメラを表示し、任意の3Dオブジェクトをシーンに追加できるようにします。

Info.plistファイルを検査するには、プロジェクトナビゲーターから選択し、その内容の中を右クリックして[生のキー/値を表示]を選択します。このファイルにはさらに2つのエントリがあります。1つ目はキーNSCameraUsageDescriptionで、その値はカメラへのアクセスを求められたときにユーザーに表示されるテキストです。2番目のエントリは、UIRequiredDeviceCapabilitiesキーの下の追加のアーキット値です。これにより、アプリがARKitを使用していることをApp Storeに通知し、アプリがARKitをサポートするデバイスでのみ利用可能であることが保証されます。

p.447 
ARKitとSceneKitの基本

プロジェクト構造を理解したので、ViewController.swiftを開いて、基本的なARアプリを起動して実行するために必要なコードを確認してください。ファイルの上部には2つの新しいインポート行があります。ViewControllerクラスは、ARKitとSceneKit内で利用可能なクラスで動作する必要があるため、これらのフレームワークをファイルにインポートする必要があります。

p.448 
ARSCNビュー

sceneViewアウトレットは、Interface Builderで見たARSCNViewに接続されています。ビューに表示するシーンであるシーンプロパティがあります。viewDidLoad() では、プロパティは 3D シップを含むシーンに設定されます。ビューの showsStatistics ブール値は true に設定されており、先ほど見た下部バーを有効にします。

p.449 
ARSessionとARConfiguration

ARSCNViewが読み込まれると、ARSession型の独自のセッションプロパティが初期化され、モーショントラッキングを管理し、カメラ画像データを処理します。しかし、セッションがこれらすべてを行う前に、run(_:)関数を呼び出して引数としてARConfigurationを指定する必要があります。ARSCNViewが表示されるたびにrun(_:)を呼び出すので、viewWillAppear(_:)でこの関数を呼び出すことをお勧めします。デバイスの位置を追跡するには、ARWorldTrackingConfigurationを初期化して実行する必要があります。そうすれば、ARKitは船の正しいサイズと位置を維持できます。

ARSCNViewが表示されない場合はどうですか?カメラビューがフォーカスでなくなった場合、セッションの実行を続行する理由はありません。不要な作業を防ぐために、ビューが表示されなくなるたびにセッションを一時停止()できます。viewWillDisappear(_:) で関数を呼び出すと、このビューコントローラーを閉じるとき、または新しいビューコントローラーを表示するときに pause() がトリガーされます。

p450 
ARSCNViewDelegate

拡張現実アプリのテンプレートには、さらにいくつかのコードがあります。ビューコントローラは、それ自体をARSCNViewDelegateと宣言し、viewDidLoad()内のsceneViewのデリゲートとして自分自身を割り当て、クラス定義の下部にいくつかの空のメソッドを持っています。これにより、ARSCNViewは、シーンに関連するイベントに関する情報(オブジェクトが追加されたとき、セッションが中断されたとき)をビューコントローラに送信できます。ビューコントローラーがシーンビューに「これらのイベントがいつ行われるか教えてください」と伝えるかのようです。

代表者の詳細については、ユニット4を参照してください。

シーンポジショニング

デバイスを動かすと、船はARWorldTrackingConfigurationを使用して3D空間での位置を維持します。しかし、ARSCNViewはどのようにして最初に船をどこに置くかを知っていますか?Ship.scnファイルを開き、シーングラフビューで最上位ノード「ship」を選択します。(ボタンを使用して、このディスプレイのオン/オフを切り替えることができます
エディタの左下にあります。)

p.451 
船は世界座標系を表すグリッド上に配置されている。3つの矢印のセットに注目しますか?それがノードの起源であり、世界の起源と一致しています:3D空間の(0,0,0)。X軸は赤い線、y軸は緑、z軸は青で表されます。赤、緑、または青の矢印の方向に移動すると、対応する値が増加します。船はz軸に沿って矢印の反対方向に配置されているため、負のz値があります。値自体は、ユーティリティパネルのノードインスペクタにあります。シーングラフビューから「shipMesh」を選択し、z値が0.8であることがわかります。

3Dコンピューティングをやったことがない場合は、このユニットを完成させる際に3D座標系の仕組みに慣れる必要があります。

アプリの原産地を見ると助かりますか?ARSCNViewには、シーン内のオブジェクトの周りのオリジンボックスまたは3Dボックスを含む追加のオーバーレイを描画できるdebugOptionsプロパティがあります。viewDidLoad() に次の行を追加して、世界の原点を表示します。

sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin]

アプリを再度ビルドして実行してください。船が原点と比較して正しい位置にどのように配置されているかに注目してください。最初に負のz方向を指しているのは奇妙に思えるかもしれません。なぜなら、世界の起源は、アプリを起動するときにどこにいても決まるからです。また、UIKitとは異なり、x軸とy軸は標準のデカルト座標系(数学クラスから覚えているかもしれません)に従ってレイアウトされ、y座標は上がるにつれて価値が増加していることにも役立ちます。

演習

シングルビューアプリケーションテンプレートから始めて、ARKitとSceneKitを使用するようにプロジェクトを調整します。アプリを実行するときは、カメラが有効になり、ワールドオリジンが表示されるはずです。

世界原点の真上に浮かぶ船の位置を調整して、ARKit-Templateアプリを変更します。

ARKit-Templateアプリのユーティリティパネルを調査して、船のテクスチャがどこに適用されているかを判断します。船がオレンジ色になるようにプロパティを変更します。

p.452 
Xcodeのドキュメントを使用して、利用可能なすべてのSCNDebugOptionsのリストを作成します。どのオプションが拡張現実アプリのテンプレートに影響し、それらが何をするかを実験してください。

高度な質問

ビューと同じなら、なぜアウトレットシーンビューを作成するのですか?

ARKitは、サイズと距離を決定するためにどの測定単位を使用しますか?

この記事が気に入ったらサポートをしてみませんか?