ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Object Captureによる3Dコンテンツの作成
"Object Captureは、わずか数枚の画像を使って実世界のオブジェクトのリアルな3Dモデルをすばやく簡単に作成する方法を提供します。macOSのフォトグラメトリ技術によってアセットを現実のものにする方法について確認します。また、最高品質の結果を得るために、どのようなオブジェクトを選択し、どのように画像をキャプチャしていくのかといったベストプラクティスについても紹介します。 "
リソース
- Capturing photographs for RealityKit Object Capture
- Creating 3D objects from photographs
- Creating a Photogrammetry Command-Line App
- Explore the RealityKit Developer Forums
- PhotogrammetrySample
- PhotogrammetrySession
- Taking Pictures for 3D Object Capture
関連ビデオ
WWDC22
WWDC21
-
ダウンロード
♪ (Object Captureによる 3Dモデルの作成) こんにちは! 私はマイケル・パトリック ・ジョンソンです Object Captureチームの エンジニアです 今日は 同僚の デイブ・マッキノンと私で macOSの新しい フォトグラメトリAPIを使って 現実世界のオブジェクトを3D モデルに変換する方法を紹介します 当社のARKitおよびRealityKit フレームワークを使用して 拡張現実Appを作成することに すでになじみがあるかもしれません また Reality Composerや Reality Converterを使用して AR用の3Dモデルを作ったことが ある方も多いのではないでしょうか Object Capture API を使うと 現実の物体の画像を 簡単に 精密な3Dモデルに 変換することができます 例えば キッチンのテーブルの上に 焼きたてのピザが あるとします おいしそうでしょう? 手前のピザを3Dモデルとして キャプチャしたい とします 本来ならば プロのアーティストに依頼して 何時間もかけて形状やテクスチャ をモデリングする必要があります でも 待ってください! 自分のオーブンで焼くのに 数分しかかかりませんでしたよね Object Captureでは まず対象物を あらゆる角度から 撮影します 次に 新しい Object Capture APIに対応した Macに画像を コピーします フォトグラメトリと呼ばれる コンピュータビジョン技術 を用いて 2D画像のスタックを わずか数分で 3Dモデルに変換します 出力されたモデルには ジオメトリックメッシュと 様々なマテリアルマップ が含まれており そのままAppに ドロップしたり AR Quick Lookで 確認したりすることができます では それぞれのステップを 少し詳しく見てみましょう まず 対象物を 全方向から撮影します 画像は iPhoneやiPad 一眼レフカメラ さらにはドローンでも 撮影できます 対象物の周りの あらゆる角度から 鮮明な写真を撮る必要があります キャプチャのための ベストプラクティスを セッションの後半で ご紹介します iPhoneやiPadで 撮影した場合は 対応機種のステレオ深度データ を利用して 実際の物体の大きさや 重力ベクトルを復元し モデルを自動的に 正立させることができます フォルダにキャプチャした 画像を格納したら それをMacにコピーして Object Capture APIを使って わずか数分で3Dモデルに することができます このAPIは 最近のIntelベースの Macでもサポートされていますが しかし Apple Neural Engine を利用して コンピュータビジョン アルゴリズムを高速化できるため 最新のApple Silicon Macで 最も高速に動作します コマンドラインAppのサンプル であるHelloPhotogrammetryも 提供していますので ぜひご利用ください 画像のフォルダに対し 直接使用することもでき コードを書く前に 自分でモデルを作ってみる ことができます 最後に USDZの出力モデルを Mac上で プレビューすることが できます 4つの詳細レベルで モデルを提供することができます 詳細は後ほど話しますが 様々なユースケース に合わせて最適化します Reduced MediumとFullの 3つのディテールは ここにあるピザのように 箱から 出すかのごとくすぐに使うことができます Raw はカスタムワークフロー での使用を想定しています Mediumの詳細レベルで USDZ出力を選択すると その新しいモデルを iPhoneやiPad上の AR Quick Lookで 見ることができます それだけで ARに最適化された 実物そっくりなオブジェクトを 手に入れることができるのです そういえば 先ほどのピザ を覚えていますか? 本当のことを 言わなければなりません この画像は 実際には写真ではなく 数枚のピザにObject Capture を使って 作成したものです これらのモデルは ポストプロダクションツールで このシーンに結合され レイトレーサーを使って 高度なマテリアルマップで レンダリングされました このように Object Captureは iPhoneやiPad上の AR Appから 映画用の制作アセットまで さまざまなユースケースに 対応しています このセッションでは Object Capture APIを 使い始める方法を ご紹介するとともに 最高品質の 結果を得るための ベストプラクティスを ご紹介します 「はじめに」では Object Capture APIについて 詳しく説明し Appを作成するために 必要なコードのコンセプト を紹介します 次に 画像のキャプチャ オブジェクトの選択 詳細レベルの選択の ベストプラクティスを説明します まずは macOSで APIを利用するための 基本的な手順を ご紹介します このセクションでは Object Capture APIの基本的な 構成要素と それらをどのように 組み合わせるかを学びます 例えば かっこいいスニーカーを 3Dモデルにして ARで 見られるようにしたいとします ここでは このセクションで紹介する 基本的なワークフローを 図解しています プロセスには大きく分けて 2つのステップがあります: セットアップでは オブジェクトの 画像のセットを指定します そしてプロセスでは 構築したいモデルの生成 を依頼します まず セットアップブロックに 注目します このブロックはセッションの作成と 関連する出力ストリームの接続 という2つのサブステップで 構成されています 有効なセッションがあれば それを使ってモデルを 生成することができます まず必要なのは PhotogrammetrySessionを 作成することです セッションを作成するために 対象物の画像を集めたフォルダ がすでにあると仮定します APIドキュメントには すぐに使い始められるように いくつかの画像キャプチャフォルダ のサンプルを用意しています PhotogrammetrySessionは APIのプライマリな トップレベルクラスであり 制御の中心となるものです セッションとは フォトグラメトリ アルゴリズムを適用して 3Dモデルを生成するための 固定された画像セットのコンテナ と考えることができます iPhone 12 Pro Maxで撮影した スニーカーの HEIC画像が 123枚あります 現在 使用する画像のセットを 指定する方法が いくつかあります 最もシンプルなものは 画像の ディレクトリへのファイルURLです このセッションでは これらを1つずつ取り込み 問題があれば報告します HEIC画像に深度データが 埋め込まれている場合は 自動的に そのデータを使用して 対象物の実際のスケールを 復元します 多くの方がフォルダ入力を 希望されると思いますが 高度なワークフローのために カスタムサンプルの シーケンスを提供する インターフェースも用意しています PhotogrammetrySampleには 画像に加えて 深度マップ 重力ベクトル カスタムセグメンテーションマスク などのオプションデータ が含まれています 入力ソースからセッションを 作成したら それを元にモデル再構築の リクエストを行います セッションでは 結果として得られたモデル と 出力メッセージストリームに ステータスメッセージが出されます さて セッションとは何かを 理解したところで APIを使ってセッションを 作成する方法を見てみましょう ここでは 画像のフォルダから セッションの 初期設定を行うコード を見てみましょう PhotogrammetrySessionは RealityKitフレームワーク に含まれています まず 入力フォルダを ファイルURLで指定します ここでは すでにローカルディスク 上にスニーカーの画像が入った フォルダがあると 仮定しています 最後に 入力ソースとして URLを渡して セッションを作成します イニシャライザは パスが存在しない場合や 読み取れない場合は エラーを投げます オプションで 高度な設定パラメータを 指定することもできますが ここではデフォルト値を 使用します それだけで セッションが成立します! セッションオブジェクトの 作成に成功したので メッセージが届いたときに 処理できるように セッションの出力ストリームを 接続する必要があります メッセージストリームが 接続されたら そのストリームに 現れるモデルを リクエストする方法を 見てみましょう 今年のSwiftの新機能である AsyncSequenceを使って 出力のストリームを 提供しています 出力メッセージには リクエストの結果や 進捗状況などの ステータスメッセージが含まれます 最初の プロセスコールを行うと 出力メッセージストリームに メッセージが流れ始めます セッションが存続している間は 出力メッセージシーケンス は終了しません このメッセージは セッションが 初期化されるか 致命的なエラーが発生するまで 出力され続けます では どのようなメッセージが 送られてくるのか 詳しく見ていきましょう リクエストが行われた後 各リクエストの完了した割合を示す requestProgressメッセージを 定期的に受信することが 期待されます Object Capture APIを呼び出す Appを作っている場合は これらを使ってリクエストごとに プログレスバーを駆動し ステータスを 示すことができます リクエストの処理が 完了すると モデルや 境界ボックスなどの 結果としてのペイロードを含む requestCompleteメッセージを 受け取ります 処理中に何か 問題が発生した場合は そのリクエストに対して requestErrorが出力されます 便宜上 processingCompleteメッセージは キューに入っている すべてのリクエストの処理が 終了したときに 出力されます ここまでで セッション出力ストリームの 概念を理解し 主要な出力メッセージを 見てきました では メッセージストリーム を処理する コードの例を 見てみましょう これができたらモデルをリクエスト する方法を見てみましょう ここでは メッセージが届くと それを処理する 非同期タスクを作成する コードを紹介します たくさんのコードのように 見えるかもしれませんが ほとんどがご覧のように 単なる メッセージのディスパッチです ここでは「 for try await」の ループを使って session.outputsへのメッセージ を非同期的に繰り返しています コードの大部分は 出力メッセージの スイッチを入れる メッセージディスパッチャです 出力は異なるメッセージタイプと ペイロードを持つ列挙型です それぞれのケース文では 異なるメッセージを扱います それを見てみましょう まず プログレスメッセージ を取得したら その値を プリントアウトします 各リクエストにプログレス メッセージが出てるのがわかります 今回の例では リクエストが完了すると 結果のペイロードは モデルが保存されたURLを含む modelFileであることを 期待しています その方法については 後ほどご紹介します フォトグラメトリエラーにより リクエストが失敗した場合は 代わりにそのエラーメッセージ が表示されます プロセスコールからの リクエストの全セットが 終了すると processingCompleteメッセージ が生成されます コマンドラインAppの場合は ここでAppの終了するでしょう その他にも フォルダ内の画像が 読み込めなかった場合の警告など ドキュメンテーションに 記載されている ステータスメッセージが あります 以上でメッセージの 取り扱いについては終了です このメッセージ処理タスクは セッションが 存続している限り 非同期にメッセージを 繰り返し処理し続けます さて ワークフローのどこまで 進んでいるか見てみましょう セットアップの段階が 完了し セッションの準備が 整いました これで モデルを処理するための リクエストが可能になりました コードの説明に入る前に 考えられる様々なタイプの リクエストについて 詳しく見てみましょう セッションから 受け取ることのできる データタイプには ModelFile ModelEntity BoundingBox の3種類があります これらのタイプには modelFile modelEntity boundsという Request列挙型の ケースがあり それぞれ異なるパラメータを 持っています modelFileリクエストは 最も一般的なもので 基本的なワークフローで 使用するものです modelFileリクエスト を作成し 拡張子がUSDZの ファイルURLと詳細レベルを 指定するだけです インタラクティブな ワークフローで使用するための Optionalなジオメトリパラメータが ありますがここではそれは使いません より複雑なポストプロセッシング パイプラインでは USDAやOBJの 出力形式が必要な場合 代わりに 出力ディレクトリのURLと 詳細レベルを 指定することができます セッションでは そのフォルダに USDAとOBJファイルを テクスチャや マテリアルなどの 参照されるすべてのアセット と一緒に書き込みます また GUIを持つAppは RealityKitのModelEntity BoundingBoxを リクエストして インタラクティブなプレビューや 改良を行うことができます modelEntityの リクエストには 詳細レベルとOptionalな ジオメトリを受け付けます boundsリクエストは オブジェクトの 推定のキャプチャボリューム BoundingBoxを返します このボックスはUIで 調整することができ その後の 再構成ボリュームを調整する リクエストのgeometry引数に 渡すことができます どのように機能するかはセッション の後半で少し見てみましょう また ほとんどのリクエストは 詳細レベルも受け付けます Previewレベルはインタラクティブ ワークフローのみを意識したものです 映像の質は非常に低いですが 最も早く作成されます プライマリな詳細レベルは 画質とサイズが 大きくなるにつれて Reduced MediumとFull となっています これらのレベルはすべて すぐに使用することができます さらに Rawレベルは プロ用に提供されており 正確な使用のためにポストプロダクション のワークフローが必要です これらについては ベストプラクティスのセクション で詳しく説明します さて どのようなリクエストが できるかを見てきましたが コードでどのように行うか を見てみましょう ここでは 1回の呼び出しで 2つのモデルを同時に生成し それぞれに異なる 出力ファイル名と詳細レベルを 設定する方法を説明します ここで セッションでの最初の プロセス呼び出しを見てみましょう リクエストの配列を受け取る ことに注意してください このようにして一度に2つのモデル をリクエストすることができます 1つのモデルを詳細レベルをReducedに もう1つのモデルはMediumに それぞれ別のUSDZファイル に保存します Object Captureに 必要な詳細レベルを1度のコール で同時に要求すると エンジンが計算結果を 共有することができ 続けて要求するよりも すべてのモデルを早く作成 することができます すべての詳細レベルを一度に 要求することもできます プロセスは出力場所が書き込めない などのリクエストが無効な場合は 直ちにエラーを 投げます このコールはすぐに返され すぐにメッセージが 出力ストリームに現れ始めます 以上で 基本的なワークフロー は終了です! 画像でセッションを作ります 出力ストリームを接続して モデルをリクエストします 各モデルの処理時間は 画像数や画質レベルによって 異なります 処理が完了すると モデルが利用可能 であることを示す 出力メッセージが 表示されます 作成したスニーカーの USDZファイルをMacですぐに開き 底面を含む あらゆる角度から3Dで 結果を確認する ことができます この後のセッションでは 1回の撮影で 対象物のすべての面をカバーし 複数の撮影を 組み合わせる必要がない 方法を紹介します いい感じになってきましたね ここでは 基本的なワークフローを 見ていただいたので Object Capture APIが サポートしている より高度な インタラクティブワークフロー の概要を説明します このインタラクティブな ワークフローは 最終的な再構築の前に プレビューモデルで いくつかの調整を行うことができる ように設計されており ポストプロダクションでの モデル編集が不要になり メモリの使用量も 最適化されます まずこのワークフローの両端にある セットアップステップと プロセスステップは 以前と 同じであることに注意してください 同様にセッションを作成し 出力ストリームを接続します また 最終的なモデルのリクエスト も従来通り行います しかし真ん中にブロックを追加して プレビューモデルを インタラクティブに 編集するための 3D UIを表示することに 注目してください このプロセスは プレビューに 満足するまで繰り返し行われます その後 以前と同様に 最終的なモデルリクエストを 行うことができます 最初にプレビューモデルを リクエストするには 詳細レベルがプレビューの モデルリクエストを指定します プレビューモデルは 視覚的には品質が低いですが 可能な限り迅速に 生成されます モデルファイルを要求して 自分で読み込むことができます またRealityKitのModelEntityを 直接リクエストして表示も可能です 一般的にはキャプチャボリュームを プレビューして 編集するためのバウンド リクエストも同時に行われます キャプチャボリュームを 調整することで キャプチャ内の不要なジオメトリを 削除することができます キャプチャ時にオブジェクトを 直立させるために 必要な台座など がそうです また ルートトランスフォームを 調整することで モデルの拡大・縮小 平行移動 回転が可能です 先ほどのリクエストの ジオメトリプロパティでは モデルが生成される前に キャプチャボリュームと 相対的なルートトランフォームを 指定することができます これで すぐに使える 3Dモデルが出力されます このプロセスを 実際に見てみましょう ここでは このインタラクティブな ワークフローを実演するために APIを使って作成した インタラクティブなObject Capture Appの例を紹介します まず 装飾用の 石の画像が入った 「Images」フォルダと 最終的に USDZが書き込まれる 「output」フォルダを 選択します そしてプレビューをクリックして プレビューモデルと 推定のキャプチャボリューム をリクエストします しばらくすると 私たちの岩石の プレビューモデルとそのキャプチャ ボリュームが表示されます しかし あたかも下の部分が 地下にあるかのように 岩の上部分だけを 出力したいとします モデルの下の部分を 再構築しないように バウンディングボックスを 調整することができます 満足のいく結果が 得られたら 「Refine Model」をクリックして この修正された キャプチャーボリュームに限定した 新しいプレビューを作成します また この部分だけに 出力モデルを最適化します リファインされたモデルができると 新しいプレビューが表示されます 新しいモデルのジオメトリが ボックス内に収まるように クリップされているのが わかります 対象物を支える台座など キャプチャ内の 不要なものを 取り除くのに便利です トリミングされたプレビュー に満足したら Full 詳細レベルの 最終レンダリングを選択でき そこで作成プロセスが 開始されます しばらくすると Full 詳細レベルのモデルが完成し プレビューモデルと 入れ替わります これで 実際のFull 詳細レベルの モデルを見ることができ とてもいい感じです モデルは出力ディレクトリ に保存され 追加のポストプロセッシングを することなく すぐに使用できます 以上 新しい Object Capture APIの 使い方を ご紹介しました ここでは 画像のフォルダなどの 入力ソースから セッションを作成する方法 を紹介しました 非同期出力ストリームを 接続して メッセージを送る方法を 見ました そして 2つの異なる詳細レベルの モデルを同時にリクエスト する方法を見ました 最後に ObjectCapture用の RealityKit GUI Appの例を挙げて インタラクティブな ワークフローを説明しました ここからは 同僚の デイブ・マッキノンに引き継いで Object Captureのベスト プラクティスを説明してもらいます ありがとう マイケル こんにちは 私はエンジニアの デイブ・マッキノンです Object Captureチームに 所属しています 次のセクションでは 最高品質の結果を得るための ベストプラクティスを 紹介します まずは 適切な特性を持った 対象物を選ぶための コツやポイントを ご紹介します 続いて 環境条件やカメラを どのようにコントロールすれば 最高の結果が 得られるかを説明します 次に CaptureSample Appの 使い方を説明します このAppでは 深度データや 重力情報とともに 画像を撮影することで 対象物の本当の大きさや向きを 復元することができるのです このAppを使って 手持ちでの撮影と ターンテーブルでの撮影の 両方を説明します 最後に ユースケースに適した出力の 詳細レベルを選択する 方法を説明し さらに詳しい情報を得るための リンクを紹介します スキャンを行う際に 最初に考慮すべきことは 適切な特性を持った 対象物を選ぶことです そのためには 適切なディテールのテクスチャを持つ 対象物を選ぶことです テクスチャのない部分や 透明な部分が 含まれている場合 スキャン結果がディテール不足 になることがあります さらに反射率の高い部分を 含むオブジェクトは 避けるように してください 被写体が反射している場合は スキャン時に照明を 拡散させることで 最良の結果が得られます キャプチャ中に対象物を 反転させる場合は 形状が変わらない硬いものであること を確認してください 最後に 表面の細かい ディテールを含む物体を スキャンしたい場合 そのためには 高解像度のカメラを 使用することに加えて ディテールを知るために 表面のクローズアップ写真を 多数用意する必要があります ここでは典型的なスキャンプロセス を紹介します まず コツとしては 被写体をはっきりと 浮かび上がらせるために 背景には何もない状態で 配置することが効果的です 基本的なプロセスは 対象物の周りをゆっくりと移動し すべての面から均一に 撮影することです 対象物の下部を 再構成したい場合は 反転させて 撮影を続けてください 撮影の際には 被写体が写っている部分が 視野の中で 最大になるようにします APIによって 可能な限り ディテールを回復することができます そのためには対象物の大きさや向き に応じて ポートレートモードや ランドスケープモードを使い分ける のも一つの方法です また 画像間の重なりを 高く保つようにしてください 対象物にもよりますが 20~200枚程度の 接写画像で 十分な効果が得られます iOSで深度や重力データとともに 高品質な写真を 撮影するために 私たちは CaptureSample App を提供しています これは自身のAppのための 出発点として利用することができます SwiftUIで書かれており 開発者向けドキュメントの 一部を担っています このAppでは Object Capture用の 高品質な写真を撮影する方法 を紹介しています マニュアルと時間調整できる シャッターモードを備えています Appを修正してターンテーブル と同期させることもできます デュアルカメラを搭載した iPhoneやiPadを使って 深度データを撮影し 出力されたHEICファイルに そのまま埋め込む方法を 紹介しています また 重力データを保存する方法 も紹介されています ギャラリーを見て 深度や重力データのある 良質な写真かどうか をすぐに確認し ダメな写真を削除する ことができます キャプチャフォルダはAppの ドキュメントフォルダに保存され iCloudやAirDropを使って 簡単にMacにコピーできます また ヘルプ画面では このセクションでご紹介する キャプチャをうまく行うための ベストプラクティスのガイドライン がまとめられています この情報は 開発者向けの ドキュメントにも 記載されています できるだけ良い結果を 得るために ターンテーブルキャプチャ をお勧めします 始めるためには ここにあるような セットアップが必要です これにはキャプチャ用の iOSデバイスが含まれています デジタル一眼レフカメラ 被写体を回転させる 機械式ターンテーブル ライトテントに加えて 照明パネルも使用できます 目標は 均一な照明で きつい影が出ないように することです そのためには ライトテントが良いでしょう この場合 CaptureSample Appは ターンテーブルの動き に同期した 時間調整できるシャッターモード で画像を撮影します また 対象物を反転させて複数の ターンテーブルパスを行い 対象物を全方向から撮影する ことも可能です ターンテーブルのキャプチャで 結果として得たUSDZファイルを macOSのPreviewで 表示してみました さてここまでは画像撮影のコツや ポイントを紹介してきましたが 最後のセクションで 正しい出力の選び方を 紹介します スキャンに利用出来る さまざまな出力の 詳細設定が可能です では見てみましょう 以下は 詳細レベルを 示す表です サポートされているレベルは 左側に表示されます ReducedとMediumはWebベースや モバイルでの使用に 最適化されています AR Quick Lookでの 3Dコンテンツの閲覧などです トライアングルや マテリアルチャンネルの 数が少ないため メモリの消費量も 少なくて済みます コンピュータゲームやポスト プロダクションのワークフローなど FullとRawは高性能でインタラクティブな 用途を想定しています 最高の 幾何学的ディテールを持ち ベークした素材と ベークしていない素材を柔軟に 選択することができます ReducedとMediumの詳細レベルは モバイル端末で表示したい コンテンツに最適です この場合 Object Captureは Rawの成果から幾何学的な情報や マテリアルの情報を圧縮し AR Appや AR Quick Lookでの 表示に適したレベルにします ReducedとMediumの 2つの詳細レベルには ディフューズ ノーマル アンビエントオクルージョン PBRマテリアルチャンネル が含まれています 1つのスキャンを 高精細に表示したい場合 Mediumはファイルサイズに対して 画質を最大化し より幾何学的なディテールと物質的 なディテール両方を表示します ただし 同じシーンで 複数のスキャンを 表示させたい場合は 詳細設定で Reduced にしてください Object Captureを使って モバイルやWebの AR体験を作る方法について 詳しく知りたい方は AR Quick LookとObject Captureの融合 のセッションをご覧ください Full 出力レベルでの 書き出しは プロのワークフローには 最適な選択です この例では スキャンのための 最大限の詳細を 得ることができます Fullは スキャンの ジオメトリを最適化し ディフューズ ノーマル アンビエントオクルージョン のラフネス 変位の情報を含む PBRマテリアルに ディテールをベークします この出力レベルであれば 難易度の高いレンダリングにも 十分対応できると 考えています 最後に マテリアルベイクが 必要ない場合や 独自のパイプラインを 持っている場合には Rawレベルでは さらなる処理のために 最大ポリカウントと 最大ディフューズテクスチャの ディテールが返されます macOSでの プロのワークフローに Object Captureを使う方法を 詳しく知りたい方は 「USDによる3Dワークフロー の作成」をご覧ください 最後になりましたが 最も重要なことは スキャンをiOSとmacOSの 両方で使用したい場合は 複数の詳細レベルを 選択することができ 現在および将来の ユースケースに適した あらゆる適切な出力を 確認することができます そして これで終わりとなります ここで 私たちが学んだことを 振り返ってみましょう まず Object Capture APIの 主なコンセプトを 例を挙げて 説明しました Object Captureセッション を作成し このセッションを使用して 収集した画像を処理して3Dモデル を作成する方法をご紹介しました APIがインタラクティブな プレビューAppに対応し キャプチャボリュームや モデルトランスフォームを 調整できる例をご紹介しました 次に スキャンのベストプラクティス について説明しました どのような被写体を 使えばよいか 最適な結果のための撮影環境や照明 カメラの設定などを お話ししました 最後に Appに適した 出力詳細設定の選び方について 説明しました Object Captureを自分のAppに 導入する方法を知りたい方は こちらをご覧いただき iOSのキャプチャとmacOSのCLI 処理Appの両方をチェックして 始めてみてください これらのAppには ベスト・ プラクティスを1つにまとめた さまざまなサンプルデータ が付属しており スキャンをどのように撮影するかを 計画する際に役立ちます またdeveloper.apple.comに 掲載されている ベストプラクティスに関する 詳細なドキュメントや WWDCの関連セッション もご参照ください あとは ご自身のスキャンに Object Captureを 使ってみることです 皆さんがどんなものをスキャンして シェアするのかとても楽しみです ♪
-
-
6:56 - Creating a PhotogrammetrySession with a folder of images
import RealityKit let inputFolderUrl = URL(fileURLWithPath: "/tmp/Sneakers/", isDirectory: true) let session = try! PhotogrammetrySession(input: inputFolderUrl, configuration: PhotogrammetrySession.Configuration())
-
9:26 - Creating the async message stream dispatcher
// Create an async message stream dispatcher task Task { do { for try await output in session.outputs { switch output { case .requestProgress(let request, let fraction): print("Request progress: \(fraction)") case .requestComplete(let request, let result): if case .modelFile(let url) = result { print("Request result output at \(url).") } case .requestError(let request, let error): print("Error: \(request) error=\(error)") case .processingComplete: print("Completed!") handleComplete() default: // Or handle other messages... break } } } catch { print("Fatal session error! \(error)") } }
-
13:44 - Calling process on two models simultaneously
try! session.process(requests: [ .modelFile("/tmp/Outputs/model-reduced.usdz", detail: .reduced), .modelFile("/tmp/Outputs/model-medium.usdz", detail: .medium) ])
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。