写真から自動的に3Dモデルを生成できる、フォトグラメトリをするためのソフト、Reality Capture(以下RC)についての記事です。

3Dゲームを作るとなると、3Dモデルを大量に用意する必要があります。
まあマーケットプレイスやアセットストアでアセットを購入すればある程度は賄えますが、どうしても足りないものもあります。

特に、日本の身近で日常的なアイテムが全然足りません。
アセットストアはどうしても欧米の街とかプロップばっかりになっちゃいますからね。

というわけで、無いものはしょうがないので自分でどうにかするしかないでしょう。
ちょっとしたものならBlenderでモデリングもできますが、数が多くなってくると面倒です。

そこで、有力な選択肢として上がってくるのがフォトグラメトリです。
フォトグラメトリなら写真を撮って来てPCに突っ込んで放置してれば自動で3Dモデルを作ってくれます

まあフォトグラメトリの問題点は、自分で写真撮ってこなきゃいけないので近所に存在する物しかフォトグラメトリできない点ですが、丁度我々は日本のアセットが不足してて困ってたところなので需要と供給が一致してますね。

それから、フォトグラメトリするならPCスペックがモノを言いますが、私のPCはRyzen3950XとGTX1080でUE5もバッチリ動作するのでフォトグラメトリに向いてます。

お手軽フォトグラメトリというスタンス

フォトグラメトリは真面目にやろうとすれば、メッチャいいカメラを使って、丁寧に1枚ずつ写真を撮影して…みたいなイメージです。

しかし、そこまでガッツリやると手間がかかって面倒です。
モデリングの手間を省くためにフォトグラメトリしたいのに、あんまり凝り過ぎると「やっぱモデリングした方がはやくね?」とかなっちゃって本末転倒です。

というわけで、スマホで4k解像度でサクッと適当に録画した動画を使う事にします。
そんなんでも、上手く行けばそれなりな結果が得られます。
この程度の手間ならば、散歩の途中でもサッとフォトグラメトリの素材を収集できます。

とは言え、適当に撮った素材だとフォトグラメトリが失敗する可能性も増えます。
しかし、一部がグチャグチャになってしまい、失敗したメッシュも、そのまま使う事はできませんが役立てる事はできます。

フォトグラメトリに失敗した場合は自分でBlenderでモデリングするハメになると思いますが、その際にモデリング形状のアタリを取る分には失敗したフォトグラメトリモデルでも十分便利です。ゼロベースでモデリングするのは大変ですから。また、モデルのテクスチャもフォトグラメトリから引っ張ってくる事ができそうです。

Reality Captureの価格と競合ソフトについて

2021年にEpic GamesはReality Captureを買収して、大きく値下げしてくれました。

それ以前は、まず無制限に利用できるエンタープライズライセンスが永久ライセンスで約200万円(さらに毎年50万円のメンテナンスフィー)、レーザースキャンとかが使えなく、入力画像が最大3500枚制限のPGM版が月額約3万円、入力画像が1000枚制限のSteam版は月額約4千円、それから使用した分だけ都度ポイントを払うPPI版がありました。

これがEpicの買収後はどうなったかというと、200万円のエンタープライズライセンスは一気に40万円に値下げされて、メンテナンスフィーも無くなりました。
PGM版とSteam版は廃止されました。
PPI版は、それまでは1ポイントあたり1円くらいのレートだったのが、2千円で8千ポイント、つまり1ポイントあたり0.25円にガッツリ値下げされました。

この時に、Steam版を使ってたユーザーが全員40万円のエンタープライズプランにアップグレードしてもらえるという衝撃的な爆アド事件が起きました。
正直言ってメチャメチャ羨ましい。

ただし、Steam版からアプグレされたエンタープライズ版は、無条件に永久に使えるんじゃなくて、毎年10万円のメンテナンスフィーを支払わないとライセンスが切れるというものだそうです。
まあライセンスが切れてもアプリをアプグレできないだけで、ずっと使える事は使えるそうです。

