2009年11月20日
CATでリンクの切り替えやってみた その3 3dsMax 2010
前回はCATモーションレイヤー単独のリンクについて見て来た。結論としては動いているものの上を歩かせるには歩行モーションをアニメーションレイヤーにコラプスするしかなさそうだって事だった(なにか重要なオプションを見落としているのかも知れないけどね・・・)。
最後のしめくくりとして今回はCATモーションレイヤーとアニメーションレイヤーを組み合わせたリンク切り替えについてやってみたい。
とりあえずこんなシーンを作ってみた(tutorial03_start.max)。このシーンにはBaseHumanリグに非表示になっているレイヤーを含めて2つのCATモーションレイヤー(INとOUT)と1つのアニメーションレイヤー(DRIVE)がセットされている。

これを使ってエアカーに近付いて乗って降りて離れるアニメーションを作ってみたい。
表示になっているINという名のレイヤーはCATモーションレイヤーで、0〜20フレームでエアカーの手前まで歩いていっている。
DRIVEレイヤーはアニメーションレイヤーで、エアカーにリグのPelvisと左右のPlatformがリンクコンストレイントで0フレームからリンクされ、乗車姿勢にポージングしてある。

OUTレイヤーはCATモーションレイヤーで、240〜300フレームでエアカーが着地したところから歩くようにしてある。

2つのCATモーションレイヤーはそれぞれポイントヘルパー(beforeとafter)をPath NodeとしてWalk On Path Nodeモードで歩かせていて、ポイントヘルパーは2本のラインにそれぞれパスコンストレイントされている。
これらのレイヤーはリグ全体ではレイヤーのグローバルウェイトで切り替えられるし、部分的にはローカルウェイトで切り替えが出来る。だからこれらのウェイト値をアニメーションさせる事と、各レイヤーの切り替わりのところをどう繋ぐかってのが今回のテーマなわけだ(もはやリンク切り替えじゃないなw)。
フレームは0〜20が歩行で20〜33で乗り込む姿勢に移行して、33〜60で乗り込んでドアを閉めて60〜76でドアから手を離して運転姿勢に移行でそこから先は運転って事になる。ここまでで使うレイヤーは乗り込むための歩行のINレイヤーと運転姿勢のDRIVEレイヤー、その2つのレイヤー間を繋ぐAnimationLyaerの3つだ。
- カメラビューだと鬱陶しいのでビューポートをパース表示にして、地面とカメラは非表示にしておく。(GIFアニメはクリックすると大きくなるよ)
- 33フレームに移動して、リグのどこか一部を選択する。
- モーションパネルに切り替える。
- レイヤーマネージャーで(Available)を選択して、アニメーションレイヤーを作成する。
- Base HumanLUpperarmを選択してLimb Animationロールアウトを広げ、Create IK Targetを押す。
- Select IK Targetを押して、IKターゲットを選択する。
- コントローラを割り当てロールアウトでAnimation Layerにリンクコンストレイントを設定する。
- Link Paramsロールアウトで「リンクを追加」ボタンを押す。
- IKターゲットをエアカーのドアにリンクする。
- 再び「リンクを追加」ボタンを押してリンクの追加を終了する。
- IKターゲットを手がドアを掴む位置に移動する。
- IK/FKを0にして腕がIKで動くようにする。
これでAnimationLayerではドアの動きに手が追従するようになった。 - Pelvisを選択する。
- Pelvisを移動回転して手がドアに届くように体勢を調整する。
- IKターゲットを回転して手のひらがドアにかかるようにする。
- 反対側の腕を調整して全体のバランスが整うようようなポーズを取る。
- 胸のボーンも回転してポーズをさらに調整する。
- オートキーをONにする。
- Key Pose To Layerボタンを押してCATモーションレイヤーの33フレーム目のポーズを新規に作ったアニメーションレイヤーにキーとして写し取る。
- 60フレームに移動。
- Base HumanLForearmを選択。
- IK/FKのスライダーをちょっと動かして0に戻してこのフレームに値0のキーを作る。 このフレームで扉を掴んでいた手を離すので、ここから手のIKを75フレームに向けてFKに切り替えて行く。
- 75フレームに移動。
- IK/FKのスライダーを1.0にする。
これで75フレームで手がFK動作になった。この時点でハンドルを握って座ったポーズにしたいので、AnimationLayerにDRIVEレイヤーのポーズを写し取る。そのためにはDRIVEレイヤーのポーズにしなければならないけどAnimationLayerが優先レイヤーなのでこれを無効にしてからKey Pose To Layerする。レイヤーは無効になっていてもKey Pose To Layerで現在のポーズを写し取る機能は有効なので、この方法は結構重宝するよ。 - AnimationLayerをダブルクリックしてレイヤーを無効にする。
- DRIVEレイヤをダブルクリックして有効にする。
- AnimationLayerを選択してKey Pose To Layerを押してこのフレームのDRIVEレイヤーのポーズをAnimationLayerにキーとして写し取る。
- AnimationLayerをダブルクリックして有効にする。Driveレイヤーのポーズが写し取られているのでポーズは変わらない。
- Global Weightの値をちょっと変えて100%に戻してキーを作る。
- 1フレーム進めて76フレームにする。
- Global Weightの値を0%にする。
- 20フレームに移動する。
- AnimationLayerとDRIVEレイヤをダブルクリックして無効にする。
- AnimationLayerを選択してKey Pose To Layerを押してこのフレームのINレイヤーのポーズをAnimationLayerにキーとして写し取る。
- Global Weightの値を0%にする。
- 0フレームに移動する。
- Global Weightの値を0%にする。
- 33フレームに移動する。
- Global Weightの値を100%にする。
- AnimationLayerとDRIVEレイヤーをダブルクリックして有効にする。
これでアニメーションレイヤーのGlobalWeightは20〜33で0%〜100%になり、75〜76で100%から0%に切り替わる。 - 0フレームに移動する。
- DRIVEレイヤーのGlobal Weightの値を0%にする。
- 72フレームに移動する。
- キーモードをステップに切り替える。
- Global Weightの値を100%にする。
DRIVEレイヤーはAnimationLayerより優先順位が低いのでAnimationLayerが100%の時は影響が出ない。72フレームからGlobal Weightを100%に切り替えてもそれが現れるのはAnimationLayerが100%じゃなくなる75フレーム以降だけど、ピッタリで切り替えるとフレームが切り替わる途中でカクツキが出たりするのでオーバーラップさせた。 - オートキーをOFFにする。
ここまでの結果がこれだ。まだ足がエアカーにめり込んだりいろいろ難があるが、Animation Layerを微調整しながらキーを打っていけばうまく繋がりそうだ。

