« 西からビールウェア。 | トップページ | 整数乱数の激怒。 »

2011年11月 9日 (水)

愛☆ちゅカーブレングス。

某所で ICEドリル というものが流行っています。


いや、まあ、単に俺的ブームというか、自分が今やっている作業に利用させてもらっているだけですがね。 ICE を使った特定のタスクで、みんなで知恵を出し合って解決法を教え合うような主旨かなと思っていたのですが、俺の場合、自分で解決できない問題を誰かに解決してもらうという、じつに厚顔無恥な使い方をさせてもらっております。 すいません orz  恩返しはいずれ俺が ICE的に成長してからってことでね。出世払いで許して。






で、カーブの長さの取得ですよ。


今まではスクリプトオペレータ(SCOP)でよくやってました。他人様の書いたプラグインとかスクリプトを利用させてもらってるんですがね。 過去にもこのブログに書いたことありますね。 これこれか。



これを、なんとか ICE 化できないものか、と。

ICEドリルな方々に教えてもらいながら、ひとまず ver1 です。 稚拙ですがスクリプト書きました。書きたてホヤホヤです。 熱いので冷ましてからどうぞ。





カーブを選んで(複数可)、以下のスクリプトを実行します。



---------------------------------------------------------------------------------

//    カスタムプロパティを入れる器ヨーイ

var oProps = XSIFactory.CreateObject( "XSI.Collection" );

//    選択中のブツをループして、カーブだった場合はファンクションに飛ばして処理実行
for ( var i=0; i<Selection.count; i++ )
{
    if ( Selection(i).type == siCrvListPrimType )
    oProps.Add( SetIchuCurveLength(  Selection(i) ) );
}

//    器がカラじゃなかったら(プロパティが存在したら = この場合、選択にカーブが含まれていたら)、PPG を表示しておしまい
if ( oProps.count != 0 )
{
    InspectObj( oProps );
}



//    以下、メインの処理をするファンクション

function SetIchuCurveLength( oCurve )
{

    //    カーブにカスタムプロパティを与え、カスタムプロパティに Length パラメータを与える
    var oProp = oCurve.AddProperty( "CustomProperty", false, "IchuCurveLength" );
    oProp.AddParameter3( "Length", siFloat, 0 );

    //    ShapeModelingモード以下に ICETree を作成。 名前も付ける
    //    ApplyOp のカッコ内最後の 1 を変えると、他のコンストラクションモード以下に作る

    var oICETree = ApplyOp( "ICETree", oCurve, siNode, null, null, 1 )(0);
    oICETree.name = "ICETree-IchuCuveLength";

    //    Set Data ノード召還。 カスタムプロパティの Length パラメータに接続
    var oSetDataNode = AddICECompoundNode("Set Data", oICETree );
    SetValue( oICETree.fullname + ".Set_Data.Reference", "this.IchuCurveLength.Length", null );
    ConnectICENodes( oICETree.fullname + ".port1", oSetDataNode.fullname + ".Execute");

    //    Get Data ノード召還。 this.CurveLength をセットし、上記 Set Data ノードの Value ポートに接続
    var oGetDataNode = AddICENode("$XSI_DSPRESETS\\ICENodes\\GetDataNode.Preset", oICETree );
    SetValue( oICETree.fullname + ".SceneReferenceNode.reference", "this.CurveLength", null);
    ConnectICENodes( oICETree + ".Set_Data.Value", oGetDataNode.fullname + ".value");
   

    //    プロパティを返す
    return oProp;
}

-------------------------------------------------------------------------------- 



すると、

Ichucurvelength1

カーブの下に、IchuCurveLength というカスタムプロパティが作られます。その下には Length というパラメータがあります。

カーブの Shape Modeling コンストラクションモード以下には、ICETree が作られます。

その ICETree の中で自身(カーブ)の CurveLength アトリビュートを取得しています。Get Data の部分です。 そしてその結果を、上記のカスタムプロパティの Length パラメータにブチ込んでいます。 Set Data の部分です。



結果、カーブをぐねぐねいじくると、Length パラメータはインタラクティブにアップデートされます。 これがやりたかったんです。 ICEで。




Shape Modeling コンストラクションモードに ICETree を置いたのは、Modeling よりも上ならまあいいだろうというだけのことで、あまり考えていません。 Modeling モードに置いてしまうと、カーブの形をいじくった履歴が ICETree の上に来てしまい、ICETree で結果の長さを正しく取得できません。 なので Shape Modeling モードに置いたのですが、考えてみれば、例えば Animation モード以下でカーブの長さが変わるようなことをやっていた場合、やはり正しく数値をゲットできませんね。 ってことは、Secondary Shape Modeling モードとかに置いた方がいいのかも知れません。




ちなみにカスタムパラメータを介さずに、元からある XSI の何かのパラメータに接続しようとすると、できる場合とできない場合がありました。 できない場合というのは、Set Data ノードでデータのセット先を決めるとき、Explore ボタンで出てくるミニExplorer の中に、目的のパラメータが見つからないという状態です。

例えば、ヌルの size パラメータに直接接続するのは、問題なくできました。 一方、グリッドの Geometry Op の中にあるパラメータ(グリッドの大きさや分割数)は、全滅でした。 そもそも Geometry Op が、Set Data のミニExplorer に出てこないもんだから、ピックしようがない。