ちなみにエンタープライズ版は去年のブラックフライデーのセールで3割引きの28万円になってました。

次に、RCの競合ソフトの価格を見てみます。

例えばMetaShape(以下MS)は約2万円のスタンダード版を買えば、フォトグラメトリする分にはなんら制限なく使えます。フル版は約40万円です。
3DF Zephyrは入力画像500枚上限のライト版は約2万円、フル版は約50万円です。

というわけで私はMSのスタンダード版を持ってます。
「じゃあRCじゃなくてMS使えばいいじゃん」と思うかもしれませんが、MSだと失敗するけどRCだと上手く行くパターンとかあったりするので、併用したいところです。

要するに、ワークフローとしては、まず外出時にスマホの4k動画で撮影してくる。
次に動画をMSに突っ込んでフォトグラメトリして、上手く行けばそれでOK。
失敗した時は、RCのPPI版に突っ込んでみる。そこで成功したらポイントを払って出力。
という流れが一番コスパ良さそうです。

RCのPPI版はフォトグラメトリを試すだけならタダで使えます。モデルを出力する時にポイントを支払う仕組みです。
ですので、成功した時だけ支払えばいいわけです。

Reality Captureの簡単な使い方

フォトグラメトリのソフトは、見た目のUIはゴチャゴチャしていますが、とりあえず使うだけなら非常にシンプルで、2~3回クリックして待つだけです。

アプリを起動して、画面上部のワークフロータブを開くとこんな風になってます。

ゴチャゴチャしてますが、よく見ると番号が振られている項目があります。
1.写真追加→2.プロセス→3.出力 となってます。

要するにこの順番で実行していけばいいだけです。

というわけでまず写真追加からします。
「入力」や「フォルダ」ボタンも使えますが、普通に写真を全部ドラッグ&ドロップすれば追加できます。

次に、「開始」ボタンを押すと、画像のアライメントとメッシュの生成までやってくれます。↓

生成されたメッシュを見て、「こりゃあ失敗だな」と思ったら、諦めます。設定を詰めれば何とかなるのかもしれませんが、今回は手間をかけないお手軽フォトグラメトリというコンセプトなので。
何となく良さそうに見えたら次のステップに進みましょう。

現時点では頂点カラーでぼんやりした色付けがされてるだけですが、「テクスチャ」ボタンを押すとテクスチャを生成してくれます。↓

テクスチャが生成されました。これで完成です。↓

モデルを出力するには、「メッシュモデル」タブから「高密度メッシュモデル」ボタンを押すと、objでエクスポートできます。PPI版ではエクスポート時にポイント支払い画面が出てきます。
ちなみに、支払いにはPINコードを入力する必要があります。RCのサイトのマイアカウント画面からPINコードを作っておきましょう。

というわけで、RCの基本的な操作はこれだけです。簡単ですね。

あとは生成したobjをBlenderに読み込んで必要のない部分のゴミメッシュを削除したりして仕上げるといいですね。

動画をインポートするには?

上の手順では、写真をインポートする方法について書きましたが、私の場合は写真じゃなくてスマホで撮影した4k動画を使いたいのでその方法を書きます。

と言っても、単にRCに動画ファイルをドラッグ&ドロップすればいいだけです。

すると、このようなウインドウが表示されます。↓

「抽出間隔」というのは動画から写真を切り出すのを何秒ごとにするか?です。デフォルトだと1秒なので、つまり動画が30秒なら1秒ごとに合計30枚の写真が切り出されます。

OKを押すと、フォルダが切られてそこに動画から写真が切り出されます。

しかし、私は最初、動画のインポートでエラーが出て失敗してしまいました。
ググッたところ、RCはデフォルトではH265HEVCビデオフォーマットに対応していないようです。私のスマホ動画はそのH265HEVCでした。

https://support.capturingreality.com/hc/en-us/articles/4415924914834

対応できるようにするには、0.99ドルのHEVC Video Extensionsというのを購入してインストールする必要があるようです。↓

