まず告知。第六回和風展が開催されています。投稿期間は11日いっぱいまで。年に一度の本気展、ぜひ奮ってご参加ください。
じ、自分は鋭意作成中……(小声)。
さて、今回のエントリはろるふぃさんのブログ「POSERとHexagon中心に3DCGを楽しもう」の記事POSERのテキスタイル(バンプ)が保存できない不具合と解決法と、thattori43さんのブログ「TH Free Style」の記事ミレ犬お散歩グッズを受けての内容となる。お二人とも精力的にPoser活動なさっている方で、いつもブログを拝見しているのだけど、一点だけ勘違されていらっしゃると思しき箇所があるので訂正させていただくことにした。
ホントは自分はフォーラムに持ち込まれない限り、他の方のサイトの疑問などには応えないようにしてるんだけど。読んだ方が他にもいらっしゃるかもしれないので、ここは老婆心ということで容赦してほしい。コメント欄への書き込みでは説明し辛いし、メール等では他の読んだ方の目に触れなくなってしまうので。
問題の箇所は「UV情報が無いとバンプ関係のマテリアル設定がライブラリ登録時に消えてしまう」というもの。これが事実でないということ、なぜそんな誤解が起こったのかということを書いていこうと思う。
まず、UV情報を持たないオブジェクトを作成する。Shadeでプリミティブをポリゴン変換すると自動的にUVが設定されるので、WavefrontOBJのエクスポート時にUV値のチェックを外す。


これをPoserでオプションを全部外して読み込む。最初は小道具の状態だ。適当にマテリアルを設定しておく。


次に、セットアップルームで適当にフィギュア化。ライブラリに登録して、そのままロード。


このように、フィギュア化してもバンプが失われることはない。ちなみに、ここで使用しているのは3Dテクスチャの乱気流(Turbulence)ノードである。
では、何が問題なのだろうか。
問題を正確に把握してみよう。ろるふぃさんのブログでは「バンプ情報が消える」「バンプ関係のマテリアル設定が消えてしまう」と書かれているけれど、マテリアルのキャプチャを拝見する限り、バンプにノードは接続されている。ということは、Poser内部でも保存されたファイルの中でも「バンプにテキスタイルノードを設定するという情報」はちゃんと保持されているということである。だから、「情報が消える」という書き方は正しくない。「バンプにマテリアルは設定されているけれど、レンダリングすると描画されない」もっと正確を期すと、本当に描画されていないのか今の段階では断言できないので「マテリアルは設定されているけれど、レンダリングすると描画されていないように見える」と表現しないといけない。
揚げ足取りみたいに思えるかもしれないけど、正確に表現することはとても大事だ。物事を正しく表現するには、現象を正しく把握する必要がある。表現が正確でないということは、現象を把握できていないということである。それでは正しい判断はできないし、物事を正確に伝えることもできない。
というわけで、問題の現象は「UV情報を持たないジオメトリをフィギュア化して再ロードすると、バンプに接続したテキスタイルノードが描画されなくなったように見える」ということになる。
ここで、「ん?」「2Dテクスチャのノードって、UVがないと使えないんじゃなかったっけ?」と思ったあなたは正しい。(UVに関しての説明は過去記事のこの辺の中盤あたりにある)
2Dテクスチャに分類されているノードは、平面(2D)方向に変化する情報を描画する。平面といっても、イメージマップノード以外はXY平面やXZ平面やYZ平面を指定することはできない。ではどの平面に対して描画を行うのかというと、UV平面しかない。つまり、2DテクスチャはUV平面に対して描画を行うノード群である。まあイメージマップノードは除外されるけど、イメージマップでUV以外を指定したことのある人はかなりレアだろう。
というわけで、UV情報を持たないオブジェクトには、そもそもUVを参照する2Dテクスチャノードが描画できるわけがないのである。
ではなぜ「小道具では正常に描画できてたのに、フィギュア化でバンプが消えた」と誤解されるような現象が起こったのか。
結論から言うと、この文章に間違いが三つある。
一つ、そもそも小道具の時に正常に描画されていたわけではない。
一つ、フィギュア化しても消えたわけではない。
一つ、バンプ以外でも同じことが起こる。
以下実証。UVを持たない小道具に対してテキスタイル(Weave)ノードを接続する。


普通のアイテムに対してテキスタイルノードを使ったことがある人なら、これが正常な描画だとは思わないだろう。Poserの基本小道具(Primitives)内にあるボールを使って比較してみる。もちろんボールにはUVが設定されている。


UV情報を持たない小道具では、パラメータを変更しても内容が反映されているようには見えない。ではバンプ以外、テキスタイル以外ではどうだろうか。拡散色(Diffuse_Color)に接続してみる。

まったく同じ設定のノードを接続しても、UV情報を持たない小道具では異様な描画がされている。そもそも「その画素がUV上のどの位置に存在するか」が定義されていないのだから、いくら変位させるかも、何色で塗りつぶすのかもPoserが判断できるわけがないのだ。UV情報がないということは、「定義されていないから、不定」ということである。それを無理矢理描画させるものだから、イレギュラーな(不正な)描画になっている。※
さて、フィギュア化したオブジェクトに対して2Dテクスチャノードを適用してみる。


