2008年02月25日

混合栓のハンドルを作ってみた その9 modo 301

さて、溶接跡みたいになっちゃったディスプレイスメントマップの続きだ。

まず最初にチェックしなくちゃならないのは、オブジェクトからベイクする時の計測範囲だ。ご存知のように一部の画像フォーマットを除いて色を表わす数値にマイナスは存在しない。だから現在のレベルより窪んでいる状態をディスプレイスメントマップで表わすためにはテクスチャレイヤのプロパティの上限値と下限値を調節して、色を表わす数値の範囲をマイナス側にも振ってやらなくちゃならない。前回自分は下限値−100%、上限値100%にした。こうすることで、256段階のグレースケールなら0が−100%、255が+100%になり、その間の数値は比例で按分される。ディスプレイスメントマップの場合この値にマテリアルのディスプレースメント距離を掛け合わせたものが実際の変位量になるわけだ。

しかしここにひとつの落とし穴があった。自分は範囲をマイナスに振っておけば、ベイクの時に計測される範囲もマイナス側に振ってもらえて、指定した距離より遠いものはその距離でスライスされて飽和するものと思っていた。でもそれは大きな勘違いだった。

オブジェクトからベイクのためにセットアップしたシーン例えば1m角の立方体とそれを複製して、2枚の面を50mmインセットしてからそれぞれ+100mmと−100mmオフセットした左の画像のような立体を重ねてオブジェクトからベイクでディスプレイスメントマップをベイクしてみた。ベイクしてみて気が付いたんだけど、オブジェクトからベイクをすると画像の上限値と下限値は自動的に−100%と+100%に設定されるようだ。親切機能だけど気をつけないと酷い目に遭いそうな機能だな。まあそれはいいとして、ベイク時の距離は凹凸のオフセット距離である100mmにしてみた。

100mmでベイクこれがその結果。凹凸が無い部分が50%グレーになったって事は上限下限値の設定が効いているって事で、変位距離0が色の中間値になっているわけだ。そして左側に真っ白い領域があるのは100mm出っ張っている部分だ。あれ?−100mmで窪んでいる部分は?ここでようやく重大な事実に気が付いた。範囲外のものはサーチされないんだな。前に試して確認していたつもりが勘違いしていた。オブジェクトでベイクで現れるのは、指定した距離の範囲で、それを超えたものは無いものとしてオフセット距離0になる仕様だったんだね。色の段階が256段階の偶数で、0がある都合、マイナス側はちょっと足りなくなって100mm離れたポリゴンはサーチ範囲外に行ってしまっているわけだ。そしてサーチ出来ないので当然ディスプレイスメントマップは50%グレーで塗りつぶされたって訳だ。

101mmでベイク試しに範囲を101mmにしてベイクしてみたのが左の画像だ。今度は窪みもちゃんと現れている。このことから範囲はちゃんととらないと、範囲を超えた部分で大きく凹凸がブレる事態が起きることが容易に想像できる。
長々と書いてきたけど上記の勘違いは今回のボコボコな縁にはあてはまるのだろうか?残念ながらサーチ範囲10mmはかなり大目にとっていてて、実際には5mm程度で間に合うくらいの切り欠きだ。

ところで冒頭にも書いたけどベイクした時に得られた数値はどのように変位距離に変換されるかと言うと、まず色の数値の範囲である0〜255の値を下限上限の範囲から、パーセンテージに直される。今回は−100%〜100%が下限上限の設定なので、

変位量=(ベイク色×(上限−下限)÷色のレンジ+下限)×ディスプレースメント距離

=(ベイク色×(1−(−1))÷256+(−1))×ディスプレースメント距離

のようになるのだと思う(この式は数値の丸め誤差とかまでは考慮していないので実際にベイクで求めた値とは±1くらい誤差が生じると思う)。この変位量が計測に使ったメッシュと貼り付けるメッシュの間の距離と等しくなれば、ディスプレースメントマップで変形したものと、計測に使ったメッシュの形状が同じになるわけだ。
計測距離範囲を10mmにしてベイクした場合、実際の変位量が5mmだったとすると、ベイク色は0〜255を−10mm〜10mmとして計算して、

((5−(−10))÷(10−(−10))×256=192

この192というベイク色が5mmの変位量に戻るためにはディスプレースメント距離は計測距離範囲と同じ10mmにしないとならないわけだ。

変位量=(192×(1−(−1))÷256+(−1))×10

=5mm

前回のレンダリング結果の切り欠きが妙に浅かったのは、計測距離範囲を10mmにしてベイクしたにも拘らず、ディスプレースメント距離を10mmにしていなかったのが原因のようだ。

距離を調整してレンダリングこれが修正したもの。切り欠きの縁は出て来たようだ。でもUV境界に溝が出来てしまっている。

UVの継ぎ目を拡大このUV境界に出来てしまった溝を解消するために、今度はスカルプトのユーティリティータグにある「UVの継ぎ目を拡大」で境界部分の画像を広げてみた。溝は解消して行くようなんだけど、それはそれでまた新たな問題が発生しているような感じだ。

高解像度のテクスチャかなり煮詰まって来たのでややこしい部分を出来るだけ小さくする事を考えてみた。それにはマップを高解像度にするのが一番。そこで思い切って4096×4096にしてベイクしてからUVの継ぎ目を拡大したのがこの画像。ずいぶんマシになったけど・・・。

膨らませてからベイクしてみたそこで今度はベイクされる側のメッシュをスケーリングして、切り欠きを作ったメッシュから少し離してみる事にした。左の画像はスケールで膨らましてからベイクした結果。おーなんだかいい感じになって来た。

以上いろいろ奮闘してみたんだけど、結論から言えば、マップ境界を変えるのが一番手っ取り早い。ミもフタも無い話だけどね。

変更したUVマップこれは切り欠き部分にUV境界が来ないようにして、なるべくマップを切らないようにUV展開しなおしたものだ。

UVマップの境界位置を変更したレンダリング結果これを使ってベイクしたマップでレンダリングしたのがこれ。今までの苦労が嘘のようにいとも簡単に仕上がっちゃった・・・。しかもこの場合はマップの不連続エッジでの溝も出てきていない感じだ。以上を考えるとディスプレイスメントマップ用のUVマップはあまり急峻な変動位置で分断しないほうがいいみたいだな。逆に言うと、この問題はUVマップの不連続境界での誤差によるノイズなわけだから、マップ境界をアンチエリアシングする代りに境界部分の計算用に分断されている相手側のマップを持ってきて、繋いで計算すれば済む話なんじゃないだろうか?

合成マップによるレンダリング結果そこでマップを複製して2つ作り、それぞれ境界部分をずらしてベイクし、合成してみた。これがそのレンダリング結果。急いで処理したのでこの結果を持って語るのはちょっと怪しいかも知れないけど、予想は外れている感じだ。どうもアンチエリアスだけの問題でも無さそうだな。この境界問題はもう少し研究してみる必要がありそうだ。時間がなくなったので今回はここまで。
今回の結論は、「無理して難しいことしないでUVマップを作り直せ」って事で、ひとつwww。



それではまた次回。

スクリプトまとめページ( Down Load はこちらから)  

カテゴリー別ページ 



take_z_ultima at 14:36│Comments(0)TrackBack(0)modo | CG

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives