0
Help us understand the problem. What are the problem?

posted at

updated at

【RealityKit2】Object Captureを試してみよう!

はじめに

iOSデベロッパーがObject Captureを試してみました。
ARはやっぱり面白い!と思いましたので、
まずはこの記事を見てとりあえずやってみるか、と思って頂ければ幸いです。

環境

  • Xcode Version 13.2.1 (13C100)
  • Swift5(コーディングしてないので関係ないですが一応)
  • Mac OS Monterey 15.1

ObjectCaptureとは?

MacOS Montereyで追加されたRealityKit2の新機能です。
連続して撮影された写真の画像情報及び深度情報などを用いて、写真から3Dオブジェクト(.usdzファイル)を作成できるという画期的な機能です。

WWDC2021の時に発表された機能で、
ベータの時に悪戦苦闘しながらも当時試したことを思い出します。

手順

  • ObjectCapture用の連続写真をiPhoneで撮影する。
  • 撮影した連続写真を用いてMacのPhotogrammetryプログラムを実行し、3Dオブジェクトを作成する

どちらもAppleからサンプルプログラムが提供されているので、今回はそちらを使って3Dオブジェクトの作成を行います。

必要条件

特にMac側で必要なスペックが高いです。

  • iPhone

深度情報を用いるのですが、LiDARスキャナを積んでいないiPhoneでも可能です。
ですが、LiDARスキャナを搭載したモデルの方が正確な深度情報の取得が可能なため、結果が異なります。
※iPadでもOKです。

  • Mac

Macに関してはグラフィック側の要件が厳しく、
・M1 Mac(もちろんM1Pro/MaxでもOKです)
・Intel Mac の場合は Intel CPU with AMD 4GB以上 が必要です。
AMD GPUを積んでいないIntel Mac(Intel Graphicsのみ)の場合は実行出来ません。
私もWWDC2021の時点ではAMDを積んでいないIntel Macしか持っていなかったので、知人のM1Macを借りて試してました。

ObjectCapture用iPhoneアプリで写真を撮影する

以下のリンクからObjectCaptureで使用するための写真を撮るサンプルアプリがAppleDeveloperサイトからダウンロード出来ます。
https://developer.apple.com/documentation/realitykit/taking_pictures_for_3d_object_capture

プロジェクト名は「CaptureSample」です。

実行するとこんな画面になります。
(ベータの時はこんな白枠なんてなかったような、、、改善されていると思います)

IMG_32CE63436D9C-1.jpeg

右下のボタンで「マニュアルモード」と「自動撮影モード」を切り替えることが出来ます。
・マニュアルモード:自分でボタンを押して写真を撮っていきます。
・自動撮影モード:一定間隔でシャッターが切られ、自動で撮影が進んでいきます。

自動撮影モードが個人的には便利で使いやすいと感じました。

撮影する時にはいくつかのコツがあります。
・オブジェクトが70%以上のオーバーラップを持つように撮影し全アングルから撮影する。(これは必須)
・形状が固形で撮影中に変形しないものが適している。
・オブジェクトの向きを変える際に、形が変わらないように注意する.
・必要な枚数はオブジェクトの複雑さにより変わるが、多い方が良い。
詳細なコツはApple公式の説明を読むのが一番です。
https://developer.apple.com/documentation/realitykit/capturing_photographs_for_realitykit_object_capture/

以下は「CaptureSample」のヘルプ画面ですが、そこにも記載されています。
IMG_977B0507F42C-1.jpeg

いざ撮影してみます!!が、ここが一番大変かもしれません。
・反射して影が出来ないように照明のセッティングが必要
・背景は一貫した背景が望ましい。
などなど、推奨した条件を満たすのはきちんとした環境を整えないと難しいです。

ということで一旦、上記を無視して、対象を以下の水筒にして床に置いて撮影してみます。
IMG_7490.jpg

撮影すると以下のようにフォルダ分けされて保存されます。

IMG_125CCC1D5F08-1.jpeg

以降はMacでの作業になるのでファイルアプリなどからAirDropなどを使ってMacに送ります。
※それぞれのフォルダが一つのプロジェクトで使用する画像群になっています。
IMG_08AF7F38FF67-1.jpeg

