2007年07月

2007年07月31日

エッジを等分割する その2 modo 203

さて、前回の続きだ。前回も書いた通り、このスクリプトではポリゴンを削除してその場所にポイントを追加したポリゴンを張り直している。だから元のポリゴンに付いていた属性は全部無くなってしまう。そこでこれらをコピーして新しいポリゴンに貼り付けて復元しなきゃならないわけだが、いざ調べてみると、これが結構いろんなものがあることを再認識させられた。

ざっと挙げるとマテリアル、選択セット、パート、サブパッチウェイト、ウェイトマップ、モーフマップ、UVマップ、その他のVMap、サブパッチ状態がある。

前回の段階ではマテリアルのみコピーしていたが、今回はそれに加えて選択セット、パート、サブパッチウェイト、サブパッチ状態に対応させた。これらが先になった理由はいずれもポリゴンかエッジに付く属性で、ポイントに関係ないからだ。

下のGIFアニメはサブパッチ状態が保存される様子を表している。エッジを境に両方サブパッチでも半分だけでも分割後にちゃんと同じ状態になってるでしょ。

サブパッチ

下のGIFアニメはエッジウェイトが保存される様子だ。

サブパッチウェイト

選択セットやパートも同様だ。
残りの属性はVMapだから新しく増えたポイントに隣接するポイントから按分して値を設定する必要がある。UVマップについてはさらに不連続UVマップもある。

とりあえず現段階で取得までしてあるので、次回は按分と適用の部分を作って完成に近づけたい。

それではまた次回。

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

カテゴリー別ページ

modo操作メモ



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

2007年07月30日

エッジを等分割する その1 modo 203

本田泰人さん、いっぱい勇気を貰いました。ありがとうございました。
・゚・(ノД`)・゚・。

さて、今回のお題は選択したエッジを等分割してポイントを作ることだ。いろいろやってみたんだけど、エッジスライスでポイントを追加する方法か、ループスライスのようにポリゴンごと切る方法以外でエッジにポイントを追加してポリゴンのポイント数を増やす方法がわからなかった。そこでスクリプトで作ってみる事にした次第だ。その1としたのはマテリアル以外の属性にまだ対応していないためだ。今回のところはとりあえず選択したエッジを含むポリゴンを削除して、同じ場所に同じマテリアルのポイントが増えたポリゴンを貼り付けるだけになっている。

EdgeDivide使い方はエッジ選択モードで分割したいエッジを1本選択してスクリプトを実行し、分割数を入力するだけ。数は分割数であって生成されるポイントの数じゃないからね。2分割なら真ん中に1つポイントが出来る。



今頃気が付いたんだけど、GoLiveってアプグレ打ち切りかよっ!
ヽ(`Д´)ノウワァァン

それではまた次回。

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

カテゴリー別ページ

modo操作メモ



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

2007年07月29日

ボリュームライトっぽいことやってみた その2 modo 203

さて、前回に引き続いてボリュームライトっぽい効果についてだ。今回はライトの中に物体が突き刺さってライトの中に影が出る場合についてだ。

seanまずはこんな感じでライトに見立てたコーンに円柱を一本突き刺してみた。他は前回やった設定のままだ。コーンのマテリアルにボリュームライトっぽく見える設定がしてある。

renderそのままレンダリングするとこうなる。コーンはもちろん単なるコーンでしかないので途中に棒が突き刺さってもその下に影は出来ない。要するに陰になっている部分はこのコーンをくりぬくしか無いわけだ。

plane作成そこでくり貫く立体を作るために円錐より下に図のようにポリゴンを1枚作る。このポリゴンは円錐を延長していってポリゴンと交差した時にポリゴンのエッジが円錐の内側に食い込まないように大きめに作る。