乗り込む時に腰と両足が浮いたりおかしな事になっているので、この辺はキーをずらしながらタイミングをとったりしていく事になると思うけど、時間がなくなっちゃったので今回はここまで。車に乗った後は足のIKをFKに切り替えるのもいい方法だよ。
スタートファイルをアップしておいたので連休にチャレンジしてみてもいいかも。
次回更新は24日。それではまた次回。
2009年11月19日
似顔やってみた その5 modo 401 SP2
さて、前回は頭髪をはやして、ちょこっと撫で付けるところまでやった。あの後の作業は実に地味にヘアガイドをチクチク修正して、毛を細くしたりしてモロモロ調整してこんな感じになった。
これを試行錯誤しながらやってわかったことを書いとくね。
今回は白髪混じりのヘアーについて。
ファーには個別のIDがランダムに振ってあり、そのIDごとに白と黒を割り当てて行けば黒い毛と白い毛が混ざった状態になる。その割り振りはGradientシェーダーで出来る。下のようにディフューズの色としてGradientシェーダーをファーの入ってるところに入れて、入力パラメータをパーティクルIDにする。

こうすればファーがランダムな順でグラディエントの0〜1の中に並ぶのでそれに割り振る色を決めてやればいい。例えば下のように0〜0.1を白に、そっから先を黒に近い茶色にした場合、
このように10%だけ白髪になる。
さらに60%まで持って行くと、
このように白髪が多くなる。
白と黒だけだと面白くないから最終的にグレーなんかを追加してみた。
グラディエントシェーダーにレイヤーマスクを設定すれば、部分白髪なんてのも出来るよ。

下の画像がマスクを塗ったもの。白い部分だけグラディエントが有効になるので、その部分だけ部分白髪になる。
これがレンダリング結果。
また、毛染めなんかやってる場合は放置してると根元から白くなる。毛の根元だけ白くしたいなんて場合はこれもGradientシェーダーを使って、入力パラメータを「ファーパラメトリック長」にすると、0%〜100%が根元から毛先までのマテリアルにマッピングできるようになり、
グラディエントエディタで0%から20%くらいまでのところを白くして、そこから先を黒くすれば、毛の根元が白くて毛先が黒い髪の毛が出来上がる。
これがレンダリング結果。あーこういう人いるいるw
これをレイヤー合成でさっきの白髪混じりの髪を作ったグラディエントシェーダーと合成してみる。ブレンドモード「明るい」にしてやれば白っぽい方が優先されるので白髪優先で髪の色が決まる。
これがその結果。
しかしこんなことやってるうちに総理は白髪染めちゃったな・・・。
それではまた次回。
2009年11月18日
CATでリンクの切り替えやってみた その2 3dsMax 2010
今回もパーティクルの勉強はお休みしてCATのリンクについてだ。
前回はアニメーションレイヤーのみのリンク切り替えについてやってみた。基本的にリンク対象ごとにアニメーションレイヤーを作って、PelvisとIKターゲットそれぞれのコントローラにリンクコンストレイントを仕込んで、リンクが切り替わる時点でリンクコンストレイントがワールドから対象のオブジェクトに切り替わるようにしておけば、レイヤーのウェイト値をアニメーションさせることで簡単にリンクを切り替える事が出来た。
今回はCATモーションレイヤーを組み合わせた場合について調べてみたい。
まずはCATモーションレイヤーの復習から。このレイヤーは追加するとリグに歩行モーションを付加する。そしてレイヤーマネージャーロールアウトの下の方に足跡のマークのボタン(CAT Motion Editorボタン)が出てきて、これを押すことで歩行モーションを調整する事が出来る。
これがそのパネル。左のリストがカテゴリーでGlobalsを選ぶと右側に全体的な設定のためのパネルが出てくる。このパネルの右側のWalk Modeによって歩行時の歩行経路が決められる。
デフォルトの状態ではWalk On Spotになっていて、リグはその場で歩行モーションを繰り返すだけで移動しない。これは主に歩き方を編集する時に役に立つモードだ。

Walk On Lineはまっすぐ歩くだけのモードだ。

Walk On Path Nodeは指定したオブジェクトの動きをもとに歩くモードだ。CATで歩行モーションをつける場合はこれが実用的だろう。
例えば下のような動きを付けたポイントヘルパーがあったとして、Walk ModeをWalk On Path Nodeにして、同じパネルのPath Nodeボタンでこのポイントヘルパーを選択すると、

このようにポイントヘルパーの動きや角度に追従して足跡が生成されて、それを踏みしめる形でリグが歩くようになる。ただし参照するオブジェクトのローカル軸はデフォルトの状態(リグ作成時にBone Length Axisオプションで切り替え出来る)でX軸がリグの垂直方向、Y軸がリグの正面方向に合うので、それ以外の方向を向いている時はリグがあらぬ方向を向いちゃったりするので、その時は参照オブジェクトの向きを修正することでリグの向きを修正出来る。

そしてこの歩行サイクルは参照ノードが停止していても止まることなく繰り返されて、上のGIFアニメのように足踏み状態になってしまう。これを解決するのがFootPrintsのStep Masksオプションで、これをチェックするとノードが停止している部分で足が上がらなくなり、立ち止まった状態になる。
これがONにした状態。

ノードの移動アニメーションについては曲線に対してパスコンストレイントを設定して、フォローオプションをONにすることで曲線に沿って歩行させる事が出来るようになる。
まあこんなところがCATモーションレイヤーの基本中の基本なわけだ。
さて、そこでリンクの話だ。このCATモーションレイヤーを他のアニメーションレイヤーと同じようにコントローラにリンクコンストレイントを設定してオブジェクトの上を歩かせてみた。下のGIFアニメはWalk ModeをWalk On Lineにしたものだ。

