2008年06月

2008年06月30日

ちょっと仕様が変わったvertMap.setValue modo 302

UVマップ関係のスクリプトを302にあわせて修正していたら頂点マップの値を変更するコマンドであるvertMap.setValueの仕様が変わっている事に気付いたので書いておくよ。

何が変わったのかと言うと、不連続UVに対しても動作するようになっていた。しかもsetPvalueと違ってポリゴンが選択されていてもへっちゃらで動く。

fig01

これはいい。

不連続UVマップ用のvertMap.setPValueはいっぺんにUV値を変更できる点が有利だけどテキストに変換して与えなきゃならないし、ポリゴンが選択されてると動かない(毎回この仕様を忘れて酷い目に遭うんだよな・・・)し、もう使わないでもいいな。

それではまた次回。

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

カテゴリー別ページ



take_z_ultima at 12:03|この記事のURLComments(0)TrackBack(0)modo | CG

2008年06月29日

ディスプレースメントマップにメッシュをフィットさせる modo 302

みんなお中元の手配はもう済んだ?東と西で送る時期が違うらしいな。

さて、法線マップを貼り付けるメッシュを前回はプッシュ+コンストレイントで調整したわけだけど、それなりに手間だったと思う。そこでディスプレースメント変形後のポイント位置を取得してオリジナルのポイントをその位置まで動かすスクリプトを作ってみたよ。これがあればスカルプトでディスプレースメント変形したモデルと法線マップを貼った軽いモデルとの間の形状誤差を少なくする事が出来るよ。

原理はシンプルで、アイテムの複製を1つ作ってそのポイント全てに選択セットを個別に設定する。そしてそのアイテムをさらに複製してフリーズする。これでディスプレースメント変形に近いメッシュが得られる。しかも先に設定しておいた選択セットはそのまま残っているので、これを使って変形前と変形後のポイントの対応を確定できるので、フリーズ側からポイントの位置を取得して、変形前のポイントを取得した位置に移動させる。全部終わったらフリーズしたアイテムは削除しておしまい。

以上がスクリプトの動作なんだけど、何故だかわからないんだけど、スクリプトの中でアイテムの複製に続けてフリーズを使うと、ディスプレースメントを反映したフリーズが出来ない。仕方が無いので今回はコマンドにパラメータを与えないで実行して、スクリプトの実行途中でダイアログを表示させて処理している。ちょっと余分な手間だけど、まあ「ディスプレースメントをフリーズ」にチェックが入っている事を確認してOK押すだけだから辛抱してくれ。

それからフリーズするのでちょっと時間がかかるのと、あんまり細かいメッシュに対してこのスクリプトを実行すると、メモリーを食うから気をつけてね。実行前には必ず保存してね。

fig01操作手順をGIFアニメにしたよ。まずはスクリプト部分。ちょこっと時間がかかるのが難点。
スクリプトの実行が終了すると、ディスプレースにフィットした複製アイテムが作成され、ディスプレースメントはOFFになる。

元のオブジェクトを残してあるのは法線マップをベイクするためだ。

fig02スクリプトで作成されたメッシュに新しくマテリアルを設定して、UVマップを新たに作成して古いUVマップをコピペする。古いUVマップは他のマップを減りつけたりベイクで変換したりするのに使うのでとっておく。メッシュが変形されたのでそれにあわせてUVマップをリラックスツールで修正して密度が偏らないようにする。これにブランク画像を付けてエフェクトを法線にする。そしてスクリプトでOFFになったオリジナルの方のベクターディスプレースメントマップをONにしてからベイクする。

基本マテリアルとかはオリジナルから複製してやればいいね。

レンダリング結果

それではまた次回。

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

カテゴリー別ページ



take_z_ultima at 12:03|この記事のURLComments(0)TrackBack(0)modo | CG

2008年06月28日

3dsMaxにデータを持って行ってみた その13 modo 302 3dsMax2008

