WWDC Quick Look 💓 By SwiftGGTeam
Explore ARKit 4

Explore ARKit 4

元の動画を見る

ハイライト

ARKit 4 は、地理的位置アンカー、LiDAR シーン深度、レイ キャスティングの改善、より広いデバイス カバレッジのための顔追跡を追加し、AR コンテンツが実際の座標をバインドし、メーター レベルの深度を読み取り、オブジェクトの配置をより迅速に完了できるようにします。

主要内容

これまで屋外で AR を行う際の最大の悩みは座標でした。 GPS はアプリに大まかな位置を知らせることができますが、街角の建物の前に仮想看板を安定して配置することはできません。開発者は、ローカル AR 座標と地理座標の間の変換にも対処する必要があり、ユーザーが数歩歩くと仮想コンテンツがドリフトする可能性があります。

ARKit 4 では、この問題がフレームワークに組み込まれています。開発者は緯度と経度、およびオプションの高度を指定します。ARGeoTrackingConfigurationApple Maps の高精度地図データ、カメラ画像、デバイスの動きデータを組み合わせて、視覚的な位置特定を完了します。アプリが取得するのは世界的に認識された AR ポーズであり、仮想コンテンツを現実世界の位置に固定できます。

屋内 AR の問題点も非常に単純です。以前は、平面の検出が安定するまで待つ必要があり、白い壁のような特徴のない表面では配置プロセスが遅くなっていました。 ARKit 3.5 では、最初に LiDAR を使用してシーン ジオメトリを導入し、iOS 14 では Depth API を開きます。開発者は、各フレームの深度マップを取得したり、レイキャスティングで深度またはシーン メッシュを自動的に使用してオブジェクトを実際の表面により速く配置したりできます。

このセッションの主旨は明確です。ARKit 4 は AR を「部屋のローカル座標」から「現実世界の位置、深さ、表面」に進化させます。ロケーション アンカーは屋外の共有位置を解決し、Depth API は実際のシーンの距離を解決し、レイキャスティングは配置速度を解決し、フェイス トラッキングは顔の AR をより多くの A12 以降のチップ デバイスに拡張します。

詳細

地理位置情報アンカー: まずデバイスと位置を確認します

(06:58) アンカーを次から配置しますARGeoTrackingConfiguration始める。セッションでは、最初に 2 つのことを確認する必要があります。それは、デバイスが地理追跡をサポートしているかどうか、および現在の場所に視覚的な位置を特定するのに十分な地図データがあるかどうかです。

// Check device support for geo-tracking
guard ARGeoTrackingConfiguration.isSupported else {
    // Geo-tracking not supported on this device
    return
}

// Check current location is supported for geo-tracking
ARGeoTrackingConfiguration.checkAvailability { (available, error) in
    guard available else {
        // Geo-tracking not supported at current location
        return
    }
    // Run ARSession
    let arView = ARView()
    arView.session.run(ARGeoTrackingConfiguration())
}

キーポイント:

  • ARGeoTrackingConfiguration.isSupportedまずサポートされていないハードウェアをブロックすることから、Session 氏はロケーション アンカーには A12 Bionic 以降のチップと GPS が必要であると述べました。
  • checkAvailability現在の場所に位置情報の Apple Maps データがあるかどうかを確認します。
  • 検査に合格した後、ARViewセッションが実行されますARGeoTrackingConfiguration()
  • ARKit はセッションの開始時にカメラと位置情報の許可を要求し、失敗した場合はユーザーにエラーを説明する必要があります。

ARGeoAnchor を使用して実際の緯度と経度をバインドする

(08:38) セッションでは、例としてサンフランシスコのフェリー ビルディングを使用します。開発者によって作成されましたCLLocationCoordinate2D、再度作成しますARGeoAnchor、最後に RealityKit エンティティをこのアンカー ポイントにハングします。

// Create coordinates
let coordinate = CLLocationCoordinate2D(latitude: 37.795313, longitude: -122.393792)

// Create Location Anchor
let geoAnchor = ARGeoAnchor(name: "Ferry Building", coordinate: coordinate)

// Add Location Anchor to session
arView.session.add(anchor: geoAnchor)

// Create a RealityKit anchor entity
let geoAnchorEntity = AnchorEntity(anchor: geoAnchor)

// Anchor content under the RealityKit anchor
geoAnchorEntity.addChild(generateSignEntity())

// Add the RealityKit anchor to the scene
arView.scene.addAnchor(geoAnchorEntity)

キーポイント:

  • CLLocationCoordinate2D小数点以下 6 桁以上の精度を使用します。セッションはこれを使用して、コンテンツが適切な場所に正確に配置されるようにします。
  • ARGeoAnchor(name:coordinate:)緯度と経度のみが渡された場合、ARKit は地図データを使用して地面の標高を推測します。
  • arView.session.add(anchor:)ARKit にジオアンカーを管理させます。
  • AnchorEntity(anchor:)RealityKit コンテンツをこの ARKit アンカーの後に配置します。
  • generateSignEntity()表示される仮想看板を表し、実際のアプリはモックアップ、説明看板、またはナビゲーション プロンプトに置き換えることができます。