このようにまるで反応しない。実はWalk On Lineモードの時はベースの三角形に矢印マークが入ったアイコンが基準になっていて、これをBOXにペアレントすると一応歩行はBOXに追従するようになる。下のGIFアニメはベースアイコンをBOXにペアレントしたものだ。足の運びを見てもらうと判る通り、RIGが踏みしめて歩いているのはワールド座標であってBOXのローカル座標ではない。だから足がBOX上で滑ってしまって、足を交差して歩く結果になっている。

これはWalk On Path Nodeモードでも同様で、Walk On Path Nodeではノードに追従するので、ノードをBOXにペアレントすることでリグをBOXに追従させる事が出来るが、足跡自体はやはりワールド座標が基準になる。足跡自体にアニメーションを付ける事が出来るので、足跡をBOXにリンクする事で床を滑らない歩行が可能にはなるんだけど、BOXにモーションを付けた時点で足跡の位置がずれてしまうので、その修正がとても大変だ。しかもBOXのアニメーションを修正するたびに全ての足跡の位置を修正し直さなくてはならない。物凄くメンドクサイ。
下のGIFアニメはL字のオブジェクトにスプラインをリンクし、そのスプラインにパスコンストレイントさせたポイントをノードとしてWalk On Path Nodeモードで歩行アニメーションを付けてある。

このL字のオブジェクトにアニメーションを付けたのが下のGIFアニメだ。L字のオブジェクトにアニメーションを付けた瞬間に足跡が下のようにリグが踏みしめる瞬間の位置に移動する。足がもしこのL字のオブジェクトを踏みしめているなら、足跡はオブジェクトと一緒に動かなくちゃいけないわけなんだよね。そこで足跡をオブジェクトにリンクって事になるんだけど、リンクしても足跡の初期位置がもとに戻る事が無いので、リンクした後で足跡をL字オブジェクトの上に並べなおさなくちゃならないわけだ。オマケにL字オブジェクトの動きを変えるたびに足跡の位置は自動的に下の様な感じに並べ直されてしまう。って話ね。

さて、以上の理由で足跡にリンクをつけるのもあまり生産的では無い。結局自分が出した結論は歩行モーションをアニメーションレイヤーにベイクして、それを前回の方法で使うって事だ。
手順としては、
- まずすでに動きが付いているオブジェクトをCATではなくてMax側のアニメーションレイヤーにして、そのレイヤーをOFFにして動きを止める。
- オブジェクトが静止していればCATモーションレイヤーはちゃんと地面を踏みしめるアニメーションを出力してくれるので、リグのどこかを選択してレイヤーマネージャーで(Available)を選択してCollapse Layersボタンを押し、取りこぼしが出ないように全フレームを新規アニメーションレイヤーに写し取る。
- CATMotionLayerはもう必要なくなったけど、後から歩行モーションを修正しなおすかも知れないのでダブルクリックして無効にしておく。
- リグのPelvisと左右のPlatformをそれぞれ選択してコントローラにリンクコンストレイントをセットして、床のオブジェクトとリンクする。
- 床のオブジェクトのアニメーションレイヤーをONにして再び動くようにする。
この後は床のオブジェクトにどうアニメーションをつけようと、歩行アニメーションは追従する。
上記のようにセットアップしてから床のオブジェクトの動きを変更して再生したのが下のGIFアニメだ。足が床を滑らないで追従しているのがわかる。

もちろん床のオブジェクトの動きをつける前にCollapseLayersをやってAnimationLayerにCATMotionLayerの動きをベイクすれば、Maxのアニメーションレイヤーまで持ち出して来なくても済むよ。
今回はCAT Motion Layer単独の場合のリンクについてやってみた。次回は複数のレイヤーが組み合わさったものをやってみたい。
それではまた次回。
2009年11月17日
「範囲」モードでのファーの長さについて modo401 SP2
自分の理解では、「範囲」モードにするとファーの長さはガイドの長さで決まる事になると思っていた。これはほぼ合っているんだけど、長さを決めるパラメータとしてファーマテリアルのプロパティにある「長さ」パラメータがこのモードの時は無視されるのかと思いきや、意外な影響をファーに及ぼし続けている事がわかった。
例えばメッシュに100mmのヘアガイドを立てて、

ファーマテリアルの設定をこのようにして、
長さパラメータのみ変化させてみたのが下の結果だ。
これが長さ10mmにしたもの。

これが長さ100mmにしたもの。

これが長さ500mmにしたもの

見て判る通りガイドの長さ100mmに対してファーの長さ10mmでも100mmでもそれほどの変化は無い。しかしそれを超えて500mmになると明らかにファーのセグメント数が異なって来る。どうやらガイドの長さよりファーの長さが短い時はファーの長さが引き伸ばされ、ファーの長さがガイドより長い時はファーをガイドの長さで切り取っている感じだ。
この影響はさらにベンドなどのパラメータを弄ったときに顕著になってくる。下のGIFアニメは上の設定をそのままに、ベンドの「フレックス」パラメータを50%にして「長さ」パラメータを10mm、100mm、500mmに変えてみたものだ。

見て判る通り、ガイド長さを超えない部分ではファーの角度に(短いファーを除けば)変化は無いけど、ガイドの長さを超えた500mmの時は明らかにファーの角度が変わってしまっている。
それぞれ個別に調べた結果、成長ジッターとフレックス、そしてセグメント数に影響が出るようだ。
また、「長さ」パラメータを0mにすると、ファーが生えなかった。
以上の事と、ガイドの長さがストレッチツールなどで変化させる事が出来るものである事から、安定した状態で「範囲」モードでファーを使いたければ、0にならない長さで極力「長さ」パラメータを短く設定した方がいいようだ。
それではまた次回。
2009年11月16日
CATでリンクの切り替えやってみた その1 3dsMax 2010
shilinさんにCATリグ全体と他のオブジェクトとのリンク切り替えについてコメントを頂いたので、今回はそれをお題に無い知恵絞ってやってみた。ただいろいろ調べていったらいろんな事がわかったので1度じゃ説明しきれなくなったので、まずその1としてAnimationレイヤーのみのリンク切り替えについて始めたい。
下の画像は歩いて来たキャラクターが円盤に乗って一緒に回転し、円盤が静止したところでまた歩き出すアニメーションだ。円盤が回転している時はキャラクターを円盤にリンクし、歩いている時はリンクを解除してみた。

