Blender ウォッチング

扱いやすくなったローカル3Dモデル生成AI「Pixal3D」の設定と「Blender」による修正法

VRAM不足になる場合の対処方法も解説

 本連載では、無料の高機能3Dモデリングツール「Blender」の使い方や関連情報を幅広くお伝えします。

わざわざアーマチュアを入れたのは、このポーズの画像を入力してもモデルが生成されなかったため

 今回は前回導入した「ComfyUI」に統合された「Pixal3D」の機能や調整についていろいろ検証してみたいと思います。

ワークフローで行われる後処理

 この「Pixal3D」(とTrellis2)は、デフォルトでは面数が100万以上の非常に細かいモデルを生成します。これは3Dプリンター出力などの単体での利用ではあまり問題にはなりませんが、アーマチュアによるポージングやシーン内への多数配置、ゲームなどのリアルタイム用途には厳しい数字です。また、生成AIにつきもののエラー(破片や穴)も発生します。

 前回導入した『Pixal3D & TRELLIS.2:画像からモデルへ』ワークフローには、これらを解決するノードが組み込まれています。

モデルの軽量化(ポリゴン数削減)

 このワークフローでは[Mesh Post Processing]の[Remesh Mesh (Narrow-Band DC)]ノードと[Decimate Mesh]ノードでモデルの軽量化を行っています。

 デフォルトではハイポリメッシュの面数を70万程度に削減し、同時にハイポリメッシュのディテールをノーマルマップやAOマップにベイクし、生成したローポリメッシュにUVマップとして適用することで、ディテールをある程度維持しようとします。

[Mesh Post Processing]の[Remesh Mesh (Narrow-Band DC)]ノードと[Decimate Mesh]ノード。削減する面数が表示されている

 [Remesh Mesh (Narrow-Band DC)]ノードの[resolution]値で「ハイポリメッシュ」の解像度が決まります。そして[Decimate Mesh]ノードの[target_face_count]が、目標の面数になります。

破片と穴

 破片と穴についても[Remesh Mesh (Narrow-Band DC)]ノードがある程度解決してくれます。それでもある程度の大きさの破片や穴はエラーとして残ることがありますが、少量なので「Blender」で修正してしまいましょう(後述)。

 穴を塞ぐための[Fill Holes]ノードも用意されているものの、筆者が試した限りでは、あまりいい結果が得られませんでした。

生成の調整

 以前の記事でもパラメーターについて解説していましたが、この実装では以前とは違った形でノードが実装されており、パラメーターの場所も変わっています。

生成AIモデルの選択

 [Boolean (Switch to Trellis2)]ノードの値で、生成用のモデルを「Trellis2」と「Pixal3D」のいずれかに切り替えできます。デフォルト値は[false]で「Pixal3D」が選択されています。

この[Boolean (Switch to Trellis2)]ノードの値で「Trellis2」と「Pixal3D」が選択可能
「Trellis2」と「Pixal3D」に同じ画像、シード値、面数(5万)で生成させた例。全体的なプロポーションは「Trellis2」が近いが、細部の再現は「Pixal3D」が上。元画像はWikimediaより

ランダムシード

 生成パターンを変えるランダムシード値は[Kサンプラー]ノードにあります。

 [Sparse Structure Generation](疎構造生成)グループに1つ、[Shape Generation](形状生成)グループに2つ、[Texture Generation](テクスチャ生成)グループに1つずつあり、上流のシード値の変更が下流の形状やテクスチャに影響します。

 つまり『形状をそのままでテクスチャのパターンを変えたい』はできても『テクスチャのパターンを変えずに形状を変えたい』はできないというわけです。

[Sparse Structure Generation](疎構造生成)グループ、[Shape Generation](形状生成)グループ、[Texture Generation](テクスチャ生成)グループの[Kサンプラー]ノード

 ワークスペースでのデフォルト値は[Sparse~]の[Kサンプラー]ノードの物が『56』、[Shape~]が『42』、[Texture~]は『43』になっています。

お気に入り入力

 繰り返し変更するパラメーターは[お気に入り入力]に登録(パラメーター上で右クリックメニューから[ウィジェットをお気に入りに追加: ~])することで、ノード未選択時に右ペインから別々のノードの各パラメーターを操作できます。

ノードのパラメーター上で右クリックして[ウィジェットをお気に入りに追加: ~]で[お気に入り入力]に登録可能

