ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
visionOSにおけるオブジェクトトラッキングの詳細
実世界のオブジェクトをvisionOSアプリ内の仮想アンカーに変換する、オブジェクトトラッキングの使用方法を説明します。オブジェクトトラッキングを使用して空間体験を構築するプロセスの全体を学ぶことができます。Create MLでの機械学習を使用して参照オブジェクトを作成し、Reality Composer Pro、RealityKit、ARKit APIのターゲットオブジェクトに関連するコンテンツをアタッチする方法もご紹介します。
関連する章
- 0:00 - Introduction
- 5:07 - Create reference object
- 9:28 - Anchor virtual content
リソース
関連ビデオ
WWDC24
- ARKitを活用したより高度な空間コンピューティング体験の創出
- Create MLの新機能
- Reality Composer Proにおけるインタラクティブな3Dコンテンツの作成
- RealityKitによる空間描画アプリの構築
WWDC23
-
ダウンロード
「Explore object tracking for visionOS」へようこそ Object Trackingチームのエンジニア Henningです 本セッションでは 実世界のオブジェクトを バーチャルアンカーに変換する方法を紹介します 新しいオブジェクトトラッキングの技術を 使用して visionOSアプリで 生き生きとさせることができます 空間体験の構築で Reality Composer Proや RealityKit、ARKitフレームワークを すでに使用したことがあるかもしれません また バーチャルオブジェクトを人々の周囲に アンカーするという概念について 馴染みがあるかもしれません 例えば visionOSアプリでは RealityKit APIやARKit APIを使用して 平面 画像 手に関連して コンテンツを配置できます アンカーはイマーシブ体験の 優れた出発点となり 現実とバーチャルの境界線を曖昧にします オブジェクトトラッキングを使用して 実世界のアイテムをアンカーとして アプリで使用するサポートを追加しました 身の回りのものを一目見るだけで 有用な情報が表示されるようになることを 想像してみてください 家電製品や機器の使い方を バーチャルなマニュアルで確認できたり 収集物やおもちゃに命が吹き込まれ イマーシブなストーリーテリング体験に 導かれたりするのです 魔法みたいですよね 実際にお見せしましょう これは私の空間のビューで テーブルの上に いくつかのアイテムが置いてあります 地球儀 顕微鏡 オシロスコープです オブジェクトトラッキングを使うと アプリはこれらの位置と向きを取得できます ご覧のように 座標系と バウンディングボックスで表現されます 空間座標におけるオブジェクトの 正確な位置情報をアプリに提供できたので もう一歩進めて 興味深いコンテンツで補強していきましょう 先ほどと同じ地球儀ですが 今回はバーチャルラベルが付いています タップすると追加情報が表示されると 書いてあります タップすると 地球儀の周りを周回する オブジェクトが現れました 私の部屋の宇宙に向けて スペースシャトルも発射されました バーチャルな月と宇宙ステーションは 地球儀の裏に回ると ちゃんと隠れます いいですね 体験がより イマーシブ感を高めてくれます しかも地球儀をもう一度タップすると 地球の内核が見えるようになりました すごいですね!
以上は 私の身の回りのオブジェクトで 作成した1つの例に過ぎません みなさんも 身の回りのオブジェクトに 命を吹き込むことができます オブジェクトトラッキングで それを実現する方法を説明します
オブジェクトトラッキングを アプリで非常に簡単に使えるようにしました 使用手順はたったの3ステップです まずは 3Dモデルの準備です これは トラッキングする 実世界のオブジェクトのモデルです 3Dモデルがまだない場合は 簡単に使用できるツールがいくつかあります 次は このモデルを使用して オブジェクトトラッキングに必要な 機械学習モデルをトレーニングします トレーニングでは この3Dアセットを Create MLアプリにインポートします トレーニングが完了すると 参照オブジェクトが得られます これは 今年オブジェクトトラッキングに 導入された 新しい種類のファイルです
最後に この参照オブジェクトを アプリで使用して バーチャルコンテンツをアンカーし 体験を構築します この最後のステップで使える ツールとフレームワークがあるので 後ほど例をいくつかご紹介します まず オブジェクトトラッキングに必要な 3Dモデルについて説明します
先述の通り Create MLアプリで オブジェクトのための機械学習モデルを トレーニングするには 3Dアセットが必要です この3DアセットはUSDZファイル形式 でなければなりません 最高のトラッキング品質を確保するために アセットはできる限り 写真のようにリアルである必要があります 基本的に 実世界のオブジェクトの デジタルツインを目指しています 写真のようにリアルな3Dモデルを 用意するための簡単な方法は Object Capture技術を使用することです 必要なものはiPhoneまたはiPadだけです オブジェクトに 光沢や透明な部分がある場合は 別のワークフローで取得した マルチマテリアルアセットを 使用することもできます Object Captureの詳細や ベストプラクティスについては 「Meet Object Capture for iOS」の セッションをご覧ください
次は オブジェクトトラッキングでサポート されるオブジェクトを見ていきましょう 空間内でめったに動かない オブジェクトが最適です また 形状やテクスチャの外観が 変わらない点も重要です 最後に 非対称な形状であることを 強く推奨します どの方向から見ても 特徴が明確であることが望ましいためです 先ほどの地球儀は球形ですが テクスチャが非対称なので 条件に適合します 地球儀をキャプチャする際は オブジェクトの堅固な部分のみが トラッキングの設定に使用されるように スタンドを取り外しました
では あなたのオブジェクトやコンテンツで これを実現するための 必要な手順を詳しく確認しましょう 基本的な事柄については先ほど説明したので このセクションでは詳細を説明します まず 参照オブジェクトの 作成方法について説明します 次に 既存ツールを使用して 実世界のアイテムに バーチャルコンテンツをアンカーする方法を 例を示しながら説明します まず 参照オブジェクトの 作成から始めましょう 先ほども説明しましたが オブジェクトトラッキングでは ターゲットとなるオブジェクトごとに 機械学習のトレーニングが必要です Create MLアプリには トレーニングのプロセスが統合されており 簡単に実行できるため このタスクに最適です 機械学習のトレーニングはすべて Mac上でローカルに実行されます
Create MLアプリを起動して まず テンプレートを選択します Image Classificationや 2D Object Detectionなどがあります 今年 新しいカテゴリとして Spatialが導入され Object Trackingテンプレートが 追加されました
トレーニングのワークフローは3つの 簡単なステップがあります まず USDZアセットを使用して トレーニングセッションの構成を行います 次に Mac上のローカル環境で MLモデルをトレーニングします 最後に 参照オブジェクトを保存して Apple Vision Pro上で 空間体験を構築します 先にお見せした例を使用して このワークフローを 実際に進めてみましょう Object Trackingテンプレートを使用して 新規プロジェクトを作成すると Create MLは空の3Dビューポートで トレーニングの構成画面を起動します 次は USDZファイルを デスクトップからこのビューポートに ドラッグ&ドロップします
ここでは 3Dアセットとして 先ほどの地球儀を使用しています 3Dビューポートは非常に便利です 3Dモデルを様々な角度から確認し 実世界のオブジェクトと 一致しているかどうか確認できます 右下に表示されるスケールが オブジェクトの実寸と一致していることを 確認するのが良いでしょう
プロジェクトに複数のオブジェクトを追加して トラッキングすることもできます 先ほど示した例と同様です 左側のメニューのの横の アイコンをクリックして 別のUSDZアセットをインポートするだけです モデルのトレーニングの開始前に必要な 構成のステップがもう1つあります アイテムに対する 最適な視野角の選択です これにより オブジェクトの種類や 典型的な空間での配置方法に応じて オブジェクトトラッキングの体験を 最適化できます 例えば 静止オブジェクトの多くは 直立した状態や 正面からしか見られない場合があります この情報を活用して 機械学習のトレーニングを行うことで 高品質なトラッキングを実現できます 選択できる視野角のカテゴリは の3つです 1つずつ詳しく確認しましょう 3Dビューポートの下に 視野角の選択セクションがあります 先ほど追加した地球儀のアセットの 実物を見てみましょう ご覧の通り スタンドがついており 重力と一致しない軸で回転させることが できるのがわかります 地球儀はあらゆる角度から見るものなので 構成ビューではを選択します このオプションを使用する場合 トラッキングの品質を高めるためには どの角度から見ても オブジェクトの外観が 異なっていなければなりません 別のアイテムを見てみましょう 顕微鏡は通常 平面上に置かれ 重力と一致していることが想定されます そのためを選択します この場合 下からの視野角は除外されます 最後に 3つ目の オシロスコープを見てみましょう このオブジェクトも 平面上に立っていると想定しますが 背面からの視野角は トラッキングする必要がないので を選びます このモードでは 背面と下からの視野角は除外され オブジェクトトラッキングの対象は 空間体験において重要な部分に制限されます
ご覧のように 3Dビューポートには 地面と背面が表示され 3Dモデルの上方向と前方向を指す 2本の軸が延びています 3Dモデルの向きが 後ろ向きなどに なっている場合は トレーニングを実行する前に Reality Composer Proを使用して 修正することができます 以上で構成が完了し トレーニングを開始する準備が整いました プロジェクトに戻り 左上のボタンをクリックするだけです すぐにトレーニングが開始され 進行状況バーでプロジェクトのステータスを 把握できます 参照オブジェクトのトレーニングは 数時間かかることがあります 正確な所要時間は Macの構成によって異なります なお トレーニングはAppleシリコン搭載の Macでのみサポートされています
トレーニングが完了したら タブに移動して 生成された参照オブジェクトを保存します
Create MLアプリはXcodeの メニューにあります Create MLは幅広いタスクに対応しており オブジェクトトラッキング以外の 機械学習モデルもトレーニングできます Create MLについて詳しく知りたい方は 「What’s new in Create ML」を ご覧ください 次に この参照オブジェクトに バーチャルコンテンツをアンカーする方法です トラッキングされたオブジェクトを使用して イマーシブ体験を構築する方法は 複数あります Reality Composer Proを使用して バーチャルコンテンツをアンカーしたり 新しいRealityKit APIやARKit APIを 使用することもできます 私はReality Composer Proで 制作プロセスを始めるのが好きです バーチャルコンテンツを 直感的な方法で編集して配置できるからです
まず visionOSアプリのテンプレートから Xcodeの新規プロジェクトを作成します
自動的にデフォルトのシーンが作成され Reality Composer Proで 開くことができます Reality Composer Proに切り替えます 先ほどと同じデフォルトのシーンがあり デフォルトの球形は削除できます
このシーンではまず 空のTransformエンティティを作成して Anchoringコンポーネントを追加します
このエンティティが オブジェクトアンカーのコンテナになります オブジェクトトラッキングを スムーズに行えるよう 新たに導入された Objectというターゲットを選択します
次に Create MLで作成した 参照オブジェクトをインポートし 先ほどのAnchoringコンポーネントに 関連づけます
この例では Reality Composer Proを使用していますが RealityKit APIを使用して Anchoringコンポーネントを 実行時に作成することもできます 次に進みましょう ビューポートには 視覚的なガイドとして 元のUSDZモデルが半透明で表示されます このガイドは ターゲットオブジェクトの特定の部分に コンテンツを正確に配置する 必要がある場合に 特に役に立ちます 先ほどの地球儀の体験で使用したシーンを 見てみましょう この例でイマーシブな効果を出すために どのような設定を行ったか ご説明します
地球儀から直接スペースシャトルが 発射されたのを覚えていますか? 実は 発射地点として 特定の場所を選んでいます フロリダ州のケープカナベラルです
ビューポートの視覚的なガイドを使用すると このスポットを地球儀上で簡単に見つけて スペースシャトルのエンティティを 設定できます もう1つのイマーシブな効果として バーチャルな月と宇宙ステーションが 地球儀の裏に回ると 見えなくなりました どのように消失させたのかを 見てみましょう 月と宇宙ステーションに タイムラインアニメーションを使用して 地球儀の周りを周回するように 設定しています このシーンでは 別のUSDZの 地球儀エンティティを 子ノードとして アンカーエンティティにアタッチし 遮蔽物となる図形として使いました オブジェクトトラッキングは 親の アンカーエンティティの変換を更新するため これにより 遮蔽物が 実物の地球儀と同じ場所に配置されます この部分では ShaderGraphエディタを使用して USDZの地球儀エンティティに 遮蔽用のマテリアルを適用できます これで 周回するオブジェクトが地球儀の 裏に回ると姿を消すようになります
最後に 遮蔽物となるこのエンティティに タップジェスチャを追加し Behaviorsコンポーネントを使用して 2つの体験が切り替わるようにしました ここまでで構築したものを Apple Vision Proで確認してみましょう タップすると 最初のアニメーションが 始まり 周回するオブジェクトが出現して 地球儀の裏に回ると姿を消します
いいですね! 2つ目のアニメーションはどうでしょう もう一度タップすると こちらも想定通りにうまくいきました すべて順調ですが 現時点では この体験を開始する方法がわかりません 特に 初めてのユーザーはどのオブジェクトを 探せばいいか分からないでしょう これを改善するために コーチングUIをアプリに追加して ターゲットオブジェクトの プレビューを表示し オブジェクトトラッキングによって 検出される時点まで表示し続けます また 地球儀とインタラクションする方法を 示すためにバーチャルラベルも追加しました RealityKit APIには これらすべてと さらに様々なことを実現するための 広範なツールセットが備わっています コーチングUIを実装する手順を説明します まず プレビュー用の3Dモデルを表示して 空間内の適切なオブジェクトを 見つけやすくします コーチングUIは アンカーの状態の変化に 反応する必要があるので アンカーの状態をコードで確認します オブジェクトトラッキングが開始されたら 表示された3Dモデルが アンカーエンティティの位置まで 移動する様子を トランジションで示します その後 地球儀をタップするように 指示する バーチャルラベルを追加します このサンプルコードは コーチングUIでターゲットオブジェクトの 3Dモデルを表示する方法を示すものです ARKit APIを使用して 参照オブジェクトファイルから 3Dモデルを取得し ほかのモデルエンティティと同様に USDZファイルを読み込みます プレビュー用のエンティティであることが わかるように 不透明度を50%に設定しました 最後に エンティティを シーンに追加して表示します
オブジェクトがトラッキングされているか 確認するために まず Reality Composer Proで作成済みの オブジェクトのアンカーエンティティを 見つけます 次にupdateループ内で エンティティの isAnchoredフラグのステータスを調べて 両方のケースでの表示内容を決定します トランジションのアニメーションでは オブジェクトのプレビューはトラッキング 開始後 対象のオブジェクトに向かって 移動するようにします そのためには アンカーの 変換データの取得が必要です SpatialTrackingSessionを使用して 適切な認証をリクエストします 認証後 オブジェクトアンカーの Transformにアクセスして Transformを使用する アニメーションを実装します
最後に 地球儀の近くに 体験を開始する方法を記載した バーチャルラベルを追加します RealityViewアタッチメントを使うと RealityKitのアンカーエンティティに SwiftUIの要素を簡単に配置できます まず RealityViewの下の attachmentsセクションで SwiftUIの要素を定義します これで sceneの設定で このUIエンティティを見つけて Reality Composer Proで定義した 参照Transformの子ノードとして追加できます ここまで追加した部分を Apple Vision Proで確認しましょう 地球儀が検出されていない時点では アプリがターゲットオブジェクトの プレビューを表示し 何を探せばよいか案内してくれます トラッキングが開始されると プレビューがターゲットオブジェクトに 向かって移動して ユーザーの視線を導き 体験の開始方法を表示する バーチャルラベルが表示されます うまくいきましたね! さて ここでまとめましょう
オブジェクトトラッキングのための 新しいARKit APIが 今年リリースされます 先ほどご覧いただいたように このAPIでは トラッキングされたオブジェクトの バウンディングボックスや 対応するUSDZファイルにアクセスできます このAPIは オブジェクトにおける トラッキングへの準備状況や 問題の有無に関する 詳細な情報を提供してくれるので 問題などのイベントが発生しても アプリが適切に対応できます APIに加え オブジェクトトラッキングの サンプルアプリも公開されます ぜひダウンロードして デバイスで試してみてください 詳細については 「Create enhanced spatial computing experiences with ARKit」をご覧ください 以上 visionOSでのオブジェクト トラッキングについて説明しました 空間コンピューティングでは 実世界の アイテム上へのバーチャルコンテンツの 正確な配置が必要であり オブジェクト トラッキングはこの分野を進化させます 本セッションでは この新しい技術で 何を実現できるかご紹介しましたが ご紹介したのはほんの数例にすぎません Reality Composer Proと RealityKitには ご紹介した例に留まらない 優れた空間体験を構築するための 素晴らしい機能が多数備わっています これらに関するセッションで ぜひ詳細を学んでください みなさんが どのようなアイデアやオブジェクトに 命を吹き込むか チーム一同 楽しみにしています
-
-
13:55 - Coaching UI - display object USDZ preview
// 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!) } } }
-
14:13 - Coaching UI - check anchor state
// 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 } } } } } }
-
14:31 - Coaching UI - Transform space with SpatialSession
// 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 ... } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。