これは動くオブジェクト上を歩行させるアニメーション。こういうのはリンク無しでは無理だよね。

今回使ったリグはBaseHumanでスケマティックビューを見るとこうなっている(両腕のIKターゲットを作成した状態)。
ボーンの親がBase HumanPelvisになっているのでこれを他のオブジェクトにリンクしてやればリグ全体がそのオブジェクトのに追従してアニメーション出来る事になる。ただし手や足にはそれぞれIKターゲットが作成でき、デフォルトの状態で足のIKターゲット(Base HumanLPlatform , Base HumanRPlatform)の方は作成済みで、スケマティックビューを見るとわかる通りこれらのターゲット(スケマティックビュー上の黄緑色の枠)はBase HumanPelvisとはリンク関係に無い。
手足がFKの状態ならターゲットがどこにあっても問題無いけど、IKが入る場合はこれらもオブジェクトにリンクしなければ、オブジェクトの運動から取り残されて、それがリグを引っ張る事になる。特に足のIKターゲットは地面を踏ん張っているのでほぼ必須なんじゃないかな。
さて、リンクの切り替えを動的にすると言えばリンクコンストレイントがお馴染みだ。これをCATのリグにセットする時はアニメーションレイヤーを作って、その管理下のコントローラーに対してリンクコンストレイントをセットしてやるのがCAT流なようだ。こうすればリンクコンストレイントは各アニメーションレイヤーごと個別に持つ事ができる。
左の画像はレイヤーマネージャー。中に4つのレイヤーを挿入してみた状態。
上のレイヤー状態の時のコントローラーの割り当てロールアウトの状態。LayerTransの中に現在選択しているリグパーツの各レイヤーに対応したコントローラーの項目が並んでいる。これらはダミーで、レイヤーマネージャーパネルで選択したレイヤーだけそのレイヤーに設定されたコントローラーが表示されるようになっている。左の画像の場合一番下のAnimation Layerだけがコントローラーにアクセス出来る状態になっていて、項目名の前に内臓した項目がある事を示すプラスマークが付いている。
リンクコンストレイントはこの項目を選択して上にあるコントローラの割り当てボタンをクリックして、出てきた変換コントローラを割り当てパネルからリンクコンストレイントを選択することで割り当てる事が出来る。

リンクコンストレイントが設定されるとモーションパネルに左のようなロールアウトが出てくる。上の「リンクを追加」ボタンで現在選択しているリグパーツを他のオブジェクトに特定の期間リンクする事が出来るようになる。
CATのレイヤーはウェイト値で割合を調整して合成出来るので、1つのリンクコンストレイントで複数のリンクターゲットを切り替えるより、リンクターゲットごとにアニメーションレイヤーを作ってそのレイヤーごとにリンクコンストレイントを設定する方が扱いやすいようだ。
実際にやってみよう。
下のGIFアニメのように2つのボックスに動きがつけてある。この2つのボックスにキャラクターを順にペアレントさせて動かしてみたい。

まずキャラクターを最初のボックスにリンクしてみる。作業の様子は下のGIFアニメでも見られるよ。GIFアニメはクリックすると大きくなるよ。
- リグの一部をクリックして選択し、モーションパネルに切り替える。
- 「Add Layer」ボタンを押してAbsを選んでAnimation Layerを挿入する。
- Setup/Animation Mode Toggleボタンをクリックしてアニメーションモードに切り替える。
- Base Human Pelvisを選択する。
- コントローラを割り当てロールアウトでLayerTransを展開してAnimationLayerを選択する。
- コントローラを割り当てボタンをクリックして出てきたパネルからリンクコンストレイントを選択してOKをクリックする。
- Link Paramsロールアウトで「ワールドにリンク」ボタンをクリック。
- ワールドのフレーム番号が0じゃない場合は開始時間に0を入力してワールドのフレーム番号を0にする。
- タイムスライダを32フレームに移動する。
- 「リンクを追加」ボタンを押してBox01を選択する。
- 「リンクを追加」ボタンを押して追加を終了する。
- Base HumanLPlatformとBase HumanRPlatformに対しても5〜11の手順で設定する。
次にBOX1からBOX2に飛び移る部分を作ってみる。まずは前準備。
- リグを挿入した時に一緒に挿入されたBase Humanオブジェクトが邪魔なので非表示にしておく。
- 次にBase HumanPelvisをPelvis 、Base HumanLPlatformをL Platform 、Base HumanRPlatformをR Platform 、それら3つをあわせてLink Setという名前でそれぞれ選択セット登録をしておく。
- Base HumanPelvis 、Base HumanLPlatform 、Base HumanRPlatformのコントローラーの設定を階層のリンク情報のBone Hierarchyロールアウトにある「Remember Layer Settings」ボタンをクリックして登録し、新規にアニメーションレイヤーを作成した時にコピーされるようにする。
これで準備が出来たのでリンク作業に入る。
- タイムスライダーを46まで進める。2つのBOXが重なるところだ。
- (Available)を選択してからAnimation Layerを追加する。これでリストの下側にレイヤーが作成されて、元のレイヤーを覆い隠す。
- 前回コントローラの設定を保存したので新規にレイヤーを作ったらその設定がコピーされているはずだ。そこでリンクコンストレイントのロールアウトを探してみたけど見当たらない。どうやらパネルの更新がうまく行っていないらしい。そこで元のレイヤーを選択してから再び新しく作ったレイヤーを選択してみたらロールアウトが更新されて表示された。
- ここでBase HumanPelvis 、Base HumanLPlatform 、Base HumanRPlatformの3つのオブジェクトのLink ParamsロールアウトでBox01へのリンクを削除して、46フレームからのBox02へのリンクを設定する。リグはBox01へのリンクが切れたので元の位置に戻る。
- ここで新規のアニメーションレイヤーで直接リグを配置してもいいけどBox01によって移動した位置を参考にしたいので上のアニメーションレイヤーのフレーム46のリグの位置を新しい方のアニメーションレイヤーに転写する。そのために新しい方のアニメーションレイヤーのGlobal Weightを0%にして上の方のアニメーションレイヤーを表示させて、Key Pose To Layerボタンを押す。このボタンを押すと現在選択されているレイヤーのウェイト値に係わらず現在表示されているポーズがそのレイヤーに転写される。
- 0%にしていたグローバルウェイトを100%に戻して選択セットからLink Setを選んでリグがBox02の上に乗るように垂直に移動する。この位置が新しく作った方のレイヤーのワールド座標基準の位置になる。リンクコンストレイントで45フレーム目まではこの位置を保つわけだ。そして46フレーム目からはリンク先がワールドからBox02に切り替わってBox02に着いて移動する。
- 次に2つのレイヤーを40フレームから46フレームにかけて切り替えるアニメーションを付ける。そのためにまず新しい方のレイヤーのグローバルウェイトを0%にする。
- 次にタイムスライダーを40フレームに移動し、オートキーをONにして新しい方のアニメーションレイヤーのグローバルウェイト値をちょっと増やしてから0%に戻す。これでこのフレームに0%でキーが打たれる。
- 次に46フレームに移動してグローバルウェイトを100%にする。そしてオートキーをOFFにする。これでレイヤーの切り替えアニメーションが設定できた。
下のGIFアニメがここまでの成果。フレーム32でBox01に乗って動き出し、フレーム40〜46にかけてリンクが切り替わってフレーム46からはBox02に乗って動くようになった。

