« XSI惑星。 | トップページ | Graveyard。無縁スクリプトたちの墓場。 »

2008年5月17日 (土)

jsCurveLength。カーブの長さを取得するプラグインが。


            
にょろにょろと長いものがうねうねと動いたりする時は当然 Curve Deformation をよく使うのだが、 変形されるオブジェクトの長さと Curve の長さは何もしない限り互いに独立した存在であり、リンクされているわけでも何でもない。 従って Curve の長さが変わった時、変形されているオブジェクトの長さが自動的に追随してくれるわけではない。しかし大抵の場合、自動的に追随して欲しい。 自動追随機 能付けろやゴルァ と昔から思っていた。しかたなく今まではオブジェクトの長さ(Curve Deformation 内の Scale Along Curve)を手動でアニメーションさせるという恐ろしく原始的な方法で対処してきた。
      
      
そもそも、Curve の長さを Expression で取得できないのが一番いけない。
これさえできれば、刻々と変わる Curve の長さを毎フレーム取得して、オブジェクトの長さと Expression でつないでやればいいだけなのだ。 Softimage さんなんとかしろや ゴルァ
      
      
しかし、スクリプトで Curve の長さを取得できることはわかっていた。ってことは Expression の代わりに Scripted Operator できるんじゃないの? と思ってちょっとだけいじってみたりしていた。真面目に勉強するのがめんどくさくてテキトーにやってみたら、一応はできた。カスタ ムパラメータに Scripted Operator を埋め込んで Curve の長さをぶち込み、変形されるオブジェクトの Scale Along Curve パラメータがそれを常に参照しているという、上に書いたそのまんまの構造。
      
しかし問題があった。再生した時はちゃんと動くものの、Curve の長さが変わる操作をやっている間は結果がインタラクティブに反映されないのである。結果が反映された状態にするには再生あるいは現在フレームを移動させるな ど、シーン状態のリフレッシュが必要だった。また、Curve の名前をハードコーティングしてしまっているため、Curve の名前や階層を変えるとリンクが切れてしまい、適用し直さない限り使えないというどーしよーもないものだった。
のちにこれは、Curve の長さの取得に Object Model を使わず、 Scripted Operator の中で GetCurveLength という名前の Command を走らせるという、どうやら基本的にやってはいけないことをしているためらしい、というところまではわかったが、その先はまだ勉強不足。。。。
      
で、この問題未解決 Scripted Operator を使ってある仕事でにょろにょろのうねうねリグを作っている時に、なんとタイミングの良いことか、同じ目的の Scripted Operator を自動で作ってくれる、しかも結果がインタラクティブに反映されるツールを投下してくれたスヴァらしいお方がいた。
      
jsCurveLength.xsiaddon
http://www.xsibase.com/forum/index.php?board=11;action=display;threadid=35052
      
中盤の Squid さんというお方の投稿に、addon が添付されています。.txt を取っ払ってインストール。

Jscurvelength2

↑ボタンが1つだけある Toolbar ができるので(画像左上のウインドウ)、Curve を選んだ状態でボタンを押すと Curve 自身にカスタムプロパティがぶら下がり、js_CurveLength という名前のパラメータ(UI上の名前は Curve Length)に Scripted Operatorが適用された状態になる(画像左下のウインドウ)。 あとは自分の Curve Deform のパラメータと Expression で結んでやるだけ(画像右側のウインドウ)。 この例の場合はもともと Curve の長さが 8 で、変形されるオブジェクトの長さもぴったり 8 にそろえた状態で Curve Deform を適用したので、Curve の長さが 8 の時に Scale Along Curve は 1 になるわけで、つまり 8 : 1 の関係なわけで、従って単純に 8 で割れば良いだけという Expression になった。
      


      

Jscurvelength1

↑左が元の状態。 Curve の長さもシリンダの長さも 8。
中が通常の状態。Curve の長さが変わってもシリンダの長さは追随しない。
右がこのツールを使って取得した Curve の長さを上記の Expression で結んだ状態。Curve をいじって長さが変わったとしても、シリンダはどこまでも、いつまでも、永遠に追随する。Curve の名前を変えても問題なし。スヴァらしい。
      
      
      
      
しかしまあなんと良いタイミングだったか。 いや、実際はリグを組んでしまった後だったんだけど、カスタムパラメータを差し替えるだけで済むのでサッとリ グを改造したのでした。 プラグイン化されているので手動で Scripted Operator をいじれない Foundation を使っていたとしても問題なし。スヴァらしい。 Squid さん、ありがとう。これがなかったらあの仕事終わらなかったよ。しかも偶然に、Squid の10本の足に使わせてもらったよ。 Squid さんは UK 在住なんですね。じゃあ今度英国に行く機会があったらパブで黒ビールを1パイントおごりますよ。
      
      
Scripted Operator も勉強しないとなー。
でも、もしかしてこれくらいのことなら月屑だか氷だかのノードとして提供されるんじゃないかしら。
      
っていうかやはり Curve Deformation 内に Curve の長さを反映させるオプションを付けて下さい。もしくは Expression で Curve の長さを取得できるようにして下さい。 わかりましたか Softimage さん。頼みましたよ。
      
      
      
      
      

|

« XSI惑星。 | トップページ | Graveyard。無縁スクリプトたちの墓場。 »

コメント

これは素晴らしいですね
制作効率があがりそうです。
素敵な情報ありがとうございます。

