2008年05月

2008年05月31日

UVマップの形を変えないでSDS再分割する その2 modo 302

前回作ったスクリプトをマルチUVマップに対応させたよ。

操作として、起動時にUVマップを選択する必要が無くなり、より簡単に使えるようになった。

未だにポリゴンを部分的に選択して再分割するのには対応出来ていないけどね。

公開したコードは開発途中の部分を含んでいるけど、その部分は今のところ封印してある。以下がその部分の話で、部分的に再分割する場合の話だ。同じメッシュを複製して一方をSDS再分割し、他方をフリーズした場合、接続されているメッシュ単位で分割した場合はポリゴンインデックスが同じになるのでそこから対応が辿れたんだけど、部分的に分割した場合は、それも異なってしまって手がかりが無くなってしまった。仕方が無いので選択セットを使うことにしてみたんだけど、ポリゴンの選択セットはポリゴン自体が複数に分割されるので、同じ選択セットのポリゴンでも多対多対応になってしまって、簡単には個別の対応が特定できない。それとポリゴンの選択セットは設定するとポリゴンに振られているインデックスが入れ替わってしまうという恐怖の仕様があるので、ポリゴンのインデックスリストを取得して、それを使って選択セットを割り当てる場合は、インデックスを大きい順に並び替えて、大きい方からやって行かないとムチャクチャな事になる。何で大きい順にやると大丈夫かと言うと、選択セットを割り振られたポリゴンのインデックスはそこから抜けて、空席になったところに後ろの番号のポリゴンが全部1つずつずれて入ってきて、一番最後にそのポリゴンが入るようになるので、影響を受けるポリゴンのインデックスは、選択セットを適用したポリゴンインデックス以降のものだけだからだ。だから大きい方から処理すれば、それより小さい番号のインデックスは影響を受けないから続けて作業が出来るわけだ。

ところでこの選択セットを使う方法なら、複製前に設定しておいて、複製後のメッシュをフリーズしたものとSDS再分割したものにもそのまま受け継がれるので、2つのメッシュの対応を探る事が出来るんだけど、ポイントに選択セットを付けておいても、分割によって新しく出来たポイントはどの選択セットにも含まれないので見つけられるポイントは全体の1/4程度にとどまる。だから残りのポイントの対応を探らなきゃならないのと、不連続UVとしてUV値を取得してコピーしなきゃならないので、ポリゴンの対応も探らないとならない。

fig01左の画像の黒い点が元のポリゴンの4頂点とすると、これを再分割すると青い点と赤い点のように各辺を2分割する点と、それを結ぶ中心点が出来上がる。

元からある4頂点は複製前のメッシュに対してポイントの選択セットを使うことで、再分割したものとフリーズしたものの頂点の対応を求めることが出来る。1つのポリゴンは複数枚に分割されてしまうが、ポリゴン選択セットを使うことで、分割前のポリゴンどうしの対応は分かるので、それを使って分割されたポリゴンの頂点インデックスのリストを取得して、全てのポリゴンが共有するポイントを求めれば、図の赤いポイントが求められる。残った青い点は、エッジに選択セットを適用しておくことで、黒い点2つとそれを結ぶ青い点の合計3つの点を結んだエッジを個別に選択出来るようになるので、黒い点はポイントの選択セットによって対応がわかるので、それとあわせて青い点を特定することが出来る。

これで3種類のポイント全てにおいてSDS再分割メッシュとフリーズメッシュの関係がわかるけど、UVマップは不連続マップを操作しないとならないので、ポリゴンの対応も分からないとならない。

そこで片側のポリゴンを1つ選択し、そのポリゴンを構成するポイントのリストを取得し、そのポイントを直前に作ったポイントとポイントの対応テーブルで調べて相手側を選択し、ポイントからポリゴンに選択を変換し、相手側のポリゴンを見つけ出す。これを選択されているポリゴン全てに行えば、ポリゴンの対応も頂点の対応もわかるので、あとはUV座標をコピーしてくるだけだ。と、思ったら、部分選択した場合のSDS再分割とフリーズでは結果がこんなに違うことがわかった。

fig02

左の画像をクリックすると2つの分割の比較が見られるよ。部分選択してフリーズすると左の画像のように本体から分離しちゃうんだな。こりゃ拾い上げられないかな?うむむ・・・



それではまた次回。

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

カテゴリー別ページ



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

2008年05月30日

UVマップの形を変えないでSDS再分割する その1 modo 302

さて、前回SDS再分割したUVマップをフリーズしたUVマップにあわせたらSDS再分割の時にずれたマップが綺麗に貼り直せたので、その手順をそのままスクリプト化してみたよ。