でもさすがにこのままだと切り替え部分が酷いので乗り換える部分にアニメーションを追加してみる。
ローカル座標の相対アニメーションレイヤーを追加して、動き始め(32フレーム)、しゃがみ始め(36)、ジャンプ開始(40)、ジャンプ空中(42)、着地(46)、安定(54)にオートキーをONにしてKey Pose To Layerボタンで全パーツにキーを打つ。そして40フレームでしゃがませて、42フレームで空中に跳ばせて、46フレームで着地姿勢で50フレームで着地の勢いぶんのリアクションポーズをそれぞれ付けた。
これがその結果。ジャンプして跳び移るアクションが付いた。

今回はCATモーションレイヤーを含まないリンク切り替えについてやってみた。
初期状態のシーンをアップしておいたので、興味があったらシーンを作ってみてね。
それではまた次回。
2009年11月13日
パーティクルシステムのお勉強 その25 3ds max 2010
前回に引き続いてパーティクルペイントヘルパーの話だ。
マッピングロールアウトはパーティクルのマッピングを設定する仕組みだ。マッピングが決定されても割り当てるマテリアルが無いと意味が無いのでパーティクルに割り当てられたシェイプにマテリアルが設定されていない場合はマテリアルを設定するオペレータをイベントに追加する必要がある。
こんな感じでMaterial 系のオペレータを設定すると、パーティクルのマッピング情報を使ってマテリアルがShapeに適用されるわけだ。シェイプ事態がオブジェクトのインスタンスになっている場合なんかはオブジェクトに直接マテリアルが設定出来るので、このオペレータを使う必要は無い。
それではオプションを上から見ていくと、
「サブマテリアルインデックスを取得」をONにすると、パーティクルシードから一番近いサブオブジェクトに割り当てられたサブマテリアルIDがパーティクルに割り当てられたシェイプ全体に割り当てられる。シェイプがオブジェクトのインスタンスで、そのオブジェクトの各サブオブジェクトにサブマテリアルIDが割り当てられていたとしても、それらは上書きされて、オブジェクト全体が同じサブマテリアルIDになる。
サブマテリアルIDと対になるのがマテリアルの方のマルチ/サブオブジェクトだ。例えばこのような編集可能ポリゴンの立方体の各面に異なるマテリアルを貼りたい場合、

サブオブジェクトのポリゴン選択モードにして「ポリゴン:マテリアルID」ロールアウトで「IDを設定」の欄に割り当てたいID番号を入力すると、選択されているポリゴンのサブマテリアルIDが設定出来る。
そしてマテリアルエディターで、マテリアルを取得ボタンを押して

マテリアル/マップブラウザで「マルチ/サブオブジェクト」をダブルクリックする。
これで1つのマテリアルの中にサブマテリアルが複数入っている構造になる。
各サブマテリアルは割り当てるサブマテリアルIDを設定できて、例えば下のようにマテリアルの基本色を設定して先にサブマテリアルIDを設定した立方体に適用してやると、
下のように、各面に対応するマテリアルが割り当てられるわけだ。

パーティクルペイントヘルパーのマッピングロールアウトの「サブマテリアルインデックスを取得」をONにすると、このサブマテリアルIDがパーティクルシードに割り当てられ、それがパーティクルにコピーされるわけだ。
ここでパーティクルペイントヘルパーを作成して、「サブマテリアルインデックスを取得」をONにしてパーティクルシードを下のように散布してみた。

そしてPFSourceもシーンに追加して、パーティクルビューで下の画像のような構成にした。そしてBirthPaintにパーティクルペイントヘルパーを接続し、Material Staticに先に作ったマルチ/サブオブジェクトのマテリアルを接続した。
シェイプが生成された後だとマテリアルの設定が更新されないので、Material Stasticの「マテリアルの割り当て」チェックボックスを一旦OFFにしてから再度ONにする。
そしてタイムスライダをずらしてパーティクルを発生させたのが下の画像だ。各パーティクルに割り当てられたシェイプ全てにはMaterial Staticによって1つのマテリアルが割り当てられるけど、その中には複数のサブマテリアルが入っていて、それが各シェイプに割り当てられたサブマテリアルIDによって選択されて割り当てられている。

