sw1227’s diary

Visualization, GIS, Machine Learning, Generative Art, Simulation, Math

iPhoneのFace IDで3Dスキャンし、データの後処理を行う方法

1. 概要

最近のiPhoneに搭載されているFace IDでは、顔の三次元形状をTrue Depthカメラが取得することで認証を行っています。この機能を応用して3Dスキャンができないかなと考えていたのですが、アプリを入れるだけで実現できるようです。

それだけならブログを書くほどでもないですが、スキャンした点群データを出力して後処理をすれば、色付きでポリゴン状(点群ではない)の3Dオブジェクトを得ることができました。その際に必要となる以下の手順について書くことにします。無料で完結します。

  • スキャン・点群のエクスポート
  • 不要な点の削除(MeshLab)
  • 点群から辺・面を生成(MeshLab)
  • 生成されたオブジェクトの確認・変換

2. スキャン・エクスポート方法

Capture: 3D Scan Anything というアプリでスキャンを行います。 方法はアプリ内に説明があるので省略します。急に動いたりするとスキャンが終了してしまうため、全方向からスキャンするのは少し慣れが必要です。部屋の真ん中にステージのような台を置いて作業すると上手く行きました。

Capture: 3D Scan Anything

Capture: 3D Scan Anything

  • Standard Cyborg
  • Photo & Video
  • Free
apps.apple.com

今回はGo Storeで買ったGopherさんをスキャンしてみます。

スキャン時の画面
スキャン時の画面

アカウントを作成してログインすると、スキャンした結果はStandard Cyborg社のWebサイトから見ることができるようになります(下図)。この画面からPLYまたはOBJ形式でダウンロードすることができるので、今回はOBJをダウンロードします。

ログインして点群を表示した状態
ログインして点群を表示した状態

3. 後処理方法

エクスポートした点群のOBJファイルを編集するため、MeshLabというソフトウェアを使用します。 インストールして起動後にOBJファイルをドラッグ&ドロップすると、以下のように点群が表示されます。

MeshLabに読み込んだ状態
MeshLabに読み込んだ状態

3.1. 不要な点の削除

土台も含めてスキャンされてしまっているため、まずは不要な点を削除します。

「Edit -> Select Vertexes」で頂点選択モードとして矩形領域を選択すると、以下のように選択された点群が赤くなります。この状態で「Filters -> Seledtion -> Delete Selected Vertices*1」とすると、選択された点が削除されます。これを繰り返すことで不要な点を削除します。

不要な点を選択
不要な点を選択

3.2. 点群をポリゴンに変換

点群から辺・面を生成してポリゴンにします。

3.2.1. 法線ベクトルを計算

まずは法線ベクトルを計算する(しないと次のステップでエラーになる)ため、「Filters -> Point Set -> Computer normals for point sets」を実行します。ダイアログで「Apply」を押すと実行できるのですが、右下のメッセージボックスに「Applied filter Compute normals for points sets...」云々が表示される以外は反応がないので分かりにくいです。

3.2.2. メッシュの生成

法線ベクトルの計算が終わったら、「Filters -> Remeshing, Simplification and Reconstruction -> Screened Poisson Surface Reconstruction」でメッシュを生成します。チェックボックス等はいずれもデフォルトのままで大丈夫でした。

表示設定によっては生成の成否が分かりにくいのですが、画面右上にPoisson meshというのが現れているのが分かると思います。この画面で元の点群を非表示にしたり(目のアイコン)、ワイヤーフレームの表示をONにしたりすることで、メッシュが生成されていることを確認できます。

作成されたメッシュ
作成されたメッシュ

この時点で「File -> Export Mesh As」とすると様々な形式でメッシュをエクスポートできます。今回は再度OBJ形式で保存しました。

3.2.3. メッシュの確認・反転

オンラインのViewermacOSクイックルック機能で生成されたメッシュを確認します。この時、場合によっては以下のように見た目が不自然になることがあります。

反転が必要な例
反転が必要な例

これは面の向きが逆向きに設定されていることが原因です(奥の面が手前にあるように見える)。この場合、MeshLabで「Filters -> Normals, Curvatures and Orientation -> Invert Faces Orientation」を行ってから再度エクスポートすると、以下のように正しく表示されます。

上手くいっている例
上手くいっている例

3.3. (参考)glTFに変換

OBJとしてエクスポートしたファイルをCREATORS 3D online viewerにアップロードすると、右下の「DOWNLOAD AS GLB」ボタンから.glbファイル(glTFのバイナリ形式)に変換された物をダウンロードすることができます。

これをglTF Viewerにアップロードすると周辺環境付きで表示ができます。

glTF Viewer
glTF Viewer

CesiumGS/obj2gltf - GitHubを使ってコマンドラインで変換してもOKです。

glTFファイルは地図上に表示することもできます。

sw1227.hatenablog.com

3.4. usdzに変換

以前はコマンドラインで変換していたのですが、2020年1月に公開されたReality Converterを使えば.objや.glbを.usdzに変換することができるようです。

Reality Converter
Reality Converter

iCloud Driveに.usdzを入れてiPhoneで開くと、そのままARで表示することができます。

AR
偽物にだけ影がある

関連記事(3D)

sw1227.hatenablog.com

sw1227.hatenablog.com

*1:VertexesとVerticesで表記ゆれしている...