今回はZBrushのスケールとユニファイについて解説をしていきます。

順を追って解説していきます。まず、ZBrushのスケールの仕組みを理解する重要な点としてまず解説をしないといけないのが、3DCGにおける”実寸法の概念”はあくまで後付けという点です。

scale.JPG

3DCGにおける実寸法は後付け

今回読み込むOBJファイルは3dsmax内で20cmの立方体として8頂点のデータを書き出しました。あとで説明しますが、システム単位はinchを利用しています。

box_size.jpg

この書き出したOBJファイルをテキストファイルとして開いてみましょう。

するとこのように表示されます。

box_size2.jpg

一番上から順番に解説していくと、

1.どのソフトウエアで書き出されたかというメタデータ。
2. オブジェクト名 = Box 001
3. v で始まるデータ = 各頂点の座標と最終的に何個頂点あるかという情報
4. vnで始まるデータ = 各頂点の法線情報と合計何個の頂点の法線があるかという情報
5. vt で始まるデータ = テクスチャの座標(uv座標)と計何個のテクスチャ座標があるかという情報
6.gで始まるデータ = グループ名
7.s で始まるデータ = スムーズシェードの有無
8.f で始まるデータ = 面を構成する頂点の番号

細かいOBJのデータ構造はこっちを見て欲しい。

OBJ coordinates have no units, but OBJ files can contain scale information in a human readable comment line.

筆者訳: OBJ座標に単位情報はないものの、OBJファイルはスケール情報などを人間が読めるコメントラインなどに含めることができる。
(要するに機械向けには含まれてない)

データの構成としては以上となっていて、お気づきのように、どこにもmmや、cmのデータかを示す情報がないということがわかります。そのため、3DCGにおけるこれらの実寸法の概念はあとからデータを読み込む側で好きに解釈していることがわかります。つまり”後付けによる解釈”ということとなります。

3dsmax や他ソフトにおけるシステム単位という概念

今回の例だと、3dsmaxでOBJファイルの書き出しをしているため、3dsmaxがネイティブにどの寸法で扱うかを指定するシステム単位というメニューがあります。

例えばこの設定の例だと、内部的なシステム単位はInchで取り扱い、表示はcmでしてくれという設定となっています。

systemunit.JPG

そのため、先ほどの立方体では、20cmのデータとして書き出しているのにも関わらず
7.8740 “unit”の寸法しかないデータとなっています。

この仮の寸法 “unit”の正体が読み込み時にInchであることがわかれば、正常にソフトウエアは Inch = 2.54cmということがわかるので、7.8740 * 2.54 = 19.99996cmのデータとして読み込んでくれます。

systemunit2.JPG

なので、3dsmaxには、OBJファイルを読み込んだ時にこのように寸法単位を選ぶエリアがあります。そのためここをcmに切り替えて読み込むと、7.8740 “cm”となり、mmで読み込むと7.8740″mm”となります。あくまで”ここでこのデータはInch / mm / cmの寸法を利用しますよ。”とすることで初めてOBJ内のUnitの数値に、Inchであったりmmであったりという実寸法的な意味が発生します。

“寸法がずれる”という話が良くあがるのは要するに、寸法が後付けであるという点を理解していないために発生する問題です。

ZBrushにとっての扱いやすいサイズ

ではZBrushにこの7.8740 unitのデータを読み込むとどうなるかを見てみましょう。Tool (ツール) > Import(インポート) で先ほど3dsmaxで書き出したOBJファイルを読み込んでみると、Tool (ツール)> Geometry(ジオメトリ) > Size (サイズ)の項目を見ると”2″となっていることがわかります。

7.8740unitなのになぜZBrushに読み込むと”2″というサイズになるのでしょうか?

box.JPG

この謎がよくわかるのが、Tool(ツール) > Export(エクスポート)の欄となっています。

box2.JPG
これは何かというと、現在のサブツールのサイズに対して、”ここに存在する3.937″という数字をかけた上で書き出しをしますよ。という項目となっています。

モデルのサイズ 2 × 3.937 = 7.874unitとなっていて元々のInchで書き出したときのデータとぴったり一致します。

要するに、ZBrushはインポートした際にZBrush自身が扱いやすいサイズ”2″unitにした後に、書き出した際にしっかりと同じサイズで書き出せるようにここで3.937をあとでかけ直すように。という風に記憶してくれています。

例えば、これは25cmの直方体を別ソフトでシステム単位cmで書き出し、読み込みをした場合には エクスポートスケールは12.5で、サイズは2として読み込まれます。

さらに150cmの人体モデルを別ソフトでシステム単位をmで書き出し、読み込みをした場合にはエクスポートスケールは0.75でサイズは2として読み込みます。


このZBrushにとって扱いやすいサイズの”2″は、

  • Dynamesh (ダイナメッシュ)
  • Dynamic Brush Size (ダイナミックブラシサイズ)

などの挙動を始め、様々な動作に影響します。代表的な例だとこちら。