もちろんシェイプと立方体はサブマテリアルIDが同じになるだけで、マテリアルは別のものを割り当てる事が出来るよ。
それから、サブマテリアルIDがサンプリングされるのはあくまでパーティクルシードが散布される瞬間なので、散布後に「サブマテリアルインデックスを取得」をONにしても散布されたパーティクルシードの設定は変えられないからね。
それから、サブオブジェクトに複数のサブマテリアルIDが設定されているオブジェクトをインスタンスにしたシェイプを使った場合、このオプションをONにするとサブマテリアルIDが全て上書きされちゃうんだけど、散布されたパーティクルシードでこのオプションが1度でも使われると、OFFにしてパーティクルシードを散布しても、インスタンスのサブマテリアルIDは全部1番として上書きされてしまうようだ。
下の画像は右の立方体にマルチ/サブオブジェクトマテリアルを適用して、そのインスタンスをパーティクルに割り当ててある。サブマテリアルインデックスを取得オプションをOFFのままパーティクルシードを散布した場合、このようにオリジナルのサブマテリアルの状態がそのまま再現される。
そして下の画像はオプションをONにしてパーティクルシードを散布し、その後OFFにしてからさらに散布したものだ。ONにした場合、オリジナルのサブマテリアルIDが上書きされてインスタンス全体のマテリアルIDが塗布対象になっているオブジェクトからコピーされている。しかしオプションをOFFにしても上の例のようにオリジナルのサブマテリアルIDが復活せず、インスタンス全体がマテリアルID1番で上書きされてしまっている。

だからこのオプションを使うときは途中で切り替えられないと思って置いたほうがいいようだ。
次に「マッピング座標を生成」オプションは、グラデーションやビットマップなど、パラメータによって割り当てるマテリアルの値を変化させるマテリアルに対して、そのパラメータ値を生成するためのものだ。マッピングって言葉が多重にいろんなところで使われてるから混同しないようにね。
このマッピングパラメータはマテリアルのマップロールアウトの各項目と関連付けられる。よく使うのはUVWマップにマッピングするビットマップとグラデーションランプだね。
例えば拡散反射光カラーにグラデーションランプをセットすれば、

マップパラメータの変化を色の変化に置き換える事が出来る。下の画像はグラデーションランプのロールアウトだ。赤黄青のグラデーションはその下にある小さなマーカーをダブルクリックして色を設定したもので、デフォルトでは黒から白へのグラデーションになっている。
マップパラメータの値は基本的に0〜1の範囲で、その範囲から外れた値はタイリングによってパターンを繰り返してカバーするなどの処理を設定したり出来る。下の例の場合、マップパラメータの値が1なら青、0なら赤、0.5なら黄色の色が付くことになる。
このパラメータは複数持つ事が出来るので、どのパラメータを使うのかはマップチャンネルで指定しなくてはならない。せっかくいろいろセットアップしても、このチャンネルが互いに合ってないと意味無いからね。マテリアル側は座標ロールアウトのマップチャンネルで、
パーティクルペイントの方はマッピングロールアウトのマッピングチャンネルに割り当てのボタンだ。このボタンで1番をONにしていたらマテリアル側のマップチャンネルも1にする必要がある。
あとはマッピングパラメータの生成方法である「タイプ」パラメータだ。これは次の種類がある。
- ストロークに依存
- 時間に依存
- インデックスに依存
- ペイントオブジェクトに依存
時間が無くなったのでこれについてはまた次回。
2009年11月12日
似顔やってみた その4 modo 401 SP2
さて、スカルプトもまだまだだけど、ここで髪の毛に着手してみたい。
まずは髪の毛を生やすための下地として髪の毛を生やすポリゴンメッシュを用意する。髪の毛が生えている範囲より広い範囲のポリゴンを選択してCTRL+Cでコピーし、新規にメッシュアイテムを作成してCTRL+Vでペーストする。
このメッシュアイテムに「Hair」という名前を付けた。
取り出したHairアイテムからヘアガイドを生やして髪型を整えて行くわけだけど、ヘアガイドが生えるのはメッシュの頂点なので、頭頂部などでちょっと間隔が開きすぎる感じだ。そこでDキーを押して1回SDS再分割した。

再分割によって今度は混み入りすぎた部分も出てくるので、エッジを除去したり折り畳んだりしながらまとめて行く。

Mキーを押してこれらのポリゴンにHairと言う名前のマテリアルを設定する。その際このメッシュが受けていたディスプレイスメントマップの影響が無くなるので、極端に頭部から乖離した部分があったらスカルプトツールなどで修正する(そんなに厳密にする必要は無い)。

シェーダーツリーのHairマテリアルグループ内に256X256のグレースケールのマスク画像(hair_mask)を作成する。カラーの設定にチェックを入れてカラーをRGB(0,0,0)の黒にしておく。
このマスク画像のエフェクトを右クリックしてレイヤーマスクからファー密度に変更する。

マスク画像のブレンドモードを乗算にする。さらにレイヤー追加でファーマテリアルを追加し、マスク画像の下に配置する。
これでマスク画像の明るさの濃淡によって毛が生える生えないが制御出来るようになった。

画像マスク(hair_mask)レイヤを選択してからペイントブラシで白色を塗ると、そこからファーが生えてくる。
写真資料を見ながら生え際を描く。塗り過ぎたら黒で塗り直してね。
ファーマテリアルのプロパティで「基本サーフェスの削除」をONにして、ファーを生やしているメッシュポリゴンがレンダリングされないようにする。

これでレンダリングしてみたのがこの状態。毛の長さや方向はまだ制御していないのでまだ長めのスポーツ刈りみたいな感じ。
次にヘアガイドを設定する。マスク画像が見えるようにしておいて、髪の毛が生えているポリゴン全てを選択する。
このポリゴン選択をALT+頂点ボタンで頂点選択に切り替えると状態パネルには681ポイントと表示される。

スカルプトパネルのヘアツールタブからヘアーガイドボタンを選択して、下のように設定してビューポートをクリックする。最大ガイド数を上記で調べたポイント数以上にすれば、選択した全ポイント(またはポリゴン)からヘアーガイドが生える。

こんな感じ。
このヘアーガイドをファーで使うためにファーマテリアルの設定を下のように設定する。間隔をちょっと広くしてファーを太くしてファーの流れが掴める程度の大雑把な髪の毛にする。
ファー形状のガイドを「範囲」にすることでファーがガイドの長さと方向に従うようになる。

この段階でレンダリングするとこうなる。
次にヘアーツールのストレッチとスムースブラシをONにして、

毛の長さを調整する。ストレッチはストレッチ量をプラスにするとガイドが短くなり、マイナスにするとガイドが長くなるよ。
次にへアーツールの移動とソフトブラシで立っているヘアーガイドを撫で付けていく。