さて、前回書いたけどスカルプトしたモデルを法線マップで持って行くと下の左の画像のように、陰影はいいんだけど輪郭が合わない事になっちゃう事があるわけだ。だから通常スカルプトしたオブジェクトはディスプレースメントマップとかで持って行く事になるわけだけど、それなりにデータが重くなるし、ベクターディスプレースメントマップなんかは持って行けないわけだね。

メッシュ補正比較

下の画像はスカルプトで加工された手と、ディスプレースメントマップを外したオリジナルのメッシュを交互に表示したものだ。法線マップだけだと凹凸は記録できるけど、このメッシュの凹凸の差はそのまま残ってしまうわけだ。

スカルプトされた手とその元のオブジェクト

そこでこの差をなるべく少なく目立たないようにしてから法線マップを貼るようにする事が考えられる。

一番簡単な方法はディスプレイスメントマップを有効にしたままでのメッシュのフリーズだ。

メッシュをフリーズ

これならとても簡単に出来るわけだけど、ポリゴン数がかなり増大する事と、以前に書いた通りポイントが分離したりくっついたりする事があったりもするので、なるべく避けたい。

そこで次の策として考えられるのが今のメッシュ自体を変形させて、ディスプレースメントによる変形分を吸収してしまおうという事だ。幸いmodoにはpush+背景コンストレイントと言う便利な技があるので使わない手は無いね。

下の画像は背景コンストレイントを使って作業をするためにレイヤー分けしたアイテムリストだ。スカルプト済みのモデルHand_lowpolyを2つ複製して、1つをフリーズ用のオブジェクトとして名前をFreezeとし、もう1つの方は法線マップをベイクしてmaxに転送するためのオブジェクトとしてHandと名前を付けた。

そしてFreezeの方をフリーズしてスカルプト状態でポリゴンを再分割し、Handの方はポリゴンのマテリアルを別のもの(Hand)に割り当て直した。

レイヤー構成

フリーズしたメッシュはポイントが分離したりするので、ポイントの結合で結合し直しておく。

結合

フリーズしたメッシュはSDSが解除されちゃってるのでTABキーを押してSDS化してから結合を実行してね。そうすればポイントが繋がっているのか分離しているのかがメッシュの怪しいひきつりなんかでよくわかるよ。距離は0にしておいてビューポートをクリックしてメッシュの状況を見ながら距離を上げて行ってね。下の画像はポイントが分離した時に現れるSDSのひきつり。

ポイントのひきつり

こういうのがなくなる様にポイントを結合するわけだけど、あんまり距離を増やすと今度は余計なところまでくっついちゃうから注意してね。それから、今回の腕のように開口部があるとそこからpushしたメッシュがこぼれ出しちゃうので、下のGIFアニメのように縁をちょっと伸ばしてメッシュがこぼれないようにしておくといいよ。

縁を伸ばす

お膳立てが出来たのでいよいよ背景コンストレイント+プッシュでメッシュを変形させる。

背景コンストレイント+プッシュ手順は左の画像をクリックしてみてね。プッシュでメッシュを押してフリーズしたメッシュに押し付けたいところだけど、スカルプトによって出っ張る部分もあればへこむ部分もあるので一方向に押すわけにもいかない。仕方が無いので先に膨らませておいて、そこでコンストレイントをONにして引き戻してフィットさせてみた。

この方法でやっても所々フィットしないで残ったりするので、細かいところはコンストレイントをONのまま「T」キーを押してエレメント移動でフィットさせていく事になる。ただし、下の画像は指先を拡大したものだが、SDS時の位置はフリーズ曲面と比べてずいぶんずれている。SDSを解除するとメッシュの頂点はほぼフリーズ曲面上にあるので、これはメッシュ密度が不足しているせいだと考えられる。

指先

これを修正するにはコンストレイントを使わずに目分量で指先を加工してフィットさせるか、SDSウェイト値を変更するか、メッシュ密度を上げるかという事になる。目分量は避けたいし、ウェイトはmaxに持って行けないので、メッシュ密度を上げる方法で対処することにした。ループスライスなどでエッジを増やしてある程度密度を上げたらプッシュで膨らませてまたコンストレイントをONにして引き戻す方法でフィットさせる。最終的な微調整はエレメント移動+コンストレイントで行う。

