WWDC Quick Look 💓 By SwiftGGTeam
Explore object tracking for visionOS

Explore object tracking for visionOS

元の動画を見る

ハイライト

Object Tracking は visionOS 今年の新機能で、app が現実世界の特定物体——机の地球儀、その顕微鏡——を認識・追跡し、仮想コンテンツをアンカーできます。従来のアンカータイプは平面、画像、手のみ。Object Tracking は実物体自体をアンカーにします。デモでは実物の地球儀を仮想衛星が周回し、タップで地核の断面図——仮想の月と宇宙ステーションが実地球儀の背後に消え、強い没入感を生み出します。


主要内容

visionOS で空間体験を作る際、これまでアンカーできたものは限られていました:平面、画像、手。仮想コンテンツが特定の実物体に「付着」する必要がある場合——例えば実地球儀を周回する衛星——平面アンカーで近似するしかなく、位置が不正確でオクルージョンもありませんでした。

Object Tracking がこれを解決します。実物体自体をアンカーにします。システムが機械学習モデルで物体を認識し、位置、向き、境界ボックスを継続出力。仮想コンテンツは物体表面に正確に付着でき、実物体に遮られることも——仮想衛星が地球儀の背面に消え、本当に回ったかのように。

ワークフローは 3 ステップ:第一に、対象物体の USDZ 3D モデルを提供(リアルであるほど良い。Object Capture で iPhone スキャンから生成可能)。第二に、Create ML app で機械学習モデルを訓練し .referenceobject ファイルを出力。第三に、visionOS app で reference object をロードし、追跡を開始して仮想コンテンツをアンカー。

Apple は比較的平易に設計——Create ML に視覚的な訓練 UI があり、USDZ をドラッグして訓練開始、すべて Mac 上でローカル実行。ただし明確な制限あり:物体は剛性、非対称、ほぼ静止である必要があり、物体ごとに ML モデルを訓練。訓練に数時間かかる場合があり、Apple Silicon Mac のみサポート。


詳細

Reference Object の作成

訓練入力は USDZ 形式の 3D モデル。Apple は物体の実外観に近いモデルを推奨——本質的に「デジタルツイン」。最も簡単な取得方法は iPhone/iPad の Object Capture で物体をスキャン(03:47)。光沢や透明部品がある場合、マルチマテリアル USDZ アセットも提供可能(03:58)。

物体は 3 条件を満たす必要があります(04:16):

  • 大部分の時間静止
  • 形状とテクスチャが剛性
  • 非対称——各角度で見た目が異なる

Create ML では今年「Spatial」カテゴリに Object Tracking テンプレートが追加。設定で重要なステップ:視聴角度の選択(06:52)。3 オプション:

  • All Angles:任意角度から見える物体(回転可能な地球儀など)。各角度の外観が独特である必要
  • Upright:卓上に垂直配置(顕微鏡など)。底面視点を除外
  • Front:垂直配置で背面追跡不要(オシロスコープなど)。背面と底面を除外

正しい視聴角度の選択は追跡品質に大きく影響。ML 訓練がどの視点に注目するかを導くため。

Reality Composer Pro でコンテンツをアンカー

訓練後、Reality Composer Pro で Transform Entity を作成し、AnchoringComponent を追加、新しい「Object」ターゲットタイプを選択し、reference object を関連付け(10:18)。ビューポートに半透明 USDZ モデルプレビューが表示され、仮想コンテンツを正確に配置——例:地球儀のケープカナベラル位置にスペースシャトル発射エンティティ。

「仮想が実物に遮られる」効果には、Anchor Entity 下に USDZ 地球儀エンティティをオクルーダーとして追加し、ShaderGraph エディタで Occlusion Material を適用(11:55)。Object Tracking が親アンカーの transform を更新すると、オクルーダーが実地球儀と整合し、周回する仮想物体が自然に背後で消える。

RealityKit API で Coaching UI を実装

ユーザーがまだ対象物体を見つけていない場合、app にガイド UI(Coaching UI)が必要。第一に物体のプレビューモデルを表示(13:55):