今回のバージョンの機能の制限として、再分割がうまく行くのは連結されているポリゴンメッシュの単位での再分割の場合のみ。通常はそれだけでOKだと思うけど、ゆめゆめポリゴンを一部分選択して再分割しようと思わないようにねwww。実はアイテムごと複製してSDS再分割したメッシュとフリーズしたメッシュで対応するポリゴンのインデックス番号が一致することがわかったので、それをあてにして作ったんだけど、繋がっているメッシュの一部分だけ再分割したものとフリーズしたものでポリゴン番号が異なるみたいなので、そのままこのスクリプトを使うとポリゴンの対応がむちゃくちゃになって、UVマップが酷いことになってしまうようだ。

それからUVマップも選択したもの1枚のみが補正される。今回は複数のUVマップには対応していない。

その機能制限を除けば動作がのろいSDS再分割として機能するよ。

例えば以下のようなメッシュを用意して、

fig01

これにSDS再分割を2回かけると以下のようになってしまう。

fig02

これはUVマップの方が、SDSを解除した状態で再分割され、そのメッシュをSDS化した曲線として再定義されるので、メッシュが細かくなるほど非SDSのUVマップ形状に近付いて行ってしまうからだ。

それに対して下の画像はSDSをフリーズしたもので、UVマップの形状は元のままでポリゴンに戻っている。だから貼り付けてある画像はそのまま歪まずに表示されている。これをSDS化するとメッシュ自体は縮む。

fig03

そして以下の画像が今回作ったスクリプトを2回適用したものだ。

fig04

形状自体はSDS再分割されたものだけれど、UVマップはフリーズと同じ形状なので、再分割後のマップが歪んでいない。 

使い方は、再分割したいメッシュを連結単位でポリゴン選択するか、メインレイヤ全体を再分割するなら全く選択しないで、フリーズさせたUVマップと合わせたいUVマップを1つ選んでスクリプトを実行するだけ。これでSDS再分割が1回行われ、UVマップの形状が調整される。

メッシュが細かいときには処理にそれなりに時間がかかるから注意してね。

それではまた次回。

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

カテゴリー別ページ



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

2008年05月29日

フリーズとSDS再分割 のUVマップ modo 302

以前にSDS再分割をかけるとUVマップが歪んでテクスチャマップがずれる話を書いた。先日その事についてcolmさんからご指摘を戴いて確認したところ、SDS再分割では歪んでしまったUVマップがフリーズではほぼそのまま保存される事がわかった。

フリーズは自分の理解では、SDSの曲面をビューポートに表示させるために生成されるメッシュをそのまま実体化させるものなので、確かにフリーズしたものとSDSのものとはほぼ近い形状になる事が期待できるわけだ。UVについても素直に考えればまさにその通りなわけだ。

fig01左の画像をクリックすると、フリーズ前と後(サブディビジョンレベル2)、そして後のメッシュをSDS化した時のマップの変化をGIFアニメで確認出来るよ。フリーズなら、マッピングがずれずにメッシュを細かく出来る事がわかった。ただし、フリーズ出来るのはメッシュをSDS化してあるからで、SDSじゃないものはフリーズしても変わらない(当たり前だけど)。まあそんな時にはポリゴンの再分割コマンドを使えばいいんだけどね。SDSじゃなければUVマップが歪む心配は無い。

fig02こっちはSDS再分割した場合ね。以前に確認した通り、UVマップはSDSがかかる以前の形状がそのまま再分割されて、そのメッシュがSDS化されるので、細かいメッシュほど、SDS化しても形状が変化しないのと同じで、分割するほどSDS化していない時のUVマップの形状に近付いて行ってしまう。

fig03ここでちょっと面白い実験をしてみた。それは左の画像のように、1枚のポリゴンをSDS化してテクスチャが貼ってあるものを用意して、それを複製して、1つはSDS再分割し、もう一方はフリーズし、これら2つを重ねて、SDS再分割した方のメッシュのUVマップの形状をフリーズした側のUVマップの形状に合わせてみようって事だ。

fig05まずこれがSDS再分割したもの。

fig04次にこれがフリーズしたものね。

fig06そしてこれが、SDS再分割したメッシュのUVマップをフリーズしたメッシュのUVマップにあわせたもの。うまい具合にマッピングが復元できた。これはスクリプト化しといたら役に立つかもね。

スナップパレットUVマップをあわせる時は基本タブのスナップと精密の中のドラッグスナップを使うと簡単だよ。

フリーズのUVにあわせる背景にフリーズしたUVを置いて前景にSDS再分割をしたUVを置いてポイントをドラッグしてあわせていく。
SDS再分割で出来るメッシュは1回ごとに半分に割れていくので、フリーズさせるメッシュのサブディビジョンレベルは偶数じゃないと分割の数が合わなくなるから注意してね。