指先(修正後)

こんな感じでフリーズ曲面に近づける事が出来た。ただしメッシュ密度を変えたし、メッシュの形状も変形したので、UVマップもかなり厳しい状態になっている。

指先のUVマップ

そこでリラックスツールで指先のマップを広げてテクスチャの密度を増やしてやる。リラックスツールは境界を固定しておいて反復回数を100くらいにしておいて、各ポイントをクリックして水色のポイントを出して、そのポイントを引っ張って広げて行く。

リラックスでUVマップを広げる

これが処理後のUVマップね。

処理後のUVマップ

これで下準備は済んだので、後は前回と同様に法線マップをベイクして、プッシュで広げたメッシュをmaxに送り込んでテクスチャに法線バンプを仕込んでレンダリングしたのがこの画像の右側の手だ。

メッシュ補正比較

メッシュがベイク対象に近付いた事もあって、境界部分も目立たなくなっている。

それではまた次回。

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

カテゴリー別ページ



take_z_ultima at 12:26|この記事のURLComments(0)TrackBack(0)modo | 3ds Max

2008年06月27日

3dsMaxにデータを持って行ってみた その12 modo 302 3dsMax2008

法線マップを一通り見て来たので、いよいよ手をmaxに持って行ってみる。

手の法線マップを作成まずはオリジナルのオブジェクトを複製して別のマテリアル名を付け、UVマップも新規に付けて古いものをコピーして元は削除する。新規に付けたマテリアルグループに、このUVマップにブランク画像を割り当てたものを入れる。その画像のエフェクトを法線にしてオブジェクトからベイクでベイクする。

これで下のような画像が出来上がる。

ベイク結果

手のオブジェクトはどちらか片方を残して削除し、余計なモーフマップやウェイトマップなんかが付いているのでそれらを削除する。さらに爪の部分にUVマップがついていないので、手本体と別レイヤに分けるか、それとも「ApplyDummyVMap.py」を使ってダミーのUVマップを付ける。手のUVマップにディフューズカラー以外のマップが割り当てられているとFBX書き出し時にUVマップがうまく書き出せないので、テクスチャに付けた画像は全部削除するか、ディフューズカラーに設定する。そして手のオフジェクトをFBX形式で書き出してmaxで読み込む。その時座標変換はせず、オブジェクトのみ読み込む。読み込んでmaxが落ちるようならVMAPに余計なデータが付いている事もあるのでチェックする。

FBX読込

maxでの設定読み込んだオブジェクトは選択してモディファイアリストから「ターボスムーズ」を加えて滑らかにしておく。そしてマテリアルに法線バンプをタンジェントマップで設定してY方向をひっくり返す。

そしてレンダリングしてみる。

さて、下の左側が今回のレンダリング結果だ。見て分かる通り爪と指が乖離しているし、modoのスカルプトで付けた凹凸は法線マップでは陰影にしかならないので、輪郭が何とも貧相な感じになってしまった。法線マップで持ってくるにしてももう一工夫が必要って事だ。次回は下の画像の右側のようになるようにその一工夫をしてみる。

メッシュ補正比較

それではまた次回。

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

カテゴリー別ページ



take_z_ultima at 12:11|この記事のURLComments(0)TrackBack(0)modo | 3ds Max

2008年06月26日

3dsMaxにデータを持って行ってみた その11 modo 302 3dsMax2008

法線マップをmodoから書き出してmaxに読ませるってだけで随分と話が長引いちゃってるなぁ。

でもどうやら法線データ自体はmaxとmodoでそれ程の差はないみたいだな。この仕様って誰が決めたモンなんだろう?。

まあそれは置いておいて、法線マップは曲面上のある点における垂直なベクトル(X,Y,Z)を色のRGB成分に置き換えて表わしたもので、今までワールド法線マップで作ってきた画像は下の座標軸の関係になっている。