Fカーブといえば、アニメーショネディタで選択したキーを解除するときに中ボタンでキーを囲って選択解除してたのですが、6.5から解除できない仕様になって、とまどい中です。
パスの仕様といい、6は何故かイヤなとこばかり目に付きます。。

投稿: 肉だんご | 2008年5月19日 (月) 20時31分

肉だんごさま。カーブの長さは色々使えますね。
パスアニメーションにも応用できると思います。
すでにキー済みのパスアニメーションで、
パスの長さが変わっても位置が変わらないように
するとか?(思いつきでテキトーに言ってますが)

>中ボタンでキーを囲って選択解除してた

自分はもともと Ctrl を押しながら左ドラッグしてたと思うんであんまり気にならないですが、たしかに6になってからFカーブエディタの挙動がかなり変わって戸惑った覚えがあります。今でも多少戸惑いますね。

キーの選択解除は、Delesect All Keys のショートカット作ってほとんどそれでやってるかも。いったん全部の選択解除して、必要なものは選びなおす、って感じですね。考えてみれば非効率ですが、なぜかこういうクセが付いている。。。。

あれ、今気づいたけど、オブジェクトの頂点をタグしたときは、オブジェクトの選択を解除してまたそのオブジェクトを選び直したときに、タグされた頂点はタグされたまま残ってますよね。でもFカーブは、カーブ自体を一度選択解除しちゃうと、そのカーブを選び直したときに、選択されていたキーフレームは選択解除されてますねえ。選択状態を保存しといてくれないんですねえ。
これは不便な気がしてきた・・・。

>パスの仕様といい、6は何故かイヤなとこばかり目に付きます。。

パスの仕様のイヤなところとは?
参考までに教えてください。

投稿: junki | 2008年5月20日 (火) 12時42分

●中ボタンの件
設定で操作を変えれるように仕様変更したようです。
アニメーションエディター > ファイル > 設定 > MMBで移動のチェックを外す。
これで自分の思うような操作感になりました。お騒がせしました・・

●レンダパスの件(パスだと不明確でしたが、レンダパスの事です)
モデルを作成したシーンでレンダパスの設定がしてあるとします。
モデルをエクスポートし、他のシーンにてインポートした際に
モデル元のシーンと同構造のパス分けがしてあっても
インポートしたモデルはパス分けの通りに配置されません。
※XSI6以前のバージョンではパス分けの通り入ってくれていました。
これが出来ないと、いちいちパスに入れなおさないといけないという、とても面倒で時間をくわれる作業をしなくれていけません。
もしくは、ユーザがあらかじめパス分け用のスクリプトを作っておく
これも仕様変更で起きた現象です。
ですが、どうやら5以下でも仕様じゃなくて「たまたま出来てた」らしいです…怖い。

投稿: 肉だんご | 2008年5月22日 (木) 12時02分

>ですが、どうやら5以下でも仕様じゃなくて「たまたま出来てた」らしいです…怖い。

どっかでこれ、読んだ覚えがあります。どこだっけな。
肉だんごさま、「たまたまできていた」の情報源を教えてもらえますか?
というのは、これに関するプラグインを作ろうと考えていて、いろいろ調べたいのです。

もともと Model には Pass の情報は含まれないというのが公式の仕様なので、自分は基本的にそういうもんだと思って使っています。そもそも、新規シーンにインポートした場合なんかは、Default_Pass しかないので、Pass が再現されるって無理じゃないの? と思うんだけどどうでしょう? もしかして新規シーンに、全く同じ Pass 構造をあらかじめ手で作っておくと、元々の Pass/Partition 構造が自動で再現されるんでしょうか?


ある程度自動化するために Pass --> Groupに置き換えて Model にぶら下げる、みたいなスクリプトを書いたりしたこともありますが、もっと大幅に自動化できるかどうか、試してみたいと思っています。そのうち。

junkithejunkieアットマークgmail.com

投稿: junki | 2008年5月22日 (木) 12時17分

> Model には Pass の情報は含まれないというのが公式の仕様なので、自分は基本的にそういうもんだと思って使っています。
その通りかと思いますので、確かに本来できないのが当然なのだと思いますが。
ですが、5.x(4以下は忘れましたが)では、全く同じ Pass 構造をあらかじめ手で作っておくと、元々のPass/Partition 構造が自動で再現されます。
とてつもなく便利なので、分業する過程上、パス分けしてあるシーンにモデルをインポートするというワークフローでやってました。
6で出来なくなってたので問い合わせたところ「確かに出来ますね。でも仕様じゃないので、たまたまできてます」と、Softimageさんに回答いただきました。

最近はリファレンスモデルを使ってみてるので、そちらでパス分けしてます(デルタ情報にパス分けの情報が入る)

投稿: 肉だんご | 2008年5月22日 (木) 12時38分

肉だんごさま、色々情報ありがとうございます。
Pass再現プラグイン、ちょっと手を付け始めましたが、むずい。

Pass に相当する Group を作って、その Group の子供に Partition に相当する Groupを作って、
オブジェクトはその Group にぶち込み、様々なプロパティを Partition からGroup にコピーし、
Model にぶら下げて書き出し、他のシーンに読み込んで Group から Pass と Partition を作り直す、
という妄想を抱いていたのですが、全ての工程においてつまずきっぱなし。自分の能力をはるかに超えている予感。

ということであっさりと中断しました。Orz

投稿: junki | 2008年5月23日 (金) 18時30分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/41237904

この記事へのトラックバック一覧です: jsCurveLength。カーブの長さを取得するプラグインが。:

« XSI惑星。 | トップページ | Graveyard。無縁スクリプトたちの墓場。 »