見出し画像

NeRFで生成したデータを3Dプリントできるデータに変換してみた

今回はLumaAIを利用してNeRFで作成した3Dデータを3Dプリント用のデータに変換してみました。
データをOBJでサイトからダウンロードし、その後カラー3Dプリント用のモデルに変換するところまでを対応してみます。
CG目的で使うことがメインで製造目的の3Dデータ生成が目的ではないこともあり、LumaAIで撮影した3Dデータは以下の画像のように断片化されたメッシュに複数のマテリアルとそのマテリアルにアサインされたテクスチャで構成された状態のため、このまま3Dプリントするのは不可能でした。

断片化されたデータを個別に移動させた状態

そのため、まずは断片化されたメッシュを製造用のデータに修正することから試みました。

Rhino WIPのShrinkWrapコマンドを用いる方法

今回はRhinocerosというソフトウェアの開発版であるRhino WIPに新機能として搭載されている「ShrinkWrap」という機能を利用してみました。
「3Dスキャンで作成された断片的なデータ」や「データをオフセットした際に生じる自己交差」をまるっと包むために使える便利機能です。
機能の詳細がフォーラムに上がってますので以下をご確認ください。

WIP版は利用ライセンスがプロダクト版のRhino7に紐づくため、Rhino7をご利用の方は以下のダウンロードサイトからダウンロードすることで利用可能です。

Windows版
https://www.rhino3d.com/download/rhino/wip

Mac版
https://www.rhino3d.com/download/rhino-for-mac/8/wip

ラッピングする際に包む皮のオフセットを設定できるのでその設定値で出力されるメッシュが大きく異なります。

offset 0.00(オフセットなし)
offset1.00


offset5.00

オフセットが大きければ大きいほど、分厚くなり、元の形状からはかけ離れていきますが、Rhino7から搭載されているSubD機能を利用すればここから元の形状に近似させていくことが比較的簡単にできます。
そのため、今回は以下のフローで形状を整えていきました。

  1. RhinoWIPにて断片化しているメッシュファイルを全て選択した状態でShrinkWrap(offset3.00)。断片化しているメッシュを抱き込んだ形で1メッシュに変換

  2. QuadRemsh(Convert to SubDとInterpolate SubDオプション付き)でSubDメッシュに変換

  3. SubDで不具合が生じている箇所を若干調整

  4. OffsetSubD(法線内側3.00)で元の形状に近いデータに再変換

  5. 若干痩せるので元のデータと比較しながらShrinkWrap(今回はoffset0.5)

  6. 調整されたデータをSTLでエクスポート

上記の内容で処理することで以下の画像のように穴もなく、形状も元のデータ形状に近似した3Dデータに変換することができました。

ShrinkWrapとQuadRemeshによるデータ調整

今回はこのデータをテクスチャを投影するためのデータとして使用しました。若干エッジが丸まりましたが、SubDを使えばエッジ移動や頂点移動、Crease処理で元の形状に近づける処理は非常に簡単にできるため、もしご自身で試してみる場合にはSubDのタイミングで調整することをお勧めします。

Blenderを使用して修正したデータにテクスチャをアサイン

続いて元のLumaAIからダウンロードしてきたOBJファイルから調整した3Dデータ(STL)に対して色情報をテクスチャとして投影します。今回はBlenderは2.9で対応しましたが、2.8以上であれば同じやり方で対応できると思います。
Blenderは無償で利用可能なCGソフトウェアですが、超多機能なソフトで総合的に覚えるのには長時間要します。基本的な操作だけであればYouTubeで基本操作の動画が多量にあるため、それらを活用することをお勧めします。
具体的には以下のフローで対応しました。

  1. 元のOBJファイルをインポートする

  2. 念の為、ShadingモードでOBJファイルにテクスチャが乗っていることを確認する

  3. 修正したSTLファイルをインポートする

  4. スケールが合っていない場合はOBJのスケールに合わせて調整する(今回は1000倍にしました)

  5. インポートしたSTLデータの方を選択し、「UV Editing」タブを選択する

  6. UV -> Smart UV ProjectでUV展開を行う

  7. UV Edit画面上で +New ボタンを押して、新しいテクスチャを作成する。この時のテクスチャサイズはOBJファイル中のテクスチャファイルで最も大きな画角のテクスチャに合わせる(今回は4096 x 4096でした)

  8. 「Shading」タブを選択する

  9. 「Material Property」を選択し新規マテリアルを作成する

  10. Add -> Texture -> Image Texture で新しいテクスチャを追加する

  11. 7で作成したテクスチャを10でノード内に作成したImage Textureにセットする

わかりづらい部分を以下にアップします。

7の新規テクスチャ作成
9のマテリアル作成
10のマテリアルへのテクスチャアサイン
11の作成したテクスチャの設定

ここまでがOBJから生成したSTLに対して、色データをテクスチャとして設定するための前準備になります。
以降、新しいUVに対して元のデータからテクスチャーを焼き込む(Bake)するまでのフローになります。

  1. カラーデータ(OBJ)→カラーを設定したいデータ(STL)の順で選択CTRLボタンを押しながら選択する

  2. 「Render Properties」を選択し、Render Engine -> Cyclesを選択

  3. 「Render Properties」のBakeを設定し、Bakeボタンを押して作成したテクスチャに元のOBJの色情報を焼き込む。設定内容によって結果が変わるので最適な結果になるように試してみてください。

1のデータ選択
2のRender Engineの選択


3のBake設定とBakeボタン

結果の3Dデータは以下の画像になります。「Texture Paint」タブの「Image」で別のファイルとしてテクスチャデータを出力できますので、Photoshopなどの画像編集ソフトを用いて作成したテクスチャを修正することも可能です。さらに品質を向上させるためには画像ソフトを使ってテクスチャを修正するのも良いと思います。

出力結果

今回はNeRFで作成した3Dデータをカラーで3Dプリントできるデータにコンバートしてみました。
NeRFに限らず3Dスキャナーを利用して断片的に取得した3Dデータも今回の方法を用いれば3Dプリント可能なデータに変換することが可能なのでRhinoのような製造向けの3D関連ツールをご利用のユーザーの皆さんはぜひ試してみてください。


この記事が気に入ったらサポートをしてみませんか?