カメラビュー1次にビューポートをライトビューにする。これでライトからの視点になり、円錐の底面がビューポートの真ん中に見える。左下から上に向かって伸びているのがライトに突き刺さっている棒である。直前に作成したポリゴンのレイヤが選択されていることを確認して、エッジスライスを起動し、ツールプロパティで「ポリゴンを分割」と「ポリゴンの内側」のオプションをチェックする。これでポリゴン上にポイントを打って切り込みを入れられるようになるので、左の画像のように棒の側面に沿って切り込みを入れる。棒は円錐を貫通しているので切込みによって出来る四角形も底面からはみ出していないとならない。しかしライトビューでは底面の外側は見えない部分があってこのままではポイントが指定できない。


カメラビュー2そこで、ビューポートの縁をドラッグして、ビューポート自体の幅を変えてやると左の画像のように見えなかった部分が見えてくるのでポイントを調整して円錐の底面を横断する四角形にする。

くりぬかれたplaneビューをパースに戻すとこのようにポリゴンに切込みが入ってる。外側のポリゴンは必要ないので削除する。

円錐の頂点をコピー円錐の頂点のポイントをひとつだけ選択してCTRL−Cでコピーする。

ポイントをペーストそのポイントを先に作ったポリゴンのレイヤにCTRL−Vで貼り付ける。

四角錐貼り付けたポイントとポリゴン上の2点を選択してPキーを押し、図のように面を張って四角錐を作る。

四角錐を切り取り棒と四角錐が接しているあたりをエッジスライスで切る(ポリゴンの内側オプションをOFFにするのを忘れないで)。なかなかエッジにスライスのポイントが出てこない場合はビューポートの投影方法を変えて見たりするといいようだ。ポイントさえ出ちゃば、スライドするのは自由自在だ。

円錐を切り抜く立方体スライスした上の部分を削除して穴をポリゴンを張って塞ぎ、ポリゴンの表裏がバラバラだったら反転して揃える。

ブーリアン円錐を前景レイヤ、今作った立体を背景レイヤにし、その他のレイヤは非表示にしてブーリアン(減算)で円錐を削る。
終わったら削るために作った背景レイヤの立体はいらないのでレイヤごと削除する。

くりぬかれた円錐削れた部分は削った立体のマテリアルになっているのでマテリアルを円錐と同じライトのものに変更する。

エッジを追加する削れた部分にはエッジが無いのでエッジスライスを使って円錐側面から繋がるようにエッジを作成する。

ウェイトマップを設定作ったエッジに円錐と同じウェイトマップを設定する。

加工後のシーンこれでライトの加工が終わったので非表示にしていたレイヤを戻す。スポットライトは縁にソフトエッジが付いていて、ぼやけているが、棒の影はくっきり出てしまうので、スポットライトのレンダープロパティで半径を調整して影の輪郭をぼかす。

レンダリング結果

これがレンダリング結果。切り込み内側のポリゴンはカメラに対して角度がかなり急なので、グラデーションの影響であまり光っていない。そこでグラデーションのカーブを修正して内側をもう少し光るようにした。こうすると今度は円錐のエッジの部分がハッキリし過ぎる。
結論から言えば、切り込み内側の部分はマテリアルを分けてこの部分だけ別にグラデーションを調整した方がコントロールは楽なようだ。

以上。無理やりボリュームライトっぽいことをやろうとするとこんなことになるんじゃないかと思う。

それではまた次回。

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

カテゴリー別ページ

modo操作メモ



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

2007年07月28日

ボリュームライトっぽいことやってみた その1 modo 203

volume lightさて、今回のお題はボリュームライトだ。modoにはボリュームライトとか雲のモクモクみたいなものを生成する専用のシェーダーとかは付いていないけど、ライトによるチンダル現象をそれっぽく作ることは出来ないことも無い。左の画像はその例だ。設定自体は以前にグローをやってみたけどあれと大した変わらないよ。

volumelight2上の例のように単なる光の円錐なら話は簡単なんだけど、問題になるのは左の画像のように光の中にオブジェクトが刺さって光の中に影の筋が入ってる場合だ。左の画像はmodoで作ったもので、ちょっと手間がかかるけど、この程度のクオリティならとりあえず出来るようだよ。