今回のやり方では、カスタムプロパティの Length パラメータにセットするので、ここを中継すればどんなパラメータにも接続できると思います。 普通に Expression でつなぐだけ。 これはまあ、以前の SCOP 使ったやり方でも SCOP によってアップデートされるのはカスタムパラメータでしたからね、同じことですね。



ただし注意しなければいけないのは・・・・。 



SCOP の場合は、SCOPで制御されているパラメータのアニメーションアイコンは S に変わるじゃないですか。 ミキサーで駆動されているパラメータは、ミキサーで動かされてますアイコンに変わるじゃないですか。 よって、手ではキーを打てなくなりますよね しかし今回の ICE で駆動するやり方の場合、上記 Length パラメータのアニメーションアイコンは、変わらないのです。そのまんま、通常の緑色の四角のままです。 ってことは、ここに普通にキーを打てちゃうんです。


で、キーを打つと、カーブの長さが変わっても数値がアップデートされません。 キーがあった場合はそちらが優先されるのかなあ? あるいは GUI 上でアップデートされてないだけで、スクリプトで値を取得してみると内部的にはちゃんとアップデートされているとか? ← XSI様に実にありがち


ならばキーを打てないようにするために、このカスタムパラメータを作成する時点でアニメーション可能フラグをオフにしてしまうこともできるんですが、そうなるとあの緑色の四角が出てこなくなるので、他のパラメータに Expression でつなぐ時に困りますよね。



ってことで、キーを打たないよう注意して下さい。







っていうか、ICE から制御されている時には、アニメーションアイコンがそれ用のものに変化して、キーが打てなくなればいいんだよ。 SCOP でも Mixer でも Expression でも、皆そうなるじゃないか。 なぜ ICE だけそうならないんだ。 嘔吐デスク様?




それと、この Length を Show Value しても、ビューポート上に値は出ません。 おそらく、Show Value が効くのは ICETree の中で値をセットしている時だけなのでしょう。 今回はカスタムパラメータにセットしてますから、ICETree の外に向かってセットしているわけで、効かないように見えます。 ダミーのアトリビュートを作って同じ値をセットしてやれば、Show Value できると思います。 そうか、そうすりゃ良かったかな。








それと、挙動がどうもアヤシイので、さらに注意書きを書いておきます。




まず、こういうカーブに適用した場合。

Ichucurvelength2

なんてことないカーブですけどね。
のポイントを、Mキーを押してぐりぐりいじくったりしても全然平気なのですが、真ん中ののポイントをいじろうとすると、いじれないか、レスポンスがすごく遅くなります。


なんで? なぜこうなる。 さっぱりわからないけど、俺のところでは必ずこうなります。


しかもですね、Mキーでの移動、つまり Tweak ツールですね、Tweak ツールを使った時だけこのアヤシイ挙動になるのです。 Tキーを押してBのポイントをタグし、Vキーを押して移動させる時には、普通にスイスイ反応してくれます。 おかしいのは Tweak ツールの時だけです。


カスタムプロパティを削除したり ICETree を削除すると、つまり何もしていない元のカーブの状態に戻すと、普通にスイスイいじれます。 なので、俺のこの ICETree などが悪さをしていることは間違いないんだと思いますが、なぜなのか、どこがそうさせているのか、さっぱりわかりません。 よくわからないのでご注意下さい。










もうひとつ、ヘンなことに気づきました。

上記と同じ場合で、Length を他の何かのパラメータに接続した場合です。

Ichucurvelength3

この場合、Length をトーラスの Radius に Expression で接続しています。 つまり、カーブの長さが変わると、トーラスの大きさも同期して変わるという状態です。 実際の仕事では、カーブの Length は何かに接続してこそ意味がある場合が多いはずで、普通はこの状態で使うと思います。


で、このように何かのパラメータに接続されている状態にすると、上記の Tweak ツールの問題は起きないんですよ。 つまり、Tweakツール使ってもBのポイントもスイスイいじれる。 なんでだ?


A と C はもともと問題ないから、関係ありません。問題出ません。


この Expression の関係を絶つと、つまり Expression を削除すると、やはり Tweak ツールでいじりにくい問題が復活します。




さらに。

Tweak ツールの問題が出ている状態でしばらくいじくっていると、XSI 様が瞑想に入られます。

いやまあ、XSI様 の瞑想自体はね、別に珍しくもなんともないんだけど。でもまあ、再現率の高い瞑想です。






ってことで、謎も多く、爆弾も仕込まれてるスクリプトですが、よろしければ是非使って頂きたいです。 そして感想や注文を聞かせて頂きたいです。 特に上記不具合が再現するかどうか。  

そうやってフィードバックがあると、不具合を発見したり、そもそも論の根本的な問題が出てきそうな気がします。 それこそが、ICE 理解へのキーだと思います。 問題が出て、その回避方法が見つかれば、挙動の理解に役立つわけですね。 問題・不具合が出ないとなかなか理解って進まないものです。 俺の力では、不具合とか見つかっても修正できないかも知れないですが、それをきっかけに理解を進めよう・オベンキョしようという魂胆なわけですよ。 上手く行った事例からよりも、上手く行かない事例からの方が学ぶこと多いですよね。 






改造も大歓迎っス (゜∀゜)








.

|

« 西からビールウェア。 | トップページ | 整数乱数の激怒。 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: 愛☆ちゅカーブレングス。:

« 西からビールウェア。 | トップページ | 整数乱数の激怒。 »