記事

セッションのライフサイクルとトラッキングクオリティの管理

わかりやすいフィードバックの提供、中断からの復帰、以前のセッションの再開によって、AR体験をより強力なものにしてください。

概要

ワールドトラッキングARセッションは、Visual Inertial Odometry(VIO)と呼ばれる技術を使います。このプロセスは、モーションセンサーのデータとカメラ画像のコンピュータビジョン解析とを組み合わせ、デバイスの姿勢ARCamera(英語) transform(英語)プロパティで表されるリアルワールドの空間における位置と向き)を追跡します。最適な結果を得るため、ワールドトラッキングには、継続的なセンサーデータと、視覚的複雑性または認識可能なフィーチャ(特徴)を持つカメラ画像が必要です。

セッションを開始してから、ARKitがデバイスの姿勢を正しく把握するために十分なデータを収集するまでに少し時間がかかります。セッション中に、ワールドトラッキングクオリティに影響する条件が変わることがあります。ARSessionObserver(英語)デリゲートメソッドとARCamera(英語)プロパティを使って、このような変化を把握します。

ARセッションの基本的なライフサイクル

下の図は、ARセッションを開始したときのトラッキング状態の変化を示しています。

ARKitのトラッキング状態がnotAvailableからlimited(初期化中)、normalへと進むことを示したシーケンス図

新しいセッションの開始直後、提供されるフレームのトラッキング状態はARCamera.TrackingState.notAvailable(英語)であり、ARKitがまだデバイスの姿勢を推定するために十分な情報を収集していないことを示します。

数フレーム後に、トラッキング状態がARCamera.TrackingState.limited(_:)(英語)に変わり、デバイスの姿勢情報は利用可能ですがその精度は不明だということを示します。limited状態では常に、トラッキングクオリティの低下の理由が含まれます。この場合、セッションはまだARCamera.TrackingState.Reason.initializing(英語)です。

しばらくするとトラッキング状態がARCamera.TrackingState.normal(英語)に変わり、デバイスの姿勢情報が正確であり、ARKitのすべての機能を利用できることを示します。

トラッキングクオリティの変化に関するフィードバックの提供

下の図は、ユーザーの操作や環境の変化によって発生する可能性のある、トラッキング状態の変化を示しています。

ARKitのトラッキング状態がnormalからlimited(一部の機能が使用不可)になり、normalに戻ることを示したシーケンス図

トラッキングクオリティがARCamera.TrackingState.limited(_:)(英語)になっている間、ARKitがユーザーの周囲の状況をマッピングすることに依存する機能は利用できません。

  • 平面検出機能は、平面アンカーの追加や更新を行いません。

  • ヒットテストメソッドの結果が提供されません。

ユーザーの周囲の状況が変化したり、ユーザーがデバイスを動かしたりすることによって、セッションのトラッキング状態はいつでもARCamera.TrackingState.limited(_:)(英語)になる可能性があります。たとえば、ユーザーが何もない壁にデバイスを向けたり、部屋の明かりが消えたりすると、ARCamera.TrackingState.Reason.insufficientFeatures(英語)のためトラッキングクオリティが低下する場合があります。

関連するARCamera.TrackingState.Reason(英語)の値を使ってフィードバックを提供し、ユーザーが問題を解決してトラッキング状態をARCamera.TrackingState.normal(英語)に戻せるようにしてください。

セッション中断からの復帰

ARKitは、ARSession(英語)を実行中でないとデバイスの姿勢を追跡できません。デフォルトで、(たとえば別のAppに切り替えることによって)セッションが中断すると、そのセッションの仮想コンテンツは、リアルワールドの環境に対して不自然なものになり得ます。

relocalization(場所への復帰)を使って、中断からの復帰を試みることができます。sessionShouldAttemptRelocalization(_:)(英語)メソッドでtrueを返すと、ARKitは、中断前のユーザー環境について持っている情報と、現在のカメラおよびセンサーのデータとのマッチングを試みます。このプロセスの間、トラッキング状態はARCamera.TrackingState.limited(_:)(英語)(理由はARCamera.TrackingState.Reason.relocalizing(英語))になります。成功すると、しばらく後にトラッキング状態がARCamera.TrackingState.normal(英語)に戻ります。