spotlightまずはスポットライトにボリュームを表す円錐をセットしてみよう。スポットライトを作って回転角度0,0,0の時にスポットライトはZ軸マイナスの方向を向く。

coneこのスポットライトにあわせて円錐を作る。

parent作った円錐をスポットライトにペアレントすれば、ライトに追随する円錐になる。

light_settingこれは実際にライトを動かしてみたところ。円錐とスポットライトが一緒に動いているでしょ。

reference layer円錐がスポットライトの子になったので、スポットライトをリファレンスレイヤに指定するとライトがどんな方向を向いていようと正投影にZ軸方向を向いた状態で編集が可能になる。リファレンスレイヤについては左の画像の黄色い○で囲った部分をクリックしてアイコンが出たらONになる。

cutライトは光源から離れると減衰していく。これを表現するために矢印の箇所でスライスしてポイントを作る。スライスの位置は、後からエッジスライドツールを使っていくらでも位置を変更できるから今のところ適当で構わない。

weight map新しくウェイトマップを作り、スライスして作ったポイントに図のようにマップ値を設定する。

shader tree円錐に「light」と言う名前でマテリアルを付け、シェーダーツリー質感を設定する。ライトは他のライトの光を受けたりしないので、ディフューズもスペキュラーも反射も0%で、透明なので透過量は100%だ。ただこれじゃあ何も無いのと一緒になっちゃうわけで、主にコントロールするのはルミナンス関係だ。ベースになるマテリアルでルミナンス量を0以外にしておくとルミナンスの色が有効になるのでボリュームの色をそこでコントロールする。

Weightmap Texture基本的なルミナンス量はウェイトマップテクスチャでコントロールする。ウェイトマップのエフェクトをルミナンス量にして、プロパティの頂点マップのところで円錐に付けたウェイトマップを設定すればいい。

Gradationただこのままではエッジがくっきりしてしまうのでグラデーションを使って視線に対して角度が付いている円錐のエッジ部分のルミナンス量を0にしてウェイトマップテクスチャと乗算する。
ついでにノイズも乗算で加えて濃淡をつける。 

円錐のルミナンスの明るさはウェイトマップテクスチャの値2を調整する。減衰位置は円錐をスライスして作ったエッジをエッジスライドツールで動かして調整する。

詳しい設定はサンプルファイルをアップしておくのでそっちを見てね。



それではまた次回。

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

カテゴリー別ページ

modo操作メモ



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

2007年07月27日

頂点マップの切り取りについて modo 203

アイテムのポーズ云々をいろいろ作って、ちょっとしたボックスで人型のものを作ると、ちょっと楽しくなってきて、いろいろポーズをとらせるうちに動かしてみようとか思い出して、昨日一日根を詰めて作ったのがこれ。

dance.mpg

某作品の有名なダンスの頭の部分だ。怒られそうなのでこれ以上は書かないけど、はやくmodoでもアニメ付けたいな。modoでモデリングしてLightWaveでボーンを入れてMotionBuilderで動きを付けてLightWaveでレンダリングしてAfterEffectsでコンポジットした。MotionBuilderはいいねぇ。自分はStandard版なので7で打ち止めになっちゃったけど・・・orz モーキャプやらん身には50万円はちょっとねぇ。パテント関係がどうなっているか知らないけど、modoのアニメ機能もお手軽にキャラクタを動かせるようなのが付いてくれるといいなぁ。

