ZBrushで作成したディスプレイスメントマップをmodoで使用する方法について書いてみます。使用バージョンはmodo 14.0、ZBrush 2020.1.4です。
ZBrushでディスプレイスメントマップを作成する方法
ディスプレイスメントマップ作成 オプション
ZBrushからディスプレイスメントマップを出力する場合の設定です。「スケール」1、「中央値」0.5であることが重要です。それ以外のオプションは必要に応じて設定します。
アダプティブ
アダプティブはポリゴンの領域計算が正確になります。しかし、このオプションは信頼性が低く大きな解像度では不要という情報を見かけます。使用するデータに合わせて見比べるのがよさそうです。
DPSubPix
DPSubPixはサブピクセルの精度で、値を上げると滑らかなピクセルになります。4が望ましいですが値を高くするとレンダリング時間が長くなります。高解像度のメッシュ(16mil以上)や、マップサイズが2048以下と小さい場合は2でも十分なようです。
中央値
ディスプレイスメントの押し出し基準となる値です。16bit画像はマイナス値を持つことが出来ないので、中央値がディスプレイスメントしないグレー色、凸が白色、凹を黒色のピクセルとして出力されます。
垂直反転
垂直反転はUVのV軸を反転します。modoからGozを使用してZBrushにメッシュを転送した場合、UVはmodoのUV方向と一致します。objやfbx形式でメッシュをインポートした場合はUVが「垂直反転」します。必要に応じて使用します。
マップを作成してエクスポート
「ディスプレイスメントマップ作成」で作成されるマップは16bitフロート固定です。16bitでも十分な結果が得られますが、32bitのマップが必要な場合は「マップを作成してエクスポート」を使用します。
32Bit
32bitをONにすると32bitフロート画像でファイル出力することができます。OFFの場合は16bit画像として出力します。32bit出力する場合は「3チャンネル」「32Bit」ONにして「マップを作成してエクスポート」を実行します。
「3チャンネル」がOFFの場合はグレースケールのファイルとして出力されるのですが正常です。しかし、「マップを作成してエクスポート」を使用した場合は以下の問題があります。
- tif形式を使用した場合、壊れたtifが出力されます。
- exr形式を使用した場合、Rチャンネルにマップを書き込むためmodoに読み込んだとき赤い画像になってしまいディスプレイスメントとして使用することができません。
「マルチマップエクスポーター」はtifのグレースケール出力が正常に動作してるので、基本的にマップ作成はマルチマップエクスポーターを使用するのがいいと思います。UDIMを使用したモデルのマップを作成するときもマルチマップエクスポーターを使用します。
modoのメッシュにディスプレイスメントマップを適用する場合のマップ作成
modoで作成したメッシュをZBrushでスカルプトしてマップを作成し、そのマップをmodoのメッシュに適用する場合はモーフターゲットを使用した状態でディスプレイスメントマップを作成する必要があります。
ZBrushからGoZでmodoに転送したメッシュを使用する場合、この作業は必要ありません。
モーフターゲットを使用したマップの作成方法
- モーフターゲットサブパレットで「MT格納」をクリック
- 「インポート」を使用して元のメッシュを読み込みます
- 「切り替え」でモーフターゲットの状態になってることを確認して「ディスプレイスメントマップ作成」を行います
ZBrushで「ディバイド」したりスカルプトした場合、低SubDivのメッシュも変形します。このため元のメッシュにディスプレイスメントマップを設定する場合は、元のメッシュとスカルプトで変形したメッシュとの差をなくす必要があります。
モーフターゲットを使用してマップを作成することで、元のメッシュで正しい変形結果を得られるディスプレイスメントマップを作成することができます。
オリジナルメッシュ
立方体と平面
スカルプトしたメッシュ SubDiv7
立方体のみスカルプトで凹凸を作成
スカルプトしたメッシュの SubDiv1
スカルプトの影響で低SubDiv時のメッシュが変形している
モーフターゲットを使用しない状態で作成したディスプレイスメントマップ。立方体の角が膨らんでしまいます。
モーフターゲットを使用した状態で作成したディスプレイスメントマップ。ZBrushと同じ形状でレンダリングできます。
modoでディスプレイスメントマップを設定する方法
ZBrushから出力したディスプレイスメントマップをmodoで使用する方法です。modoでディスプレイスメントマップを正しくレンダリングするにはいくつか設定が必要です。
- 画像レイヤーとマテリアルを設定
- サブディビジョンをCatmull-Clarkにする
- UV補間をリニアにする
画像レイヤーとマテリアル設定
画像が16bitと32bitで設定方法が異なります。
16bit画像
画像レイヤーで「下限値」「上限値」にZBrushのディスプレイスメントサブパレットの「強度」×100を設定し、マテリアルの「ディスプレイスメント距離」を500 mmに設定します。これはGoZを使用したときに設定される方法と同じです。
デフォルトのレンダリング設定だとポリゴンが荒いので、レンダー設定の「ディスプレイスメント評価間隔」に小さい値を設定します。「ディスプレイスメント評価間隔」は小さいほど良好な結果になりますが、レンダリング時間が長くなります。
ZBrushのディスプレイスメントサブパレットの「強度」の値。「強度」はZBrushが作成する画像ファイル名にも追加されます。
32bit画像
画像レイヤーの「下限値」-100%、「上限値」100%に設定して、「ディスプレイスメント距離」を500 mmに設定します。ただし、マップに保存されている値が1より大きい場合、デフォルトではディスプレイスメントがクランプされてしまいます。
このような場合はチャンネルビューポートで「source High」の値を高く設定します。「source High」はプロパティに表示されないチャンネルなので、ちょっと不親切ですね。
ディスプレイスメント距離の「500 mm」という値は、modoのレンダラーが使用するディスプレイスメントの基準値と思われます。
3Dソフトはソフト内で使用する基準となる大きさがあり、modoの場合は1 mが基準になっています。ディスプレイスメントマップには何センチのように絶対的な距離が保存されているわけではないので、ディスプレイスメントの押し出し方向 ±500 mm の基準値+マップの値でディスプレイスメントされます。
サブディビジョンをCatmull-Clarkにする
modoには2種類のサブディビジョンが搭載されています。modoオリジナルのサブディビジョン(Tab)と、Catmull-Clarkサブディビジョン(Shift+Tab)です。
ZBrushの「ディバイド」はCatmull-Clarkサブディビジョンを使用しているので、ZBrushからディスプレイスメントマップを出力してmodoで使用する場合は、Catmull-Clarkサブディビジョンを使用すると形状が一致します。
下の画像はmdooのCatmull-Clarkサブディビジョン(白色)と、ZBrushでディバイドしたメッシュ(赤色)を同じ位置に重ねてレンダリングしたものです。形状が一致してるのが確認できます。
まだら模様に見えるのはレンダラーの特性によるものと思われます。ポリゴンが同じ位置にある場合どちらのポリゴンを前面にレンダリングするか優先順位がポリゴンごとに変わっているため、まだら模様が発生しています。Dキーを使用して細分化したメッシュや、ジオメトリキャッシュを比較すると頂点位置が一致していることが確認できます。
MayaのArnoldでメッシュスムーズプレビューをレンダリングした画像、同じく形状が一致してます。
ZBrushのSubDiv4はmodoの「レンダーレベル」3に対応します。同様にMayaのMesh Smoothも3になります。
UV補間をリニアにする
modoはサブディビジョンをONにしている場合、UVマップに対してもサブディビジョンを適用します。ZBrushから出力したマップを使用する場合は、メッシュのプロパティで「リニア UV」をONにします。
ZBrushのマップ作成オプションに「スムーズUV」というオプションがありますが、modoでUVを一致させるには「スムースUV」をOFFの状態でマップを作成する必要があります。
ZBrushの「スムーズUV」は他のソフトでも基本OFFがいいように思います。3dsMaxはOpenSubdivモディファイヤにUV補間に関するオプションがあります。Mayaも同様にUV境界のスムーズ設定があるのですが、ZBrushの「スムーズUV」とは計算が一致しません。ZBrushの「スムーズUV」と同じような補間が出来るのは、Arnoldの「pin_borders」が近いように思います(試したけど微妙にずれる気がする)。
メッシュの比較
modoでディスプレイスメントマップを適用したモデル(白色)と、ZBrushから出力したハイメッシュ(青色)の比較です。だいたい同じような形状になってるのが確認できます。
ノーマルマップを作成/使用する方法
おまけでZBrushからノーマルマップマップを出力する場合の設定です。
Gozで読み込んだ法線マップはカラースペースの設定が「デフォルト」になってます。この状態だと法線マップによるシェーディングがおかしな状態になることがあります(カラーマネジメントの設定によります)。そんな時はカラースペースを「リニア」にすると解決します。
参考
ZBRUSH DISPLACEMENT IN MODO
modoのチュートリアル。
http://www.xuanprada.com/blog/2014/7/30/zbrush-displacement-in-modo
このチュートリアルではマップ作成時に「中央値」0、modoのレイヤー設定では「下限値」0%「上限値」100%、「ディスプレイスメント距離」1mに設定しています。
私の記事で「中央値」0.5を使用したのは16bitと32bit画像で共通して使用する設定にするためです。Arnoldと設定を合わせたい場合は「中央値」0の方がいいかもしれません(ArnoldのScalar Zero Valueで合わせられる気もします)。
ACCURATE DISPLACEMENT WORKFLOW
ディスプレイスメントの基本的から解説されてます。
https://www.cggallery.com/tutorials/displacement/