セッション中断前のトラッキング状態がnormalで、中断後にnotAvailableからlimited(初期化中)、limited(場所への復帰中)、normalへと進むシーケンス図

relocalizationが成功するためには、セッションが中断されたときと同じような位置と向きにデバイスを戻す必要があります。このような状態にならない場合(デバイスをまったく別の場所に移動した場合など)、セッションの状態はいつまでもARCamera.TrackingState.Reason.relocalizing(英語)のままです。

持続するAR体験の作成

iOS 12.0以降では、ARWorldMap(英語)クラスに、ARKitがセッションの再開に使用する情報が保存されます。ワールドマップをファイルに保存することによって、同じrelocalizationプロセスを使って短い中断から復帰するのと同様に、Appを再起動した場合でも以前のセッションから再開できます。ワールドマップにはアンカーが含まれるので、以前のセッションと一致するように仮想コンテンツを再配置することもできます。

normalのトラッキング状態で、Appを閉じる前にワールドマップを保存しているシーケンス図。Appを再起動すると、保存されたマップが読み込まれ、トラッキング状態がnotAvailableからlimited(初期化中)、limited(場所への復帰中)へと進みます。

ユーザーがAppを閉じた後に同じARセッションに戻れるようにするには、ユーザーの操作によって明示的にワールドマップを保存するか、applicationDidEnterBackground(_:)(英語)で暗黙的に保存します。ワールドマップの保存は、ARセッションの状態が保存に値する場合にのみ行ってください。たとえば、ユーザーが配置した仮想オブジェクトの位置を覚えて置きたい場合などは、セッションがARFrame.WorldMappingStatus.mapped(英語)状態である(またはセッション中に少なくとも一度はその状態にあった)必要があります。

保存されたワールドマップに対してrelocalizationを行うには、セッションの実行時にinitialWorldMap(英語)プロパティを使います。中断から復帰する場合と同じように、セッションはARCamera.TrackingState.limited(_:)(英語)ARCamera.TrackingState.Reason.relocalizing(英語))のトラッキング状態で開始します。ARKitが現在の環境とワールドマップをマッチングできると、しばらくしてトラッキング状態がARCamera.TrackingState.normal(英語)になり、セッションが記録されたワールドマップに一致していることを示します。

ワールドマップから再開されたセッションには、そのワールドマップに保存されたすべてのアンカーが含まれます。name(英語)プロパティを使ってアンカーに配置した仮想オブジェクトを特定できるようにしておき、再開したセッションでアンカーから参照した仮想コンテンツをもう一度作成します。コンテンツを正しく配置するには、セッションのトラッキング状態がARCamera.TrackingState.normal(英語)になってから表示してください。

ARKitが、記録されたワールドマップと現在の環境をマッチングさせることができない場合(たとえば、ワールドマップが記録された場所とまったく異なる場所にデバイスがある場合など)は、セッションがいつまでもARCamera.TrackingState.Reason.relocalizing(英語)の状態のままになります。セッションを再開できない場合は、セッションを再起動する方法をユーザーに提供してください。ワールドマップのrelocalizationをやめるには、セッションでもう一度run(_:options:)(英語)を呼び出します。このとき、resetTracking(英語)オプションと、initialWorldMap(英語)nilの設定を使います。

関連項目

ユーザー体験

拡張現実における3D操作とUIコントロール(英語)

AR体験でのビジュアルフィードバック、ジェスチャ操作、リアルなレンダリングについてのベストプラクティスです。

SwiftShot:拡張現実のゲームの作成(英語)

AppleがWWDC18で紹介したデモのコードです。どのように構築されているか確認し、ARKit、SceneKit、Swiftを使ってオリジナルのマルチプレイヤーゲームを作るヒントにしてください。