たしかに2Dテクスチャのノードが反映されなくなった……と、判断するのは誤りだ。本当にノードの情報が反映されていないのなら、イメージマップノードの「テクスチャの黄緑色」が描画されているはずがないからである。
では、フィギュア化によって一体何が変わったのだろうか。
Poserのインポートで作成されたオブジェクトは、その内部にジオメトリ情報を保持している。小道具としてライブラリに登録しても、ジオメトリ情報は小道具ファイルの中のgeomCustomという部分に保存されている。それに対し、セットアップルームでフィギュア化したフィギュアは、ライブラリに登録するとジオメトリファイルを別に出力する。つまり、フィギュア化したオブジェクトは、参照しているジオメトリが小道具であった時と異なるのである。
短いジオメトリ(8頂点の立方体)で試してみよう。左はインポート後そのままライブラリに小道具として登録したもの。右はフィギュア化してから、ライブラリに登録したときに生成されたもの。

頭に「v」とついているのが頂点座標、「f」が一つ一つの面が参照している頂点番号/UV頂点だ。そして、頭に「vt」とついている行がUV値である。
フィギュア化したジオメトリには、UV値が一つだけ作成されている。そして、すべての面のUV頂点が同じUV座標 (0, 0) 、すなわち左下のただ一点を参照している。マップの同じ位置を参照しているのだから、凹凸や色の濃淡が生じるわけがないのだ。
フィギュア化したときにUVが生成されるのは、無用なトラブルを避けるためだろう。その結果、今まで不正な描画がされていたものが、正常な描画を行うようになったのだ。たまたま不正な描画の方が意図した結果に近く、正常な描画の方が意図した結果ではなかったために、それを不正な結果だと誤解してしまったのだろう。
以上のことをまとめると、
- UV情報を持たないオブジェクトに対して、UV情報を参照する2Dテクスチャのノード群を適用すると、不正な描画が発生する。
- フィギュア化でライブラリに登録したときに作成されるジオメトリは、元のジオメトリがUV値を持たない場合、自動的に (0, 0) のUV値を生成する。
ということになる。
UV値を持たないオブジェクトに凹凸や濃淡などつけたい場合は、2Dテクスチャではなく3Dテクスチャを使用すればいい。2Dテクスチャが(UV)平面方向に変化する情報を描画するノードだとすれば、3Dテクスチャは文字通り三次元方向に変化する情報を描画するノードである。つまりUVではなくジオメトリのXYZ座標によって内容が変化するのだ。縫い目やタイルのような2Dテクスチャと同じ描画はできないが、表面の粗さを表現するだけなら十分である。
作成したジオメトリにUV情報を付加するかどうかは、作者の任意による。ただ、もし配布するつもりがあるなら、一言「UV展開はしてません」程度に書き添えておいた方が親切だろう。巷のアイテムはUV展開されているものが大半だからだ。気に入ったアイテムのオリジナルテクスチャを作ろうとして、いざUVMapperを開いてみたら真っ白、となると「もう二度とDLしねえよ ヽ(`Д´)ノ」という気分になりかねない(実際に聞いた話・笑)。
なお、どうしてもフィギュアにUV情報を持たせたくない、という時はフィギュア化前のジオメトリを使用すればいい。PoserのWavefrontOBJエクスポートは法線情報は自動的に生成するが、UV値は生成しない。
ちなみに自分は、フィギュア化で作成されるジオメトリは使用しないことにしている。以前のバージョンのPoserで、ポリゴンが欠落したり別のグループに割り当てられてしまうバグが発生するものがあったからだ。あと、フィギュア化するとジオメトリがパーツごとに分割されてしまう。これが個人的に不便なので、いつもPoser上でグループを整理したあと、フィギュア化直前に出力したものを使用している。
間違えること、失敗することは悪いことじゃないと思う。大切なのは疑ってかかること、何よりもまず自分自身を疑うことだ。他人の言っていることは正しくないかもしれない。悪意はなくとも正確ではないかもしれない。そして、自分の考えや行動はもっと間違っているかもしれない。もっと他にうまいやり方があるかもしれない。常にそう考え続けることはしんどいけれど、そうでなければ人間はすぐに自分の判断が正しいという考えに溺れてしまう。
考えて疑って、注意深く観察して、誰がどうやっても動かしようのない事実だけを積み上げていく。自分が正しいことを証明するのではなく、自分が間違っていることを証明するのだ。その結果間違いであることが証明できなかったなら、今のところはそれが「暫定正解」になる。そしていつか間違いであることが証明されたなら、新しい暫定正解に取って代わられる。古い間違いは決して無駄ではなく、新しい暫定正解をより正解に近いところに押し上げるのだ。
検証というのは、そういうものだと思う。