ではZBrush側でこの読み込んだOBJに何も変更は加えず、そのままTool(ツール) > Export(エクスポート)で書き出してみましょう。

先ほどのOBJファイルと同様に書き出されたデータを見てみると不動点少数の関連で多少変動しているものの、7.874unitのデータであることがわかります。

box_size3.jpg

まとめると、

インポート時

1.ZBrushが扱いやすいサイズの”2″になるようにします。
2.元のサイズを2で割った時の数値をエクスポートスケールに格納します。

エクスポート時

1.現在のモデルのサイズにエクスポートスケールをかけて書き出します。


ZBrushのUnify(ユニファイ)という操作

ZBrushではZBrush内で扱いやすいサイズにする操作を”Unify(ユニファイ)”という風に呼んでいます。簡単に言うとサブツールをZBrushが扱いやすいサイズに再度戻す処理となっています。

これは例えば、スカルプトをした後にある程度全体のサイズが決まった時点で行います。

scale2.JPG

例えばこのようにモデルの全体サイズが大体決まったとしましょう。

現時点でかかとから首の付け根までのSizeが14となっています。そこで、Deformation(変形)> Unify(ユニファイ)を実行してみましょう。

するとサブツール単体が小さくなり、ZBrushの扱いやすいサイズの”2″となりました。ですが、これをモデル全体に実行したいわけですから、別の操作が必要となります。

62bb07e29062b8f0a1c9b8953d6af17a.gif

この解決方法はZpluginのScaleMaster(スケールマスター)を利用する方法です。

ScaleMasterのZBrushScaleUnify(ZBrushスケールユニファイ)をクリックすることでシーン全体に含まれるモデルの長辺がサイズ2になるように自動的に調整してくれます。

6d867b92d5d2c526417a57845d5cb986.gif

例えばこれでエクスポートスケールに75と入力すると書き出し時に・・・

サイズ 2 × エクスポートスケール 75 = 150 unitとなり、mm単位を利用しているソフトウェアでは150mmのデータとなります。

cmメートルを基準に利用しているソフトウェアに向けて書き出す場合には、エクスポートスケールに7.5と入力することで・・・

サイズ 2 × エクスポートスケール 7.5 = 15unitとなり、cm単位を利用しているソフトウェア読み込むと15cmのデータとなります。

ここまで読んでとりあえずよくわからん。っていう方はZBrushの公式動画でも解説していますので、これら3本を通してみるとZBrushのスケールに関する理解が深まると思います。


寸法周りの便利機能

上記の寸法周りが理解できたことで、様々な機能が活用できるようになります。

先ほどUnify(ユニファイ)をしたデータにExport Scale(エクスポートスケール)75を入力したことにより、150unitのデータとなりました。

Transpose Action Lineによる寸法表示

では、試しにTranspose Action Line(トランスポーズアクションライン)を引いてみると、画面左上にUnitの数値が表示されていることがわかります。 150unitのモデルに対して腕の太さが8unitとなっていることがわかります。

1unitをmmと想定している場合には、全体のモデルのサイズが150mmに対して8mmの太さであるということがわかります。

scale3.JPG

ちなみにこのTransposeActionLine(トランスポーズアクションライン)のUnitの単位は変更することができ、あくまで表示上だけですが、Preference(環境設定) > Transpose Unit(トランスポーズ単位) > Set Units(単位設定)でデフォルトのUnit表示からmm等に変えることができます。

cf9c80e7627a55e15533c6384a172994.gif

PolyPaint from Thickness (厚み検知)による判定

では、ZBrush2020より追加された機能を活用してみましょう。
上のエクスポートスケールに75のままのデータ(150unitで1unit = mmを想定したデータ)に対して、厚み判定で1mm以下を赤く表示するようにしたいとしましょう。

Quality(品質) 16

Min Thickness(最小の厚み) 1
Max Thickness(最大の厚み) 5と入力しましょう。
これらの設定はどういうことかというと

Quality = 1つの頂点から距離を測るレイを何個発するか

Min Thickness = ここで入力した以下のunit数の部位を赤く表示する。つまり1と設定している場合にはunit 1を赤く表示する。1unit = mmと想定しているため1mm以下を赤く表示するという指定。

Max Thickness = ここで入力した以上のunit数の部位を青く表示する。つまり5と設定している場合にはunit 5を青く表示する。1unit = mmと想定しているため5mm以上を青く表示するという指定。

e17522e4317777883db2d9fba6443a2a.gif

このように150mmの全体に対して赤の部分が1mm以下であるということがわかるため、強度的に何らかの対策を取らないといけないということがわかりますよね。

厚みを変更したら再度実行し、しっかりと厚みがあるかをチェックをしましょう。

また、この厚み検知のちょっとしたTipsとして色が7段階に分かれているため上記設定をそのまま利用した場合・・・

scale4.JPG

 

S = 1mm以下のエリア
C1 = 1mm以上2mm以下のエリア
C2 = 2mm以上3mm以下のエリア
C3 = 3mm以上4mm以下のエリア
C4 = 4mm以上5mm以下のエリア
C5 = 5mmのエリア
E= 5mm以上のエリア