https://www.microsoft.com/en-us/p/hevc-video-extensions/9nmzlz57r3t7

これをインストールしてみた所、無事に動画がインポートできるようになりました。

ちなみに、MSにも動画インポート機能がありますが、そちらも最初はエラーが出て失敗してしまってましたが、K-lite code pack(これは無料)をインストールすると直りました。

https://www.agisoft.com/forum/index.php?topic=9965.0

Reality CaptureのPPIをケチッて使う方法

さて、PPI版のコストの話です。
私は最初、何も考えずに動画を648枚の4k画像に切り出して入力してみましたが、それを出力するための費用は3.37ドル(約400円)でした。

これが高いのか、安いのか?と考えてみると、相当高いと思います。

ちなみに、モデルの出力までやらなくても、画像を入力した時点で出力費用がいくらになるのか確認可能です。
ウインドウの右上のこれをクリックすると、費用が表示されます。↓

もしも表示されない場合は、少なくともアライメントまでやれば表示されるようになるはずです。

1回の出力で400円かかるなら、1日1回出力するとして、毎月1万2千円もかかってしまいます。
それだったら月4千円で使い放題だったSteam版の方がマシでした。

もっとお安くRCを使う方法は無いのでしょうか?
PPIの出力費用は、入力画像の総ピクセル数で決まります。
つまり、入力する写真の解像度を半分にすれば、出力費用も1/4になります。
出力費用はこちらのページの「PPI Cost Calculator」から計算できます↓

https://www.capturingreality.com/RealityCapture-PPI

入力する写真を低解像度にしても、かならずしもメッシュ生成には問題は出ませんが、しかし生成されるテクスチャがボケボケになってしまう点がつらい所です。
しかし、「テクスチャレイヤー」という機能を使えばこの問題を回避できます。

RCはメッシュ生成用の画像(ジオメトリレイヤー)とテクスチャ生成用の画像(テクスチャレイヤー)に別々の画像を使う事が可能です。
つまり、メッシュ生成用には低解像度の写真を、テクスチャ生成用には高解像度の写真を使う事で、出力費用を抑えつつ、綺麗なモデルを出力できます。

参考になる動画はこちらです。↓

というわけで、テクスチャレイヤーを使ってお安くRCを使う方法を簡単に解説します。

まず、手元には一度RCに動画をインポートした時に切り出された大量の高解像度写真があるので、これを低解像度写真に変換します。

動画ではIrfanViewを使って一括変換してますが、IrfanViewはシングルコアで1枚ずつ処理するのでかなり待たされます。
ここではマルチコアで一括画像リサイズできるRalphaというフリーソフトを使ってみます。

https://forest.watch.impress.co.jp/library/software/ralpha/

Ralphaを起動したら、とりあえず高解像度写真のファイルを全部ドラッグ&ドロップで入れて、リサイズの倍率に、とりあえずここでは25%を入力します。
縦幅と横幅がそれぞれ25%まで縮小されると、総ピクセル数はたったの6.25%に減少します。

設定→システム設定を開いて、「複数ファイルを並列処理する」にチェックを入れます。
私のPCのCPUは16コア32スレッドなので、最大スレッド数には30とかそれくらいの数字を入れます。

あとは、変換→実行を押すとリサイズが実行されます。

さすがのマルチコア処理のおかげでかなり高速に処理が終わります。

リサイズが完了すると、”resize”という名前のフォルダが切られていて、そこにリサイズされた写真が入ってます。
これはRCでのメッシュ生成用に使いたい写真なので、”resize”フォルダを”_geometry”に名前変更します。

そして、高解像度写真はテクスチャ生成用に使いたいので、”_texture”というフォルダを作って、そこに高解像度写真を全部放り込みます。

あとは、RCで”新規作成”の状態にして、この”_geometry”フォルダと”_texture”フォルダを一緒にRCにドラッグ&ドロップすればOKです。