アンカー ポイントの方向は固定され、コンテンツの変換はレンダリング レイヤに渡されます。

10:32ARGeoAnchor座標軸は方向に固定されています。X 軸は東を指し、Z 軸は南を指し、Y 軸は上を指します。アンカー ポイント自体は不変であり、コンテンツの回転と上昇は RealityKit エンティティで行われます。

// Create a new entity for our virtual content
let signEntity = generateSignEntity();

// Add the virtual content entity to the Geo Anchor entity
geoAnchorEntity.addChild(signEntity)

// Rotate text to face the city
let orientation = simd_quatf.init(angle: -Float.pi / 3.5, axis: SIMD3<Float>(0, 1, 0))
signEntity.setOrientation(orientation, relativeTo: geoAnchorEntity)

// Elevate text to 35 meters above ground level
let position = SIMD3<Float>(0, 35, 0)
signEntity.setPosition(position, relativeTo: geoAnchorEntity)

キーポイント:

  • generateSignEntity()表示するコンテンツエンティティを作成します。
  • geoAnchorEntity.addChild(signEntity)コンテンツを地理アンカーのローカル座標系に配置します。
  • simd_quatfY 軸を中心に回転して、テキストが都市の方向を向くようにします。
  • setOrientation(_:relativeTo:)地理的なアンカーポイントを基準にして方向を設定します。
  • SIMD3<Float>(0, 35, 0)長距離でも識別できるように標識を 35 メートル高くします。

ユーザーのクリックによって地理座標を生成することもできます

(14:08) 地理座標は必ずしもデータベースから取得されるわけではありません。ユーザーが画面をタップすると、アプリは ARKit の世界座標から地理的位置を確認し、それを新しい位置アンカーとして保存できます。

let session = ARSession()
let worldPosition = raycastLocationFromUserTap()
session.getGeoLocation(forPoint: worldPosition) { (location, altitude, error) in
    if let error = error {
        ...
    }
    let geoAnchor = ARGeoAnchor(coordinate: location, altitude: altitude)
}

キーポイント:

  • raycastLocationFromUserTap()ユーザーのクリック位置から取得したAR世界座標を表します。セッションは、レイキャストまたは平面上の点から発生する可能性があると述べました。
  • getGeoLocation(forPoint:)ARKit ワールド ポイントを地理位置情報と標高に変換します。
  • コールバック内error対処として、位置決めに失敗した場合、間違ったアンカーポイントを保存することはできません。
  • ARGeoAnchor(coordinate:altitude:)ユーザーが作成した名所の保存に適しています。

Depth API: フレームごとにメーターレベルの深度と信頼性を読み取ります

(20:32) LiDAR デバイスでは、ARKit 4 が公開されますsceneDepthフレームのセマンティクス。有効にすると、それぞれARFrame全部読めるARDepthData、これには以下が含まれますdepthMapそしてconfidenceMap

// Enabling the depth API

let session = ARSession()
let configuration = ARWorldTrackingConfiguration()

// Check if configuration and device supports .sceneDepth
if type(of: configuration).supportsFrameSemantics(.sceneDepth) {
    // Activate sceneDepth
    configuration.frameSemantics = .sceneDepth
}
session.run(configuration)

...

// Accessing depth data
func session(_ session: ARSession, didUpdate frame: ARFrame) {
    guard let depthData = frame.sceneDepth else { return }
    // Use depth data
}

キーポイント:

  • ARWorldTrackingConfiguration()まだ通常の世界追跡への入り口です。
  • supportsFrameSemantics(.sceneDepth)デバイスが LiDAR シーン深度をサポートしているかどうかを確認します。
  • configuration.frameSemantics = .sceneDepth深度出力をオンにします。
  • frame.sceneDepth戻るARDepthDataここで、深度ピクセルの単位はメートルです。
  • セッションは、深度マップはカメラ画像と同じアスペクト比を持っていますが、解像度は小さいと述べました。

キャラクターのオクルージョンと深度を共有可能

(21:12) アプリが使用されている場合personSegmentationWithDepth、サポートsceneDepthデバイスはシーンの深度を自動的に提供し、これによって追加の電力消費が発生することはないとセッション氏は説明しています。

// Using the depth API alongside person occlusion

let session = ARSession()
let configuration = ARWorldTrackingConfiguration()

// Set required frame semantics
let semantics: ARConfiguration.FrameSemantics = .personSegmentationWithDepth

// Check if configuration and device supports the required semantics
if type(of: configuration).supportsFrameSemantics(semantics) {
    // Activate .personSegmentationWithDepth
    configuration.frameSemantics = semantics
}
session.run(configuration)