メモリ不足で止まる場合の設定

 メモリ不足(Out Of Memory: OOM)で止まる場合は、以下を試して見ましょう。

他のアプリと常駐アプリを終了する

 基本として、Webブラウザーと「ComfyUI」以外のアプリやタブの使用は最小限に留めておきましょう。「OneNote」や「Steam」など、ウィンドウを終了しても常駐し続けるものもあります。

ノードの設定を下げる

[Texture Resolution]ノード(Texture Bakingグループ内)

 [値]を1/2にした場合、単純計算でテクスチャのVRAMメモリ使用量は1/4になります。デフォルト値は『4096』です。

[Texture Resolution]ノードの[値]を下げるとテクスチャの品質は落ちるがVRAMメモリ消費量も大きく減る

[Trellis 2 Upsample Stage]ノード([Shape Generation]グループ内)

 [target_resolution]を下げると品質を犠牲にする代わりに、メモリ消費量を抑えることができます。デフォルトは『1536』です。

[Trellis 2 Upsample Stage]ノードの[target_resolution]を下げると品質は落ちるがメモリ消費量も減る

[MoGe推論]ノード(Image Pre-Processingグループ内)

 [resolution_level]を小さくすると、細部のキャプチャに使用するトークン消費量が減り、メモリ消費量も減りますが、当然ディテールが作成されなくなるため、あまり推奨しません。デフォルト値は『9』です。

テクスチャ作成部分を無効化する

 [Unwrap Mesh UVs]ノードで止まる場合、上記の解像度の変更でもダメならいっそのこと、メッシュ+頂点カラー(プレビューモデル)のみ出力するようにしてしまいましょう。

 具体的には[Texture Baking]グループのヘッダーをクリックして選択後、右クリックメニューから[Bypass Group Nodes]を実行、または[Ctrl]+[B]キーを押します。そして[3Dを保存(詳細)]ノードも選択し同様に右クリックメニューから[バイパス]を実行します。

「Texture Baking」グループのヘッダーをクリック(①)し、右クリックメニューから[Bypass Group Nodes](②)、または[Ctrl]+[B]で実行
同様に[3Dを保存(詳細)]ノードも選択し右クリックメニューから[バイパス]を実行。図のように全体が紫になれば成功

CPUで起動する

 CPU用のバッチファイル(run_cpu.bat)で起動します。メインメモリに十分な空きが必要です。非常に時間がかかるため最終手段です。

「Blender」による修正

 ワークフローでだいぶ軽減されたものの、それでも変な形状が生成されたり、テクスチャの塗り忘れやはみだしは発生します。そこで「Blender」で手を入れ、もう少し綺麗にすることを考えます。

形状の修正

 「Blender」に「.glb」ファイルをドロップして読み込んだ後、[Tab]キーなどで[編集モード]に入ります。

メッシュモデルの下処理

 生成されたメッシュモデルは、多くの面の頂点が独立しているため、まずは扱いやすくするため、[A]キーで全選択(選択されていれば不要)し、[メッシュ]-[クリーンアップ]-[距離でマージ]を実行して不要な頂点を統合してしまいましょう。

[メッシュ]-[クリーンアップ]-[距離でマージ]ですべての面の頂点を統合。面数は変わらずに大量の頂点が削除でき、扱いやすくなった

修正の方針

 UVテクスチャを活かすなら、修正は基本的に『新たな面は増やさない』ようにします。新しい面が増えると対応するUV面が、既存の部分と重なってしまうためです。別のUVマップに移動するなら問題ありません。

 既存の面の分割や、面の辺や頂点の位置の移動、面の削除は問題ありません。[ナイフ]や[リップ]ツールを駆使しましょう。

 形状の修正が多い場合や、あまりテクスチャの情報量が多くない物では、いっそのこと形状だけを利用し、生成されたUVマップとテクスチャは破棄して、後でUV展開やテクスチャペイントを「Blender」で行う方がいいかもしれません。

穴の修正

 UVテクスチャを維持する場合、『穴』の修正は少し面倒です。

  1. 頂点選択モードにします(キーボード上部の[1]キー)。
  2. 穴の外側のループの頂点を[Shift]キーを押しながらのクリックなどで複数選択します。
  3. 右クリックメニューから[頂点をマージ]-[中心]を実行します。