// Display object USDZ
struct ImmersiveView: View {
   @State var globeAnchor: Entity? = nil
    var body: some View {
        RealityView { content in
            // Load the reference object with ARKit API
            let refObjURL =
            Bundle.main.url(forResource: "globe", withExtension: ".referenceobject")
            let refObject = try? await ReferenceObject(from: refObjURL!)

            // Load the model entity with USDZ path extracted from reference object
            let globePreviewEntity =
            try? await Entity.init(contentsOf: (refObject?.usdzFile)!)

            // Set opacity to 0.5 and add to scene
            globePreviewEntity!.components.set(OpacityComponent(opacity: 0.5))
            content.add(globePreviewEntity!)
        }
    }
}

キーポイント:

  • ReferenceObject(from:) で ARKit API 経由 .referenceobject ファイルをロード
  • refObject?.usdzFile で reference object から元 USDZ パスを抽出しプレビューモデルをロード
  • OpacityComponent(opacity: 0.5) で半透明設定。これはプレビューであり実際の追跡結果ではないことを示す

第二、アンカー状態変化を監視(14:13):

// Check anchor state
struct ImmersiveView: View {
   @State var globeAnchor: Entity? = nil
    var body: some View {
        RealityView { content in
            if let scene = try? await Entity(named: "Immersive", in: realityKitContentBundle) {
                globeAnchor = scene.findEntity(named: "GlobeAnchor")
                content.add(scene)
            }
            let updateSub = content.subscribe(to: SceneEvents.AnchoredStateChanged.self) { event in
                if let anchor = globeAnchor, event.anchor == anchor {
                    if event.isAnchored {
                        // Object anchor found, trigger transition animation
                    } else {
                        // Object anchor not found, display coaching UI
                    }
                }
            }
        }
    }
}

キーポイント:

  • SceneEvents.AnchoredStateChanged はアンカー状態変化時に発火
  • event.isAnchored が true なら物体が追跡中、false ならロスト
  • isAnchored 状態に応じて coaching UI と遷移アニメーションを切り替え

第三、追跡物体の空間 transform を取得して遷移アニメーション(14:31):

// Transform space
struct ImmersiveView: View {
   @State var globeAnchor: Entity? = nil
    var body: some View {
        RealityView { content in
            // Setup anchor transform space for object and world anchor
            let trackingSession = SpatialTrackingSession()
            let config = SpatialTrackingSession.Configuration(tracking: [.object, .world])
            if let result = await trackingSession.run(config) {
                if result.anchor.contains(.object) {
                    // Tracking not authorized, adjust experience accordingly
                }
            }
           // Get tracked object's world transform, identity if tracking not authorized
            let objectTransform = globeAnchor?.transformMatrix(relativeTo: nil)
            // Implement animation
            ...
        }
    }
}

キーポイント:

  • SpatialTrackingSession.Configuration(tracking: [.object, .world]) で object と world 追跡権限をリクエスト
  • result.anchor.contains(.object) で object 追跡が認可されているか確認
  • transformMatrix(relativeTo: nil) で世界座標系のアンカー transform を取得。未認可時は identity

新 ARKit API

Apple は今年 ARKit Object Tracking API もリリース(15:45)。追跡物体の境界ボックスと対応 USDZ ファイルへのアクセス、追跡準備完了状態と異常イベントの通知を提供。サンプル app は開発者ドキュメントからダウンロード可能。


重要ポイント

  • やること:教育 app で教具に仮想ラベルをオーバーレイ。価値がある理由:学生が Apple Vision Pro で実顕微鏡を見る際、仮想ラベルで各部品名と機能を注釈——紙の説明書より直感的。始め方:Object Capture で教具をスキャンして USDZ 生成、Create ML で reference object を訓練、RealityKit で SwiftUI ラベルをアンカー。

  • やること:製品展示で実物が没入体験をトリガー。価値がある理由:店舗で消費者が製品を手に取ると、仮想アニメーションと機能デモが製品上で直接再生——画面ビデオより没入感。始め方:「Front」または「Upright」視聴角度でモデル訓練(製品は通常垂直配置)。Occlusion Material で仮想コンテンツが製品背面で消える。

  • やること:産業シナリオで機器に仮想操作ガイドをオーバーレイ。価値がある理由:保守担当者が複雑な機器に直面する際、仮想矢印とハイライトが機器上に直接表示——マニュアル参照時間を削減。始め方:Coaching UI パターン——まずデバイスプレビューで対象を見つけるよう誘導、追跡後に操作ガイドオーバーレイに切替、AnchoredStateChanged イベントで状態管理。


関連セッション

コメント

GitHub Issues · utterances