キーポイント:

  • personSegmentationWithDepthこれは、キャラクター オクルージョンに必要なフレーム セマンティクスです。
  • supportsFrameSemantics(semantics)有効にする前にデバイスの機能をチェックします。
  • オンにした後、アプリは引き続き文字オクルージョンを使用し、サポートされているデバイスで文字を読み取ることができますsceneDepth
  • これは、人と現実の環境の間に仮想オブジェクトを配置して、オクルージョン関係を強化するのに適しています。

レイキャスティング: 古いヒットテストをクエリに置き換えます。

(25:41) ARKit 4 では、オブジェクトの配置にレイキャストを使用することを推奨しています。 LiDAR デバイスでは、レイキャスティングはシーン深度またはシーン ジオメトリを使用して、白い壁などの特徴のない表面でより高速な結果を提供します。

let session = ARSession()
hitTest(point, types: [.existingPlaneUsingGeometry,
                       .estimatedVerticalPlane,
                       .estimatedHorizontalPlane])

let query = arView.makeRaycastQuery(from: point,
                                    allowing: .estimatedPlane,
                                    alignment: .any)

let raycast = session.trackedRaycast(query) { results in
   // result updates
}

キーポイント:

  • 前半は古いものを示していますhitTest通常、メソッドを作成するには、開発者自身が複数の結果をフィルタリングする必要があります。
  • makeRaycastQuery(from:allowing:alignment:)クエリを使用して、光線、ターゲット サーフェス、および位置合わせを記述します。
  • .estimatedPlaneARKit が現在の理解に基づいてサーフェスを推定できるようにします。
  • .any水平や垂直など、異なる向きのサーフェスが許可されます。
  • trackedRaycastARKit がシーンの理解を更新するにつれて、結果は継続的にコールバックされます。

重要ポイント

  • やるべきこと: 屋外のランドマーク ナビゲーション アプリを作成します。ユーザーが建物の近くを歩くと、浮いている看板が見えます。 実行する価値がある理由: ロケーション アンカーはコンテンツを緯度と経度にバインドでき、ARKit は視覚的な位置決めとローカル座標の融合を担当します。 開始方法: を使用しますARGeoTrackingConfiguration.checkAvailability使用前に場所を確認してくださいARGeoAnchor(name:coordinate:)各ランドマークを配置します。

  • やるべきこと: 店舗や展示ホール用の AR 道路標識システムを作成し、現実空間に入口、サービスデスク、出口をマークします。 実行する価値がある理由:ARGeoTrackingStatus現在初期化中か、位置決め中であるか、またはすでに位置決めされているかがわかります。ユーザーがデバイスを持ち上げて建物の方を見るように誘導するのに適しています。 開始方法: 地理追跡を開始した後、ステータスを監視し続け、ローカライズされ、精度が標準に達した場合にのみナビゲーション コンテンツを表示します。

  • やるべきこと: LiDAR 室内スキャン プレビューを作成し、各フレームの深度を点群に変換し、実際のシーンをカラーで表示します。 実行する価値がある理由:frame.sceneDepth深度マップと信頼度マップを提供するセッションの例では、深度を 3D 点群に逆投影します。 開始方法: 有効にする.sceneDepth、存在するsession(_:didUpdate:)読み込むARDepthData、信頼性によって低品質のポイントをフィルタリングします。

  • やるべきこと: 白い壁や空きスペースをクリックするだけで素早く配置できる、より信頼性の高い AR 家具配置機能を作成します。 実行する価値がある理由: ARKit 4 のレイキャスティングは、利用可能な場合はシーンの深度またはシーンのジオメトリを利用し、従来のヒット テストの背後にあるカスタム フィルターを削減します。 開始方法: を使用しますarView.makeRaycastQuery(from:allowing:alignment:)クエリを作成して使用するsession.trackedRaycast配置結果を追跡します。

  • 対処法: TrueDepth を持たないより多くのデバイスにアクセスできるように、フェイス ステッカーまたはライブ絵文字キャラクター機能を作成します。 価値がある理由: ARKit 4 は、A12 Bionic 以降のチップを使用して、フェイス トラッキングを前面カメラを備えたデバイスに拡張します。 開始方法: フェイス アンカー、フェイス ジオメトリ、ブレンドシェイプを使用して仮想コンテンツを駆動する、デバイス機能別のフェイス トラッキングを確認してください。

関連セッション

  • AR Quick Look を使用してオンラインで購入 - 製品モデルを Web ページや購入プロセスに組み込むことは、AR コンテンツの表示を拡張するのに適しています。
  • RealityKit の新機能 — ARKit 4 のレンダリング、アニメーション、物理、オーディオ機能について学び続けます。
  • USD の最新情報 — AR コンテンツ アセットの作成、アンカーリング、インタラクティブな動作の基本を学びます。
  • プラットフォーム一般教書 — LiDAR、深度 API、シーン ジオメトリのシステム背景をプラットフォームの観点から理解します。

コメント

GitHub Issues · utterances