ちゃんとテクスチャレイヤー機能が使われてるか確認するには、写真が表示されてる画面でTabキーを押すと、低解像度の写真と高解像度の写真が切り替わります。この状態ならOKです。

また、ちゃんとテクスチャ生成にテクスチャレイヤーが使用されるように設定が必要です。
「メッシュモデル」タブの「メッシュカラー&テクスチャ」の「設定」を選択します。

左下の設定欄で、「テクスチャ画像レイヤ」の項目を「テクスチャレイヤー」に設定しておく必要があります。

あとは普通に処理すればOKです。

結果としては、出力されたメッシュはそれほど変わらないにも関わらず、出力費用は0.21ドル(約25円)まで減りました!総ピクセル数が6%になったので、費用も6%になりました。

とはいえ、25円でも30回出力したら750円です。この際もうちょっとケチれないでしょうか…。

入力画像が648枚って多すぎるんじゃないか?と思って、思い切って95枚まで間引いてみました。
すると、出力費用は3円(0.03ドル)になりました!!

3円なら30回出力しても90円…タダみたいなもんです。

というわけで、テクスチャレイヤー機能を使う事で出力費用を思いっ切りケチる方法が分かりました。
解像度や枚数を減らすと処理もすぐ終わるようになって一石二鳥です。

テクスチャ解像度の詰め方

「メッシュモデル」タブの「メッシュカラー&テクスチャ」欄の「Unwrap」を押すと左下にunwrapツールの設定が出てきて、「テクスチャの最大解像度」で生成するテクスチャ解像度を指定できます。

ただし、ここで8192を設定してても、勝手に4096で生成されちゃう時もあります。

そんな場合は手動でテクセル解像度を詰めて調整するハメになります。

まず、「スタイル」を「テクスチャの最大数」から「テクセルサイズを固定」に変更する事で、手動で「テクセルサイズ」を設定できます。デフォルトだと0.01ですが、この値を大きくするとUVの面積が小さくなり、小さくするとUVの面積が大きくなります。

つまり、4096のテクスチャを8192にするには、UVの面積を大きくしたいので、テクセルサイズを小さくします。
テクセルサイズを変更したら、「Unwrap」ボタンを押すと反映されます。

Unwrapしたら「チャート」ボタンを押すとテクスチャのUVチャートが見やすくなります。

チャートがこのような状態だと、まだUVがスカスカなので、テクセルサイズをもっと小さくしてもう一回Unwrapしてみます。

かと言ってテクセルサイズを小さくしすぎると、1枚のテクスチャに収まらずに2枚に分離したりします。これはこれで困るので、テクセルサイズを大きくしてリトライします。

こんな感じで1枚の8192テクスチャにギリギリ収まるテクセルサイズを見つけたらOKです。

デライティング

さて、こうして完成したフォトグラメトリモデルですが、これをゲームに使おうと思うと、ちょっと困った問題があります。

見ての通り、モデルを撮影した時の太陽の光と影が、モデルのテクスチャにそのまま反映されちゃってます。

しかし、ゲームではゲーム側でライティングを設定するので、本来の太陽の向きとは逆向きに影が出ちゃってるぞ…みたいな事が起きちゃいます。
(というか、本来ならフォトグラメトリするなら晴れてない曇りの日の方が光とか影が出にくいので良いそうです)

というわけで、できれば影の部分を除去したいですね。

Agisoft Texture De-Lighter

MSを開発したAgisoft社が、Texture De-Lighterというフリーソフトを公開してくれてます。
Texture De-Lighterは誰でも無料でここからDLできます。↓

https://www.agisoft.com/downloads/installer/

使い方動画はこちらです(UIが若干今のバージョンと違うので注意)↓

マニュアルはこちらです↓

https://agisoft.freshdesk.com/support/solutions/articles/31000158376-agisoft-texture-de-lighter-general-workflow

とりあえずチュートリアルに従って試してみます。
まずRCから出力したobjファイルを突っ込みます。
次に、影になってる部分をザックリ青い色でペイントして指定します。

