ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Object Captureのエリアモードの紹介
Object Captureのエリアモードは、Object Captureの機能を拡張してエリアのキャプチャと再構成をサポートすることで、iOS上で新しい3Dキャプチャ機能を利用できるようにします。再構成用の新しいmacOSサンプルアプリを使用して、iOSキャプチャの質を最適化する方法を説明します。また、Apple Vision Pro、iPhone、iPad、Macで、Quick Lookを使用して最終結果を確認する方法もご紹介します。独自のイメージ処理パイプラインを作成できる新しいAPIなど、強化された3D再構成の機能も見ていきます。
関連する章
- 0:00 - Introduction
- 2:41 - iOS API
- 4:24 - macOS sample
- 6:23 - Data Loading API
リソース
関連ビデオ
WWDC24
WWDC23
-
ダウンロード
こんにちは Object CaptureチームのZachです このセッションでは 3D再構成の柔軟性と 品質を高める 様々なアップデートを紹介します 以前に iOS上で動作する Object Captureを紹介しました これは デバイス上で3Dモデル全体を 再構成できるガイド付きキャプチャUIです Object Captureが最もうまく機能するのは 移動可能なオブジェクトが 管理された室内環境に置かれ 自由に歩き回って あらゆる角度から撮影できる場合です 例えば この花瓶の場合 横に倒して底面をスキャンすると 優れたキャプチャ結果が得られます Object Captureを使用すると 美しい完全なオブジェクトを作成できます しかし バウンディングボックスでは キャプチャが困難なオブジェクトもあります
そこで エリアモードを導入しました
エリアモードでは 起伏のある野外の地形 全体を確認できないオブジェクト 2.5次元の面などを 容易にキャプチャできます エリアモードで作成したモデルは Apple Vision Proによる3D環境や 美術プロジェクトに最適です では 実際に見てみましょう 野外でのアドベンチャーで 自然の豊かなテクスチャや3D形状を キャプチャできるのは素晴らしいことです まず サンプルアプリを開いて エリアモードを選択します 被写体にカメラを向けて をタップします 触覚的なタップを感じ 音が鳴り
画像が撮影されるとキャプチャプレビューに パルスが表示されます 周囲に注意を払いながらゆっくりと移動し キャプチャされた複数の画像が 互いに重なるようにしてください
レチクルはブラシのように機能し 表面に沿って移動させ 細かい部分をすべて描画できます 被写体が近すぎたり遠すぎたりすると レチクルが表示されなくなります 最良の結果を得るには カメラが 被写体の各面と平行になるように撮影します
撮影が終わったら 新しいカメラポーズの可視化機能を使用し 画像をキャプチャした場所を確認できます これにより現場で必要なすべてのデータが 得られたことを確認できます 最後にを選択して iPhone上で直接3Dモデルを作成します
すでによくできているように見えますが さらに高品質にする方法を 後ほど紹介します
このアプリのソースコードを ダウンロードして 自分で試したり これをもとに 独自のアプリを作成したりできます エリアモードは 創造性の新たな可能性を開き 誰でも美しい3Dシーンを 作成できるようにします
サンプルアプリでObject Captureの エリアモードのデモをお見せしました では 今年のエキサイティングな 新機能をすべて紹介しましょう まず Object Captureのエリアモードを 統合する方法について説明します つづいて より高品質な再構成を得るための macOSサンプルアプリを紹介します 最後に 実際のユースケースに適した 高い柔軟性を実現する 新しいData Loading APIを取り上げます 新しいiOS APIから始めましょう
まず Object Captureで 最良の結果を得るための 考慮事項を確認します エリアをキャプチャする時は 強い影のない拡散光を目指してください 屋外では 曇りの日や 完全に日陰になる場所が最適です 規則的なルートでゆっくりと移動し 重複する特徴を十分に持つクリアな画像 撮影できるようにします また 異なる高さから被写体の周囲を 回りながら撮影し あらゆる角度が見えるようにしてください 6フィートを超えるエリアの場合 Macで高精細処理しない限り メッシュや テクスチャの品質が低下することがあります
Object Captureは iPad Pro 2021 iPhone 12 Pro およびこれ以降のモデルで利用可能です では アプリにエリアモードを 組み込む方法を見ていきましょう 昨年は オブジェクトの検出と バウンディングボックスの設定を開始するには startを呼び出してからstartDetectingを 呼び出す必要がありました このボックスを設定した後 startCapturingを呼び出して キャプチャプロセスを開始します エリアモードでは 設定すべき 新しい呼び出しも構成もありません いたって簡単です startDetectingの呼び出しを省略して そのままstartCapturingへ進みます これにより ご覧のように 新しいUIによるエリアモードが始まります エリアモードにはバウンディングボックスの 検出ステップがないので 移行を円滑にするため オブジェクトのレチクルフレームを オフにすることをお勧めします 使用するモードを事前に 把握できるというメリットもあります その方法をご覧に入れます 新しいhideObjectReticleモディファイアを ObjectCaptureViewに追加し ボタンのタップで エリアモードになることを示します これで 円滑な移行によって エリアモードになったことが UIに適切に示されます
では MacでObject Captureの 新機能を見ていきましょう Macでの処理では 多くのオプションと高い品質により キャプチャした画像を最大限に活用できます 新しいサンプルアプリを使えば 簡単に始められます このアプリはシンプルなUIを備え 各種3Dモデルの作成をガイドします まず 先ほどキャプチャした 画像のフォルダを選択しましょう モデルに名前を割り当て 最終的なモデルの保存先を選択します
モデルのタイプとして 三角形メッシュ または今年追加された 四角形メッシュを選択できます Object Captureモデルで この新しい出力タイプを使用すると さらなるクリーンアップ 最適化 アニメーション化を どのツールでも実行できます
これは三角形メッシュと 四角形メッシュの比較です これにより UVの編集や3Dオブジェクトの アニメーション化が容易になり 後工程で使いやすい適切なエッジループを このアルゴリズムで作成できます 四角形メッシュに加え 最大16Kテクスチャの カスタム詳細レベルを 設定できるようになりました
大規模なシーンで大きな違いが生まれ VFXなどのオフラインレンダリングで 効果を発揮します
16Kテクスチャに加え サポート対象の画像も増えたことで より大きなエリアを これまで以上の高品質で処理できます 大容量のユニファイドメモリ搭載のMacでは 最大2,000枚の画像を処理できます
ここで 環境を含むように設定し 画質としてを選択します
これで処理を開始できます
この処理が終了した後 野外で撮影した 別の画像を使用して同じ手順を繰り返します こちらが完成モデルです トリミングして 少し編集し Apple Vision Proで 使用できるようにしてあります 詳しくは Scottのセッション 「Optimize your 3D assets for spatial computing」をご覧ください
別の編集を適用し Reality Composer Proで 各アセットを組み合わせています これで Apple Vision Proのクイックルックで リアルに表示されるはずです 大好きなトレイルにまた行くことを 思い出させてくれる 素敵な記念品です
では 今年追加された 新たな データ読み込み機能の説明に移りましょう
キャプチャの背景を制御できない場合や それが動的に変化する場合は 画像ごとにマスクを適用して 再構成が必要な フォアグラウンドのピクセルと 再構成が不要な バックグラウンドのピクセルを指定します この例では 手が動いて ドラゴンフルーツの一部を覆っているため 自動セグメンテーションで アーティファクトが生じることがあります この問題は 再構成に効果的なマスクを 追加することによって解決できます
例えば 手を除外する ビットマップマスクを サンプル画像ごとに作成したとします これらを再構成に適用するには? PhotogrammetrySessionを使用して 画像からモデルを再構成します セッションを作成するための 入力ソースは2つあります 画像のフォルダと PhotogrammetrySampleのシーケンスです このカスタムビットマップについては 再構成で使用するサンプルに マスクを追加する 独自のシーケンスを作成できます サンプルにはいくつかの プロパティを指定できます 最も重要なのはRGB画像データです その他 距離を復元するための深度マップ 垂直方向を示す重力ベクトル 付加情報の メタデータディレクトリがあります もちろん ここで用意するオプションの オブジェクトマスクもあります それ以外のデータもすべて サンプルに維持しようと思います これまでは これらすべてを手作業で 読み込む必要があり 極めて複雑な作業でした 今年は PhotogrammetrySample向けに 新しい読み込みAPIを導入することで これをシンプルにしています このAPIは 読み込む画像ファイルを 取得し そのすべての データプロパティに値を割り当てます DSLRで撮影したJPEGであれば 画像が読み込まれるだけですが Object CaptureのUIから得られた 画像の場合は 深度データと重力も読み込まれます 同期バージョンと非同期バージョンの 両方を用意している点に注目です SwiftUIのインスペクタのように 非同期処理が必要な場合を考慮して 非同期バージョンを提供しています 一方 この後ご覧いただくように フォトグラメトリセッションでは 同期バージョンが必要です
ここでは 簡単な関数を作成しています 画像のURLを取得して 目的の画像のデータを収めた PhotogrammetrySampleと 既に読み込んでサンプルに付加した オブジェクトマスクを返します ここで 新しいAPIを呼び出しています 新しい同期イニシャライザを使用して 画像ファイルを読み込みます 実行に成功すると 画像のすべてのデータを収めた PhotogrammetrySampleが得られます
次に 事前に画像ファイルごとに 作成して保存済みの オブジェクトマスクを 読み込むヘルパー関数が あるとします このマスクを読み込んで objectMaskプロパティに割り当てます
実行するとサンプルが返されます 最後に 読み込み中に 何らかの問題が発生し エラーがスローされた場合は nilを返すだけとします この処理方法は後ほど説明します
サンプルを読み込み カスタムマスクを 追加できるようになったので このサンプルをシーケンスに配置して カスタムのフォトグラメトリセッションを 作成します
再構成で使用するすべての画像の URL配列を受け取るとします ここで必要な処理は この配列に 新しいloadSampleAndMask関数をマップして セッションへの入力として使用できる 遅延シーケンスを作成することだけです ここで注意点がいくつかあります まず この配列を遅延型にして すべての画像を一度に メモリへ読み込まないようにします つまり シーケンスごとに セッションが一度に1つずつ 読み込まれるようにします 次に mapではなく compactMapを使用します CompactMapでは nilである要素がすべて無視されます nilは ファイルを 読み込めなかったことを意味します このシーケンスを入力として使用し 再構成のリクエストを 通常どおりに処理する セッションのみが返されます これで完了です 希望どおりの再構成が得られました オブジェクトが手で覆われた時に 発生するアーティファクトも回避しています これまでは 深度マップなどの データの読み込みに 数百行の複雑なコードを要しましたが PhotogrammetrySample向けの 新しいイニシャライザを 使用すれば 数行のコードで処理できます 既存のデータプロパティの読み込みの他 ObjectCaptureSessionのキャプチャUIで 保存したデータを読み込み可能にする 新しい読み取り専用プロパティを いくつか用意しています これらは インスペクタのUIや 独自のカスタム 再構成パイプラインで有用です 各プロパティの詳細は それぞれのドキュメントをご覧ください ここでは 重要な1つの 追加点にだけ触れておきます 撮影用のカメラのデータです 独自のバックエンド再構成パイプラインを 作成するためや データキャプチャの高度な可視化を 実現するために このデータの使用をお考えの場合 ObjectCaptureSessionで キャプチャした画像には 撮影用のカメラトランスフォームが サンプルごとに用意されます 可能であれば 内部パラメータ行列と カスタムパイプラインで必要な キャリブレーションのデータも提供します データ読み込みAPIは フォトグラメトリセッションの作成に これまで以上の柔軟性を付加すると同時に 新しい可視化とカスタムパイプラインに 多くの可能性をもたらします
Object Captureについては以上です iOSでのエリアのキャプチャ Macで利用可能なすべての オプションによる処理 Apple Vision Proでの 画像表示について説明しました Object Captureと 3Dモデルの最適化について詳しくは こちらのセッションをご覧ください 皆さんの成果を楽しみにしています
-
-
8:19 - Data Loading API - load Sample and Mask
func loadSampleAndMask(file: URL) -> PhotogrammetrySample? { do { var sample = try PhotogrammetrySample(contentsOf: file) sample.objectMask = try loadObjectMask(for: file) return sample } catch { return nil } }
-
9:15 - Data Loading API - create custom photogrammetry Session
func createCustomPhotogrammetrySession(for images: [URL]) -> PhotogrammetrySession { let inputSequence = images.lazy.compactMap { file in return loadSampleAndMask(file: file) } return PhotogrammetrySession(input: inputSequence) }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。