連続写真を用いてMacのPhotogrammetryを実行し3Dオブジェクトを作成する

写真から3Dオブジェクトを作成するのをPhotogrammetryと呼ぶのですが、Photogrammetryのコマンドラインサンプルアプリを以下のAppleDeveloperサイトからダウンロードします。
https://developer.apple.com/documentation/realitykit/creating_a_photogrammetry_command-line_app

しかしながら、macのコマンドラインプロジェクトを作ったこと・使ったことが無いiOSデベロッパーの当方は実行方法がわからないので、以下の方法でやりました。

それは、プロジェクト実行時のSchemeで必要なパラメータを渡してやる方法です。

コマンドラインサンプルアプリに必要なパラメータは以下です。
・入力ファイル(連続写真)のフォルダのパス
・出力ファイルのパス

以下のような形で設定し、実行すればプログラムは走ります。
2022-01-14 23.38のイメージ.jpg

追記:コマンドラインアプリの実行方法2
こちらが正規の手順になります。
コマンドラインアプリをビルドするとXcodeのプロジェクトフォルダに実行ファイルが追加されます。
・デバッグの場合
/Users/(現在のユーザー名)/Library/Xcode/DerivedData/(プロダクト名)-(ランダムな識別子)/Build/Products/Debug
・リリースの場合
/Users/(現在のユーザー名)/Library/Xcode/DerivedData/(プロダクト名)-(ランダムな識別子)/Build/Products/Release

上記フォルダの中に実行ファイルが生成されています。
単純に実行した場合、以下のようにinputフォルダとoutputフォルダを指定しろと怒られます。

OVERVIEW: Reconstructs 3D USDZ model from a folder of images.

USAGE: hello-photogrammetry <input-folder> <output-filename> [--detail <detail>] [--sample-ordering <sample-ordering>] [--feature-sensitivity <feature-sensitivity>]

ARGUMENTS:
  <input-folder>          The local input file folder of images.
  <output-filename>       Full path to the USDZ output file.

OPTIONS:
  -d, --detail <detail>   detail {preview, reduced, medium, full, raw}  Detail
                          of output model in terms of mesh size and texture
                          size . (default: nil)
  -o, --sample-ordering <sample-ordering>
                          sampleOrdering {unordered, sequential}  Setting to
                          sequential may speed up computation if images are
                          captured in a spatially sequential pattern.
  -f, --feature-sensitivity <feature-sensitivity>
                          featureSensitivity {normal, high}  Set to high if the
                          scanned object does not contain a lot of discernible
                          structures, edges or textures.
  -h, --help              Show help information.


Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[プロセスが完了しました]

なのでターミナルから実行します。
なお実行形式は以下のようになっています。

./HelloPhotogrammetry <input-folder> <output-filename>

今回の場合は以下で実行しました(schemeでやった時と同じフォルダ指定)

nonakajun@MacBook-Pro Debug % ./HelloPhotogrammetry /Users/nonakajun/work/xcode/AR/ARCaptureImage/input/suitou2 /Users/nonakajun/work/xcode/AR/ARCaptureImage/output/suitou3.usdz

得られる結果は同じです。
以上、ここまで追記でした。

結果として出力された3Dオブジェクト(.usdzファイル)が以下です。
2022-01-14 23.33のイメージ.jpg
こちらはgifです。
タイトルなし.gif

推奨条件を無視して適当に撮影した写真からでも、デコボコではありますが、3Dオブジェクトの生成が出来ました!!
床ともしっかり分離されたオブジェクトが出来ます。

ちなみにAppleのDeveloperサイトでナイキの靴の連続写真とそこから作成した3Dオブジェクトを見ることが出来ます。
https://developer.apple.com/jp/augmented-reality/object-capture/

環境を整えるとこんなにも綺麗な3Dオブジェクトを写真から作ることが可能です。

最後に

ObjectCaptureはやってみて非常に面白いです。
あとはARオブジェクトを表示する簡単なアプリでも作って人に見せるなどすると、結構感動してもらえますよ!

Macのコマンドラインはしっかり勉強して正攻法のやり方で出来るようになったら加筆したいと思います。 追記しました。

初Qiita投稿で至らない点、間違っている点などあるかと思いますが、是非ご指摘頂ければ幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?