という風に表示されるため、S=危険ゾーン E=セーフゾーン以外を5段階に分けて厚みを疑似的に見ることができる。

ちなみにこれらはカラーピッカーで色を選ぶことによって好みで変更が可能。
scale5.JPG

なので上の画像の
S 赤は1mm以下なので薄い!
C1ピンクはおよそ1mm
C2黄色は2-3mm
C3緑は3-4mm
C4薄い水色は4-5mm
C5うす紫色はおよそ5mm
E 濃い青は5mmを超えたからセーフ!
ということがわかる。

これを全体を150mm想定で、最小0.5 最大1.0とした場合には0.1mm単位での色分けが可能となる。髪の毛の出力などの厚みチェックに便利!


追記(2020年1月2日)

ツイッターを見ていると様々な手法で各自解決していたということがわかるので、少々追記をさせていただきます。

すでにエクスポートスケール値が変更されている場合のインポート挙動

まず、新規でツールのPolymesh3D(星)を読み込んでみましょう。こちらを見てみるとScaleの数値が0となっていることがわかります。

scale6.JPG

この状態で上の記述で読み込んでいたCubeを読み込むと7.874unitのデータなので、Scale値が7.874を2で割った数値となります。

scale7.JPG

これがデフォルトでの挙動とはなりますが、ほかのサブツールなどや、すでにスカルプトを始めたサブツールに新しくモデルを追加すると挙動が異なるのはなんででしょうか。

これはすでにスケールが設定されている場合には、その値を参考にするためです。

ではこれを理解するためにPolymesh3D(星)にScale 1を入力しましょう。

scale8.JPG

この状態で先ほどの7.874unitのCubeを読み込んでみましょう。

scale9.JPG

すると、7.874sizeのデータとしてそのまま読み込まれました。
Scaleの値は変動せずに7.874のデータとなっています。

では、これでPolymesh3Dに戻り、Scale数値を100にして同じく読み込んでみるとCubeが小さくなっていることがわかります。

scale10.JPG

先ほどの7.874unitのデータをスケール値の100で割った近似値の0.7876sizeとなっていることがわかります。

そのため、インポート時の挙動は

ツールのScaleが0である場合には

1.ZBrushが扱いやすいサイズの”2″になるようにします。
2.元のサイズを2で割った時の数値をエクスポートスケールに格納します。

ツールのScaleが0以外である場合には

1.ZBrushがOBJのUnit数値を見る。
2.OBJのunit値 ÷ ExportのScale値を計算する
3.ZBrush内にそのサイズで読み込む。

という処理となります。


Insert(挿入)  / Append(アペンド)の挙動

他のツールのモデルをInsert / Append する際には以下の処理となります。

InsertするツールのSize × Export値の計算をし、その合計値のSizeのツールとして挿入します。

つまり例A.

Polymesh3D(星)のSize 2 Export1のサブツールの下にInsertでSize 2 Export50のPolymesh3D化したCylinderをInsertすると現在のシーンではSize100となります。

さらに親のツールにExport値が設定されている場合には、そのSizeをExport値で割ります。

5ff6ee6411c5c4412c0148f0a2e424de.gif

要するにこういう計算となります。

1.挿入するサブツールのSize × Export値 を計算します
2.1の合計値を親ツールのExport値で割った数値をSizeとしてInsertします。

つまり上の例Aの親のツール(Polymesh3D)のExport値を2にするとSize 50のCylinderとしてInsertされます。

これがいわゆるInsert / Appendしたときに大きさがおかしくなると言われている所以ですね。
要するに、不具合でもバグでもなく、ZBrush側がこれらを考慮しているからですね。

単純にExportを無視してSize値だけを重視したInsertをしたい場合

では単純にSize値だけを見てInsertしたい場合には、Insert側のExport値を0にすることで、親ツールのExport値がInsertされます。

こんな感じになります。

こちらの御坂妹は”モデル全体”でSize2の Export 80のモデルとなっています。
InsertしたいPolymesh3DのSize10でExportを0にしてInsertすると・・・

1ff108b4af39ec54fe2e85b3335406af.gif

御坂のScale値との計算は無視してそのままSize10のPolymesh3DとしてInsertしました。

まとめるとInsert  / Appendは以下の挙動となります。

・親ツールのExport値が0の場合
挿入するツールのExport値を採用してSizeそのままで挿入する。

・挿入するツールのExport値が0の場合
親ツールのExport値を維持してSizeそのままで挿入する。

・親ツールと挿入するツール双方のExport値が0の場合
親ツールのExport値を1にして、Sizeそのままで挿入する。

・親ツールのExport値が0以外である場合
(挿入するサブツールのExport値 × 挿入するサブツールのSize) ÷ 親ツールのExport値=挿入時のサブツールのSize値として採用

もし、解説内容でカバーできていないトピックなどがありましたら、ぜひTwitterへリプをください。@kizakiaoi