(というか半分くらい影なんだよな…)

次に、光が当たってる部分を黄色い色でペイントして指定します。

あとは、画面右の「Remove Cast Shdadows」ボタンを押せば影が除去できるそうです。
また、「Remove Shading」でシェーディングも除去できるそうです。

とりあえず両方やってみました。

うおっ!すごい!!影がほぼ消えてる!!

結果に満足したらExport Modelでエクスポートできます。
これは素晴らしいですね。

Unity Delighting Tool

他にも、Unityにも無料で使えるライティングツールがあるのですが、とりあえず結果からお見せします。

え、微妙じゃね…?大して影は消えてないし…。なんか全体の色味が変わってる気がするし…。

というわけで、Unity Delighting Toolはオススメしませんが、せっかく試したので一応手順を記録しておきます。

参考にした記事はこちらです↓

まず、前準備が色々必要になります。(Agisoftのデライターはなんも要らなかったのに…)

ハイポリモデルとローポリモデルが必要なので、ハイポリモデルはRCから出力したものそのままでいいですが、Blenderを使ってデシメートでローポリ化したモデルも用意します。

さらに、ノーマルマップ、ベントノーマルマップ、アンビエントオクルージョンマップ、ポジションマップを用意する必要があります。

ポジションマップを生成するには、BlenderにTexToolsというアドオンをインストールします。↓

https://github.com/SavMartin/TexTools-Blender

TexToolsを入れたら、ハイポリモデルをインポートして、画像エディターを開いて右のタブからTexToolsを開いて、Positionと書かれたポジションマップを選んで、Bakeボタンを押します。

画像エディター上でポジションマップがベイクされるので、別名で保存します。

次に残りのテクスチャを生成する必要がありますが、こちらの記事で簡潔に説明してくれているのでそちらを参考にしてください。xNormalというフリーソフトを使用します。↓

これで前準備が終わったので、次はUnityのデライティングツールを開きます。こちらからプロジェクトをダウンロードして、Unity2018.1で開いてください。ちなみに2018.4で試したらエラー出ました。

https://github.com/Unity-Technologies/DeLightingTool

Assetsの下に、前準備したテクスチャを全部入れます。
Window→Delighting Toolでツールが開きます。

Input ParametersとOptional Parametersの欄に用意したテクスチャを全部入れてください。

「Compute」ボタンを押せば処理が実行されて、Exportで影が除去されたテクスチャが出力されます。

とまあ以上ですが、このように前準備が大変な割に結果が微妙なので、Unity製ツールよりもAgisoftの方のツールがオススメです。

Sketchfabでいろんなフォトグラメトリモデルが共有されている

フォトグラメトリで作成したモデルはSketchfabで沢山共有されてます。

例えば、こちらのseiroganさんという方は、色んなモデルをCC-BYライセンスで公開してくださってます。

https://sketchfab.com/seirogan/models

CC-BYならクレジットを記載すれば自作ゲームで利用できます。(とは言え、モデル自体がCC-BYでも被写体には別途著作権とかあるかもしれないので注意)

ですから、自分でフォトグラメトリするんだったらSketchfabでは見つからないモデルとかにした方が良さそうですね。

こちらのMiguelさんもメッチャ色んな日本のフォトグラメトリモデルを公開してくれてますが、こちらは全て有料です。

https://sketchfab.com/miguelbandera/models

フォトグラメトリの先達者

twitterなどでもフォトグラメトリで色々活動されている方々がいて、参考になります。

龍さんはRCによるフォトグラメトリの手順書も作成してくれており、参考になりそうです↓

おわり

今回の記事はReality Captureの使い方について、初心者ながら色々書いてみました。

たま~に気が向いた時だけフォトグラメトリする…みたいな使い方だとすぐに何もかも忘れちゃうんですよね。
ですから備忘録的に書き残してみました。

RCについてはひとまずこれで良しとして、次はMetaShapeについて備忘録を書いておきたいなあと思ってます。