最終的な調整はガイド1本ずつやるので、ここは大雑把に引っ張って整えて行く。
撫で付けた状態。
これをレンダリングするとこうなる。
時間が無くなったので今回はここまで。データはアップしておくね。
それではまた次回。
2009年11月11日
パーティクルシステムのお勉強 その24 3ds max 2010
前回に引き続きパーティクルペイントヘルパーを調べて行くよ。
方向ロールアウトはパーティクルシードの向きを制御するための仕組みで、X軸の向きとZ軸の向きを制御できる。
そのための仕組みとして回転コンポーネントをパーティクルシードに付加するのが一番上のチェックボックスで、これがONになっていなければパーティクルシードは回転情報を持たない。そのままパーティクルになんらかのシェイプが接続されたらシェイプの方向はワールド座標系に従ったものになる。
例えば回転コンポーネントを生成をOFFにしたままパーティクルシードを散布して、そのソードからBirth Paintでパーティクルを発生させて、Shape Instanceでそのパーティクルにティーポットのインスタンスを割り当てたら、Shape Instanceに伝わるのはパーティクルシードの位置情報だけなので、ティーポットはオリジナルのローカル座標の向きがそのままワールド座標の向きになって配置される。
下の画像が実際やってみたもの。

もちろんShape Instanceオペレータの上にRotationオペレータとかを挿入すれば、回転情報を付加したり出来るわけだ。
要するに「回転コンポーネントを生成」をONにすれば、位置と生成時刻以外にパーティクルシードが独自に回転情報も生成するようになるってわけだ。
(パーティクルシードの向きはセットアップロールアウトで表示タイプを「フラグ」にするとビューポート上での表示が旗の形になってわかり易くなるけど、今回はさらにわかり易いようにオブジェクトのインスタンスを貼り付けて説明を続ける。)
そこで回転の制御方法なんだけど、X軸の向きとZ軸の向きについてそれぞれこれだけ設定方法がある。パーティクルシードを散布する前にこれらをX軸とZ軸それぞれに設定してペイントすれば、パーティクルシードにそれぞれの軸の向きが記録される。
とは言え、例えばX軸の向きを「ワールドX軸に位置合わせ」にしておいて、Z軸の向きも同じく「ワールドX軸に位置合わせ」にしたら矛盾が生じてしまう。そこでこれらの設定には優先順位が付けられるようになっていて、優先順位が高い方の軸を設定したあとでも決められないその軸を中心とした回転方向の向きだけ優先順位が低い方の軸の向きの設定で決めるようになっている。
例えばZ軸を優先軸にして、「サーフェス法線に位置合わせ」をセットし、X軸を「Particle Paint アイコンをルックアット」にすると、Z軸がオブジェクトの法線方向を向いて、その上でパーティクルのX軸の向きがパーティクルペイントアイコンの方向を向こうとするから
こんな向きになる。

同じ設定でX軸の方を優先させると、まずX軸がパーティクルペイントアイコンに向いて、それからZ軸が法線方向を向くようにX軸を中心に回転するのでこんな向きになる。

向きの決定方法についてもちょっと見ていくと、
- ランダムはその名の通りパーティクルシードの向きをランダムにする。
- サーフェス法線に位置合わせはパーティクルシードの軸を塗布したオブジェクトの法線方向に揃える
- ワールドXYZ軸に位置合わせはパーティクルシードの軸をワールド座標の軸に揃える
- ビューポートにルックアットはパーティクルシードの軸を塗布する瞬間のビューポートの視点方向に揃える
- particle Paint アイコンをルックアットは塗布する瞬間のパーティクルペイントヘルパーアイコンの位置方向にパーティクルシードの軸が向くようにする
- ストロークに従うはパーティクルシードの軸を塗布する時のブラシストロークの方向に沿わせる
例えばこんな形状のオブジェクトを作成して、

Shape Instanceオペレータでこのオブジェクトのインスタンスをパーティクルに割り当ててみた時、
Z軸を優先にして左のようにセットしてブラシストロークを下のような描き順ですると、

ブラシストロークに沿ってパーティクルがオブジェクト表面に並びこんな感じに配置される。

- UVWマップのベクトルに位置合わせはパーティクルシードを塗布するオブジェクトにUVWマップが設定されている場合にそのマップの座標軸をオブジェクトの表面上にローカル座標として貼り付けて、それに沿ってパーティクルシードの座標軸の向きを揃える
例えば下のようなチューブがあって、この表面をパーティクルペイントでペイントする場合、

このチューブに下のUVマップが貼られているとすると、このUVマップの座標は上の画像の黄色い矢印で表わした方向でオブジェクト表面に現れるので、

左のように方向を設定してブラシストロークをすると、
このようにUVWマップに沿った形で配置できる。

もっといっぱい塗って、シェイプのサイズも調整するとフッサフサに。塗る時はレイアウトの分割オプションを使ってパーティクルシードの間隔を揃えると綺麗に仕上がるね。それから下の画像のように最初から貼り付けた形にしたければ、Birth Paintの持続時間を0に、さらにペイントオブジェクトにロックの位置と回転にチェックを入れて、パーティクルペイントヘルパーのレイアウトロールアウトでアニメートオブジェクトにチェックを入れるとオブジェクトを動かしても付いて行くようになる。

ついでにこれらのパーティクルが上記で示したアニメーションに追従する設定にした時にボーン変形に追従するかを試してみたのが下のGIFアニメだ。なんとか追従出来そうだね。