それではまた次回。

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

カテゴリー別ページ



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

2008年05月28日

回転と軸回転 こんな違があった modo 302

エレメントを回転させる時、何を使ってる?

トランスフォームの回転か、軸回転だよね。両者は標準で「E」キーと「SHIFT+E」キーにショートカットが割り当てられている。どっちもエレメントを回転させる機能だけど前者がXYZ+スクリーンの4つの回転ハンドルが出るのに対して、後者は1つの回転ハンドルしか出ない。以前のバージョンでは回転ツールの方は回転角度を指定して回転とかが出来なかったけど、今はちゃんと出来るし、ある程度のことなら回転だけで用が足りそうな気がしてた。しかし両者は意外なところで大きな違いがあることがわかった。それはフォールオフと組み合わせた場合だ。下の画像2枚は、円錐の底面の中心から先端に向けてリニアフォールオフを設定して、回転と軸回転でそれぞれ底面の中心を軸に90度回転させたものだ。比較しやすいように元の形状を背景レイヤに表示してある。

回転の場合

回転の場合


軸回転の場合

軸回転の場合

2枚の画像を比較すれば分かる通り、同じ回転なのに全然違う結果になっている。で、2つは具体的にどのような変換がなされているかを点だけ抽出して調べてみたのが以下だ。

この画像は縦に並ぶ点を円錐の時と同じようにリニアフォールオフ+回転で90度回したものだ。斜めに並んでいる水色の直線は、縦に並ぶ点と、それをフォールオフ無しで90度回転させた点とを結んだものだ。回転+フォールオフで変換したものは、この直線上を動いていることがわかる。要するに回転前と回転後の座標を結んだ直線をフォールオフのパーセンテージで按分した点に移動させるのがこの組み合わせの変換なわけだ。

回転の場合

それに対して、以下は軸回転をしたもの。水色の円は回転中心を中心とする同心円だ。変換された点は円周上に乗っている。この組み合わせでは回転角度がフォールオフのパーセンテージで按分されている。まあ通常はこっちの方を期待するわけだよね。

軸回転の場合

このことから軸回転+フォールオフは半径を変えずに回転できるが、回転+フォールオフは回転角度によって半径が変わってしまう。

元の形状このような同心円状のメッシュをねじってみると、

回転+円柱フォールオフ回転+円柱フォールオフだとこのように円周の半径も変化してしまう。これはこれで使い道はあるかも知れないけど、使いどころが難しそうだ。左の画像は120度回転しているけど、180度を境にねじり方向が逆転して、360度でねじりが無くなってしまう。

ボルテックスそしてこっちが軸回転+円柱フォールオフ。これは標準でプリセット登録されていて、「ボルテックス」と名前が付いている。こっちは角度増加とともにどんどん捩れていく。

という訳で、フォールオフと一緒に回転を使う時には気をつけてね。

それではまた次回

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

カテゴリー別ページ



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

2008年05月27日

UVマップを使ってメッシュを貼り付ける その8 modo 302

はみ出し部分の処理はなんとか第1段階は出来たけど、メッシュの縁のちょっとしたブレが、はみ出したメッシュに多大な歪みとなって返って来てしまうので、やっぱり今回とった方式はあまり良くないみたいだ。だから今のところメッシュにべったり貼り付けるウロコみたいなものはいいけど、鳥の羽みたいなものは羽全体がおさまる板ポリをターゲットにしないとなかなかうまく行かない感じだ。

原因として、貼り付けるポイントのコントロールがUVマップの重なりでしか出来ないので、余計な曲面まで拾ってしまってはみ出し部分に変な角度が付いちゃったり、それから、恐れていた手抜き(はみ出しポイントの位置を決めるのに参照点を1つしか取っていないために位置がぶれやすい)の弊害も出ているみたいだ。

movieそれでも、うまく使うとこんな感じで羽の折りたたみなんて芸当も出来ないことは無い。これはターゲットをいろいろ儲けてモーフを作成し、モーフを切り替えるアニメーションをしたものだ。

解決策としてターゲットにメッシュを貼り付けるかどうかのコントロールは選択セットとかで手動で切り分けられるようにして、浮いた部分については元の形状を保存するような方法を検討中だ。

それと、プログレスバーを出すと落ちやすいので、デフォルトの状態でプログレスバーを出ないようにしてしまった。処理に時間がかかるだけにちょっとイライラするけど、ながーい目で見てやってね。もしプログレスバーを出したいなら、下のようにスクリプトの引数に1を与えてね。

@AlignByUV.py 1

プログラムの内部では変数swがこの切り替えに使われていて、swがTrueだとプログレスバー出るよ。

それではまた次回

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

カテゴリー別ページ



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