ハイライト
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イベントで状態管理。
関連セッション
- Create enhanced spatial computing experiences with ARKit — ARKit 今年の Room Tracking と Object Tracking API の完全紹介
- Discover area mode for Object Capture — より複雑なシーンの 3D モデル生成向け Object Capture エリアスキャンモード
- What’s new in Create ML — Create ML 今年の Object Tracking テンプレートとその他更新
- Discover RealityKit APIs for iOS, macOS, and visionOS — クロスプラットフォーム RealityKit API の新機能
コメント
GitHub Issues · utterances