ところで自分はWindows版のmodoを使ってるんだけど、頂点マップの切り取りをするとmodoが落ちる。201ではちゃんと動くんだけど、202、203では同じ症状が出るようだ。複数のパソコンで試したけど同じ結果になったので、バグの可能性もあると思うのだが他にそんな症状になってる人はいない?新規シーンで球をひとつ作ってウェイトマップをひとつ作ってポイントをいくつか選択してウェイトツールでポイントにウェイトマップを設定して頂点マップメニューから切り取りを選んで値を適当に0.5とかにしてOKを押すと「問題が発生したためmodoを終了します」でおしまい。ちなみに頂点マップの切り取りは閾値未満の値のウェイトマップを消去するツールで、不要なノイズ成分を消してウェイトマップをクリーンにするのに有効だ。仕方が無いので自分で機能劣化版を作ってみた。もし同じ状況になってる人がいたら使ってみてね。

プログラムは以下の通りだ。まずはリクエスタパネルを出して閾値を読み込み変数limitに入れる。

limit=panel("ClearMapsByThreshold.limit","1.0","percent","Limit",None)

次にプログレッシブバーが出せるように新規にモニターを1つ作って変数monにセットする。

mon=lx.Monitor()

mainレイヤのインデックスを取得して、選択モードをポイント選択モードにする。

main=lx.eval("query layerservice layer.index ? main")
lx.eval("select.type vertex")

選択されているポイントのタプルを取得して変数vertsにセットする。この時ポイントがひとつも選択されていなければ全選択扱いとして全てのポイントのタプルを取得して変数vertsにセットする。最後に選択状態を復元する時に無選択状態だったか調べられるように、無選択だった時には変数selectedにFalseを、選択ポイントがあった場合はTrueを代入しておく。

verts=lx.evalN("query layerservice verts ? selected")
if len(verts)==0:
    verts=lx.evalN("query layerservice verts ? all")
    selected=False
else:
    selected=True

シーン内のウェイトマップ全てのインデックスをタプルで取得し、変数weightにセットする。

weight=lx.evalN("query layerservice vmaps ? weight")

ポイント選択を解除して、処理対象のポイント数をモニターにセットしてプログレッシブバーの100%の値を設定する。

lx.eval("select.drop vertex")
mon.init(len(verts))

for文でポイントのインデックス全てを1つずつ取り出して変数vに代入してループする。ループする内容は、モニターのカウントを1つ進めてプログレッシブバーの目盛をひとつ増やし、ポイントを1つ選択して全ウェイトマップの値をひとつずつ調べてlimit未満の場合はマップをクリアーする。これを書いてて思ったけど、ウェイトのループとポイントのループは逆の方が効率いいな。でもその場合はモニターのパラメータを調整しないとね。ポイントのウェイトマップ値をクエリーするにはその前に該当するウェイトマップに対して何らかのクエリーを実行して対象となるマップを指定しておく必要がある。そして、マップをクリアするにはクリアするマップを選択する必要がある。この2つをlx.eval'select.vertexMap "%s" wght replace'  % lx.eval("query layerservice vmap.name ? %s" % w))のところでいっぺんにやってるよ。ウェイトマップを選択するselect.vertexMapコマンドはマップ名を指定して切り替えるので、クエリを使ってマップのインデックス番号からウェイトマップの名前を取得するクエリを発行している。これで選択マップも切り替えられるし、マップに対してクエリをしているからクエリの対象となるマップも指定できちゃうわけだ。

for v in verts:
    mon.step(1)
    lx.command("select.element",layer=main,type="vertex",mode="set",index=int(v))
    for w in weight:
        lx.eval'select.vertexMap "%s" wght replace'
         % lx.eval("query layerservice vmap.name ? %s" % w))
        if lx.eval("query layerservice vert.vmapValue ? %s" % v)<limit:
            lx.eval("vertMap.clear wght")

最後にポイントの選択状態を復元する。

if selected:
    for v in verts:
        lx.command("select.element",layer=main,type="vertex",mode="add",index=int(v))
else:
    lx.eval("select.drop vertex")

使い方はスクリプトを起動して閾値を入力するだけ。閾値未満のマップはポイントから消去される。でもこの未満が微妙なんだな・・・。

今回のスクリプトはもしかして役に立つのは自分だけかも・・・(汗)

それではまた次回。

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

カテゴリー別ページ

modo操作メモ



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