オレ的最強コンストレイントでウハウハ

やや調整してみた胸寄せ。
画像


LightWaveのFollowerプラグイン。
元々はパス制御のもので、リーダーのロケーションに対して相対的なずれを作ることで群衆制御をすることを目的としているようだけど、チャンネルを任意に入れ替えできる等SimpleConstraintよりも使い勝手がいいのでFKハンドルでボーン制御する時にコンストレイントの代わりに入れてます。
同じような人も多いんじゃないかと思います。

んが、手軽な分複雑なことはできない。

エクスプレッションの方が細かい設定ができるけど、チャンネル毎に入れるのとターゲットチャンネルを選択するのが結構面倒だし、角度制限とかをやろうと思うとかなり複雑な式になっちゃう。

ぼくとしてはコンストレイントを改良したいと思っていたわけです。

で、これを作らないと先に進めないような気がするので、満を持してオレFollower…とゆーかConstraintプラグインを作ることにしました。


特徴。

1. 複数のターゲットのブレンド
複数のボーンまたはNullに別々に係数を掛けて足し合わせることができる。
係数にはエンベロープも指定可能。

2. ターゲット毎にリミット
上限、下限を設定し、インフィニティのイーズイン/アウトも設定可能。

3. ターゲット毎に座標系指定
ターゲット毎にPosition/Rotationそれぞれで座標系を指定可能(Scaleはローカル固定)。
さらにターゲットのローカル/ワールド座標系から、操作対象の親座標系(ルートの場合はワールド座標系)に変換することも可能。

4. Aimコンストレイント
モーション設定の「目標を注視」と同等のAimコンストレイントが指定可能。
係数のエンベロープを設定すれば、「視線を泳がす」とかも可能。

5. ノンモーダルなパネル
FollowerやConstraintはモーダルなパネル(設定画面)なので設定中は結果を確認できないけど、ノンモーダルなパネルで逐次設定を取得更新するので結果を確認しながら編集可能。
(ただ、プレビューを更新する方法が分からないんでフレームを移るとかなんらかの操作しないと確認できないんだよね…。)

6. テンプレートの保存
設定をテンプレート名を付けて保存できるので、別のモデルでも呼び出せる。
(ターゲットは名前が一致すればロード時に復元)


とゆー6つの機能を兼ね備えていて、エクスプレッションと違いまとめて、且つノンモーダルで設定できるのでエクスプレッションをチャンネル毎に組んでいくよりも素早くセットアップができるっつーシロモノ。
あとアイテムの現在値を置換するほか、加算したりウェイトと補間することもできるようにしてます。


コントロールのレイアウトがしたくてPathTracerで使用したXPanelsからPanelsに変更したんだけど、Panelsのクラスラップするのにけっこう時間がかかっちゃいました。
まあラップしたんで、コントロールの追加はXPanelみたいにテーブルで設定できるようになってます。
加えてレイアウトもかなり簡単にできるんで、今後ももりもりプラグインが組めます。

で、何に使うかとゆーとFollowerの代わりに順次入れていくわけです。
例えばおっぱいの設定はこんな感じ(前回のFollowerと見比べてください)。
画像

まあほとんど一緒だけど、リミッターが設定できるのがミソ。
これによって、胸寄せしてない時におっぱいが逆方向に動くのを防いでます。
あと、寄せすぎも防止できる。
リミッターはもみあげが髪にめりこまないようにするのにも一役買ってます。

とりあえず必要なとこから少しずつ入れ替えてます。

使ってみて失敗したなーと思ったのが、リミットは出力値に対して行うんだけど、出力値よりも入力値にリミットとバイアスをかけるほうが使いやすいし応用が利きそう。
今は
(入力値→ウェイト乗算→出力範囲クリップ)→集計→定数加算→出力値
だけど、
(入力値→範囲クリップ→バイアス加算→ウェイト乗算)→集計→定数加算→出力範囲クリップ→出力値
みたいな流れだな。
また手間かかるけど改良したい。


とりあえずこれを使った「胸のボーンに一切キーを打たない胸寄せ」を動画にしてみました。
おっぱいの変形具合が分かるように上半身剥いてボディペイントにしてます。