さらに軸の方向は真逆にする反転オプションと方向をランダムにぶらす範囲を設定する発散があるけど想像がつくから、ま、いいかw。
それではまた次回。
2009年11月10日
画像ファイルの連番保存 modo 401 SP2
前回画像スカルプトをしていて、スカルプトの途中経過を保存するためには、画像を別名保存しなくちゃならないのが面倒だって書いた。
そこで今回はそれを解消するために画像ファイルに通し番号を付けて保存するスクリプトを書いてみたよ。
使い方はとっても簡単で、保存したい画像クリップが画像リストで選択された状態でsaveImagewithNumber.pyを実行するだけ。これでファイル名_4桁の通し番号という名前で保存される。通し番号はそのファイルが保存されているディレクトリを確認して、同じ番号のものがあったら上書きしないように番号を1ずつ増やして行って、同じ名前が無い番号になったら名前を確定して保存するようになっているので、10000回までは重複しない。
インストールはメニューバー→システム→高度な設定→イベントログを選んでイベントログを表示しておいて右下のコマンドの入力ボックスに下のように入力してやれば、
query platformservice path.path ? user
ユーザーディレクトリの位置がイベントログに表示されるので、そのディレクトリを開いてその中のScriptsフォルダーにsaveImagewithNumber.pyファイルを投げ込んでおけばOK(もちろんパスが通ってない所からでも実行出来るけどね)。
ついでにクリップのメニューに登録して置くと便利だよ。
何でもいいから画像ファイルを読み込んで画像リストに画像ファイルが1つ登録されている状態にしておいて、メニューバーからシステム→フォーム編集を選んでフォーム編集パネルを開いてフォーム検索ボタンを押す。
この状態で画像リストの画像ファイルを右クリックする。
すると、フォーム編集のリストが右クリックで表示させたクリップメニューのところにハイライトが移り、簡単に発見出来る。見つかったら展開して(新規コントロール)をクリックする。
コマンドの入力ダイアログが出たら
@saveImagewithNumber.py
と入力する。
ラベルとして「連番付き静止画保存」と入力する。
作った項目を仕切り線より上にドラッグ&ドロップする。
ALT+F12を押して設定を保存してフォームを閉じる。

これで使えるようになった。下のGIFアニメは画像ファイルを右クリックして、クリップメニューから「連番付き静止画保存」を選んでみたもの。画像ファイル名の通し番号が増えているのが確認できる。もちろんファイル名に連番の数字を最初から振っておく必要は無いよ。番号が無ければプログラムが勝手に付け加えるようになっているからね。

それではまた次回。
2009年11月09日
パーティクルシステムのお勉強 その23 3ds max 2010
本田さん、ガンバレー・゚・(ノД`)・゚・。
さて、パーティクルペイントヘルパーの残りのロールアウトについても調べていこう。
まずはレイアウトロールアウト。これはパーティクルシードをペイントする対象を限定したりマスクしたりと言った事を設定するものだ。
一番上はペイント対象のオブジェクトを絞るか絞らないかの設定で、「リストしたオブジェクトをペイント」を選択して、下の「追加」ボタンか「リスト別」を押してリストにオブジェクトを追加すると、そのオブジェクトだけパーティクルシードを吹き付ける対象になる。さらに下にある「子を含める」と「グループメンバを含める」のチェックボックスで、設定したオブジェクトの子やグループメンバもペイント対象にするかどうかを設定出来る。
例えば下の画像は立方体と円柱と球体を並べてペイントした場合、パーティクルシードがどのように散布されるかを表わしたものだ。見ての通り、投影方向に露出している面に散布されて、隠れている面には散布されない。

次に球体だけ散布対象としてリストに追加した場合、下のGIFアニメのように、ブラシでペイントしても、パーティクルシードが散布されるのは球体だけだ。

さらに円柱をマスクオブジェクトに設定した場合、円柱で隠れた部分はパーティクルシードが散布されなくなる。

もちろん散布対象を限定せずにマスクだけする事も出来るよ。
それからアニメートオブジェクトはチェックすることでパーティクルシードが散布されたオブジェクトの動きに追従するようになる。下のGIFアニメは散布した球体に動きを付けてアニメートオブジェクトのON/OFFを切り替えてみたもの。

選択フィルターはパーティクルシードを散布する範囲をオブジェクト表面上でさらに限定するものだ。選択肢としては「なし・選択された面のみ・ソフト選択」の3通りがあり、メッシュ・ポリゴン・パッチオブジェクトそれぞれのモディファイヤパネルにあるサブオブジェクトの選択の状態を使ってパーティクルシードの散布範囲を決められる。
例えば下の画像のように球体を編集可能ポリゴンに変換したものを選択してモディファイヤパネルでポリゴンサブオブジェクトを選択した状態で、
選択フィルタを「選択された面のみ」に設定してブラシでパーティクルシードをペイントしてみたのが下のGIFアニメだ。

選択したポリゴンの部分しかパーティクルシードが散布されていないのが確認できる。
同様に下の画像は編集可能ポリゴンのポリゴンサブオブジェクトモードでソフト選択ロールアウトの「ペイント」でポリゴンをソフト選択して「シェーディング面の切り替え」で選択状態を表示したものだ。
この状態で選択フィルターを「ソフト選択」に切り替えてパーティクルシードを散布したのが下のGIFアニメだ。選択強度によってパーティクルシードの散布密度が変化しているのがわかる。

パーティクルシードの位置は散布面に対してオフセットの指定をしたり、パーティクル間の距離を設定したりするためのものだ。ドロップダウンの選択肢は「サーフェス上・サーフェスの上・サーフェスの下・サーフェスの上下」の4通りがあり、後ろの3つが散布面に対してパーティクルシードの位置をオフセットして浮き上がらせる(または沈める)もので、その距離は下の距離パラメータと変動%で決める。パーティクルをオブジェクトに対してちょっと浮かせたいとか食い込ませたいって時に使うものだろうね(だいたい想像がつくと思うので例は省略)。
分割チェックボックスはパーティクル間の間隔を出来るだけ設定距離に近づけようと位置調整をするかどうかのスイッチだ。分割の横の数値がその距離で、位置調整をする回数が下の最大試行回数だ。試行回数が増えるほどパーティクルシード間隔は均等化して行くけどそれだけ時間もかかる(数によるけどね)。また、ペイント範囲に収まらなかったパーティクルシードははじかれて散布されなくなる。下の画像は分割をON・OFFした時のパーティクルシードの散布状況を比較したものだ。分割をONにするとパーティクルシードが均一に近い形で広がるのが確認できる。前回のペイントアニメはこのオプションを使った方が効率良さそうだな。

また「分離のためのスタック」は、パーティクルシードの位置調整をオブジェクトサーフェス平面上だけじゃなく、法線方向も含めた3次元で調整するかどうかのオプションだ。これがONの場合、散布したいパーティクルシードが範囲内に収まらない事が無いので、パーティクルシードの数を減らさずに間隔を空けて散布する事が可能になる。下のGIFアニメはこのオプションをON/OFFさせた時の比較だ。

うーん、なかなかパーティクルペイントから抜け出せないけど続きはまた次回。

























