vector map

法線ベクトルがZ軸プラスの向きならベクトルは(0,0,1)で、これを1色あたり8bit(0〜255)のRGBで表わすとRGB(128,128,255)のようになるわけだ。0〜255の数値だとマイナスが無いから真ん中の128付近を0と見なして、0を−1、255を+1にマッピングしてやってるわけだ(128が0なのかどうかはちょっと怪しいけど・・・)。modoではRGBが0〜255を0〜1の実数で表わしているからRGB(128,128,255)はmodoのRGBで表わすならRGB(0.5,0.5,1.0)なんだな。これが法線マップでよく見かけるちょっと薄い青色の正体でわけだ。前回もローカルの法線マップで出てきたこの画像の殆どの部分を覆っているのがこの色だ。

ベイク結果

このローカルな法線マップは貼り付けられたポリゴンを基準としたローカル座標で法線を表わす仕組みで、Z軸プラスの向きがそのポリゴンの本来の法線ベクトルと同じ向きになるようにマッピングされる。だから法線ベクトルがオリジナルに対して変化が無ければこの色で塗られるわけだ。そして他の軸はと言うと、画像を貼り付けているUVマップの軸に依存していて、下の画像のようになると考えられる。上の画像の四角い突起の側面は基準面からほぼ45度傾いているので、例えば薄い水色の部分の法線ベクトルは(0,1,1)方向を向いていて、ベクトルの長さを1とするとだいたい(0.0,0.71,0.71)のベクトルになる(長さの公式を使ってX,Y,Zの成分を2乗して足し合わせてルートで開くとベクトルの全長が出るからその値でX,Y,Zの各成分を割れば方向は同じで長さが1のベクトルが出来る)。それをRGB値に変換すると、(0.5,0.86,0.86)になるわけだ(−1〜+1を0〜1にマッピングするには1を足して2で割ればいい)。

タンジェントベースの法線マップ

そしてこの法則にのっとって作成したのが下の画像だ。見ての通り上で表示した法線マップの画像の一部分を切り出したような配色だ。中央が平らで、それを囲むように45度ずつ各軸に対して傾いた面が貼ってある感じだ。

テストパターン

これを板ポリに貼り付けるだけで45度の側面を持つ台形が出来るわけだ。実際modoで板ポリに法線マップとして貼り付けてレンダリングしたのが下の画像だ。

modoでのレンダリング結果

そしてこれをmaxに持って行ったわけだけど・・・何とも不可解な現象が起きた。

maxで平面を1つ作ってZ方向を向けて配置した。そしてテストパターンを下の画像のように貼り付けた。これで法線マップのローカル座標軸とワールド座標軸座標軸は一致しているわけだ。

maxでの画像のマッピング

そこでまずはワールドとして法線バンプを貼り付けてみた。

パラメータロールアウト

レンダリング結果はこれ。左斜め上からライトを当てていて、ちゃんと陰影があっている。これはローカルXYZにしても同じ結果になる。

maxでのレンダリング結果

そこで今度はタンジェントにしてみた。

パラメータロールアウト

するとなぜか陰影がおかしな方向に・・・。左右の陰影は同じだけど前後の陰影が入れ替わってる。

maxでのレンダリング結果

緑をフリップにチェックを入れると

パラメータロールアウト

元の状態と合致させられた。

maxでのレンダリング結果

と言う事は、maxのタンジェントマップの座標系はデフォルトの状態でY軸だけ反対向きって事になるのかな?ちょうどこんな感じ。

maxのタンジェントベースの法線マップ

なんでワールドやローカルと軸が逆になるのか不明だけど、仕様なら仕方ないな。デフォームしてメッシュが変形するような場合はこの方法で貼らないと法線が追従しないからね。オブジェクトアニメーションまでならローカルXYZで充分だけどね。

それではまた次回。

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

カテゴリー別ページ



take_z_ultima at 12:03|この記事のURLComments(0)TrackBack(0)modo | 3ds Max
Archives