前出の設定パネルでは、肩のボーン(chest)が35度以上前方に傾いたら胸が変形するようにしてます。
二の腕で寄せてるわけではないので、腕と肩をうまくタイミング合わせないと怪しい動きになったりするんだけどね…。


今回はプラグイン作成のほうに時間がかかってほとんど何も変わってないんだけど、悪魔ッ娘の微調整をしてます。目の周辺とか口元とかおっぱいとかおしりとか肩とか(意外といろいろいじってんじゃん)。


しかしこのプラグイン作ってて思ったんだけど、LightWave(v9.6)は、サーフェスにはノードエディタがあるのに、ロケーション(position/rotation/scaling)にはないんだよね。
MayaだとDGノードがあって、コネクション間にエクスプレッションノードとかが挟めるようになってる。(XSIは触ったことないのでわからない)。
最初、Panels内にノードエディタもどきを入れてロケーションに演算ノードを任意に組み込んで自由にいじれるようになったらいーなーと考えたけど、費用対効果で断念しました。(Panelsって実装の手間がかかる割にはやりたいことができなかったりするんで。)
v10ではどうなったのかわからないけど、v10でも特に進展がないようなら検討したいと思ってます。

その前にアップグレードするのか、オレ?!

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 3

なるほど(納得、参考になった、ヘー)
ナイス ナイス

この記事へのコメント

2010年11月04日 16:24
 設定変更の即時反映は、XPanelであればinstanceUpdate()、panelであればLWCommandFunc("Refresh")でnewTimeを発生させて反映させる事になると思います(cmdFunc()については「コマンド」ページを参照)。
 後、Motion等へのノードエディタ導入はこちら(http://dpont.pagesperso-orange.fr/main_en.htm)のプラグインで実現されています(9.0と9.2~の非互換動作からノード変更の即時反映に少々難あり。9.6ではMotion->Flags()の非互換動作による問題も出るかも)。
2010年11月04日 19:04
このような「男のロマン」に対する案山子様のこだわりは素晴らしいです。
ボクはまだモーション系まで追いつかないので、妄想の中で補完しておきます。
是非参考にさせていただきます。
ちなみにブログ内の動画のリンクはどのようにされているのでしょうか?
ボクもYouTubeでやっとこ動画の貼り付け方法はわかったのですが、案山子様のように単に動画だけシンプルに貼り付ける方法が分からず悩んでいます。
2010年11月04日 23:57
浅妓さん、フォローありがとうございます。
おかげさまでプレビューを更新できるようになりました。
Refreshのリファレンスが見当たらなかったので、コマンド履歴みながら実装してみました(まあ特に引数はないですけど)が、これって未公開なんですかねぇ?LWにはこの類はたくさんあるみたいですが…。
dpontの情報もありがとうございます。サイトだけブラウズしてみました。
DPKitですか? サーフェスのノード編集をそのままいろんなオブジェクトに拡張しちゃうってのはなかなか凄いですね!
折を見て試してみようと思います。
2010年11月05日 00:00
U-39さん、コメントどうもです。
いやーこだわり…というか、気になったところを掘り下げてるだけです。
「先に進めよ」と言われそうですが。

ムービーは、ブログでは動画はアップできないようなので、ホームページ用の
サーバにFTPで上げてリンクを貼ってるだけです(HP自体は何もコンテンツないです)。右クリックして「ソース表示して」もらえればわかるかと思います。
Flashに比べるとあまり圧縮率は良くないですが、スライダの使いやすさから敢えてQuickTimeにしてます。
2010年11月05日 18:08
 コマンドについてはSDK Documentのコマンド項の説明と、レイアウトでのSaveCommandListコマンドで得られるリストが全てだと思います(モデラのSave~は9.2位から壊れてます)。9.6~の追加/変更分に関しては英語版SDK Docを見る方向で(DStormサボりすぎ)。
 DPontの方はDPKitのページ(の左フレーム下方の○○Editor)から辿る先がそれになります。NodeEditorはGlobalですし、任意のClassに載せるのは面倒だけど難しくは無いので、自分で作った方が勝手が良いかもしれません。
 実際にMotion等にNodeEditorを使う場合は算術系のNodeが不足するので、その用意の方が面倒だったりしますが('д`)