[1]キーで頂点選択モードにし、穴の外側のループの頂点を選択、右クリックメニューから[頂点をマージ]-[中心]を実行

アーマチュアによるポージング

 ポーズを付けた画像からの生成ではなく、Tポーズなどでモデルを生成し、「Blender」でポーズを付ける場合はかなり手間がかかります。

アーマチュアの自動ウェイト設定ができない!

 普通にモデルをインポートし、「Blender」でアーマチュアとのペアレント時に『自動のウェイトで』を使用して頂点グループのウェイト設定を行おうとすると、恐らく失敗します。これはインポートしたオブジェクトのスケールが小さすぎて、精度の問題でウェイト設定がうまくいかないのが原因の一つです。

 ペアレントで自動ウェイト設定を行う時に、メッシュオブジェクトとアーマチュアの両方を10倍ぐらいに大きくすれば成功します。必要であれば、ペアレント後、[Alt]+[S]キーなどでスケールをリセットすれば問題ありません。

 それでも無理な場合は、「3DPrint Toolbox」アドオンをインストールし、[オブジェクト]メニューから[3D Print Toolbox]-[多様体化]を実行すれば直ることもあります。しかし一部の面のUVマップとテクスチャが壊れる可能性があります。

「Pixal3D」の生成特有の構造による問題

 また、「Pixal3D」(と「Trellis.2」)で生成したメッシュモデルには、ソリッド化モディファイアーを使用したような「厚み」(外側の面と内側の面)が生成されますが、これはリギング時にも影響があります。

 例えば、上記の自動ウェイト設定でウェイトをつけた脚を曲げてみると、内側の変形と外側の変形に違いが発生する場合があります。

 残念ながら「Blender」にはこのような面を一括削除する方法はなく、内外の面がくっついていたりすることもあるため、[アーマチュア]モディファイアーパネルで編集モード中も変形表示をする設定を行い、突き出た内側の面を[選択の拡大縮小]で慎重に広げながら選択・削除します。

 状況によっては再度自動ウェイト設定が必要になることもありますが、いずれにせよ衣装や髪などのウェイト編集は必須です。

モディファイアーパネルの図のアイコン(①)を有効化し、手動で不要な面を選択して削除中。オーバーレイの[面の方向]オプション(②)で、裏向きの面を赤く表示し、[選択の拡大]([Ctrl]+テンキーの[+]キー)で少しずつ選択・削除

マテリアルの修正

 このワークフローでは『メタリック』用テクスチャと『ノーマルマップ』テクスチャが付加されます。しかし、元がイラストやアニメ風の画像の場合、あまりうまく機能しているとはいえない場合があります。

 マテリアルを確認し、不要なら外すか、部分的に必要ならマテリアルを複製して必要な場所にのみ割り当てましょう。

首元にノーマルマップによる妙な凹凸がついてしまっている例

テクスチャの修正

 特にポリゴン数を大幅に減らした場合、塗り忘れやキャラクターの髪の色や影が顔に付いていることがよくあります。これらは[テクスチャペイント]ワークスペースで修正できます(変更はblendファイル保存時に一緒に保存されます)。

 また、キャラクターを生成した場合、顔部分にあまりテクスチャ領域が割り当てられず、低解像度になりがち(上図参照)ですが、可能なら顔に専用のUVマップを追加・展開すれば、テクスチャだけでなく、形状にも細部が追加できるようになり、品質を上げることができます。

 下記の図では簡単にモデル生成の元画像の顔部分をそのまま貼り付けて改善しています。

 まず新たな『顔用マップ』のUVマップを追加(①)し、顔の部分のメッシュをそこにUV展開し、元画像の顔部分のみコピー&ペーストして(②)、別マテリアルをこの部分に割り当てる(③)ことで、綺麗になります。

新たな『顔用マップ』のUVマップを追加(①)し、顔の部分のメッシュをそこにUV展開し、元画像の顔部分のみコピー&ペーストして(②)、別マテリアルをこの部分に割り当てれば(③)綺麗なテクスチャに

 上図では省略していますが、②の手順でテクスチャ画像を[画像]メニューから[パック]で保存しないと顔用の画像が消えてしまいますので注意してください。眼や口の形状をモデリングしてしまってもいいかもしれません。

終わりに

 文章や画像のようにローカル生成でそのまま使うのは少々しんどいですが、それでも手さえ入れればそれなりの品質になるのはありがたいです。

 ではまた。