日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年12月26日土曜日

Fieldコントロール(4):floatField(3)


「フィールド入力値をスクリプトで利用する」
という目的を達成出来る方法は二つあると前回書きました。それは以下の二つです。
1)フィールド入力値を変数へ代入
2)または、フィールドをアトリビュートに接続


今回は「2」の方です。

この接続は「-attribute」フラグを持つ以下のコマンドであれば簡単にできます。
「attrFieldGrp」, 「attrFieldSliderGrp」, 「attrColorSliderGrp」
しかしながら、
●「attrFieldGrp」は、「Vectorアトリビュート」との接続のみ。
●「attrFieldSliderGrp」は単独のアトリビュートに使えるが、スライダーが附属。
という感じでしっくりきません。
(ちなみに「attrFieldSliderGrp」についてはDigitalMatrixで説明されています。)



また今回使用したい「floatFiled」コントロールには「-attribute」フラグがありません。
したがって、アトリビュートへの接続はできません。

こういった「-attribute」フラグを持たないコントロールをアトリビュートへ接続するには、「connectControl」が使えます。

「connectControl」を使うと以下の事が可能になります。
●「-attribute」フラグを持たないコントロールとアトリビュートを双方向コネクションする

これにより、値の変更はリアルタイムに反映されます。
実際の動作を、説明すると以下の通りです。
1)コントロールで数値を変えれば、接続されたアトリビュートの値が連動して変わる。
2)アトリビュートの数値をチャンネルボックスなどから変更すれば、接続されたコントロールの数値も変わる。

よって、
●ビュー内で対象の変化を確認しながら使いたい場合には便利です。

ヘルプによると、フィールド、スクロールバー、スライダー、チェックボックス、ラジオボタン(コレクション)などのコマンドに使用できます。
ヘルプに掲載されている使用可能なコマンド例は、以下の通り
floatField, floatScrollBar, floatSlider, intField, intScrollBar, intSlider, floatFieldGrp, intFieldGrp, checkBox, radioCollection, optionMenu



話が少しそれますが、「connectControl」については、検索してたときに偶然みつけたページ「オレコンのすすめ2(ちょっと前進編)」で知りました。

NHK人体2の製作や、CG映画のファイナルファンタジーでキャラクター製作に関わり現在はフリーでご活躍のKonKonさんという方が作られたページらしく、「ウインドウ作成」と「コントロール」に関して、とても簡潔かつ要点をおさえて書かれています。

なお、現在、KonKonさんのホームページ「特殊映像研究会」からは上記のページへたどり着くリンクを見つけることは出来ませんでした。意図的なものかもしれないので、上記のページへのリンクは当ブログには掲載しませんでした。どうしてもみたい方はGoogle検索してみてください。


----------------------------------------
(1)「connectControl」

実際の使用例としては、オレコンのすすめ2(ちょっと前進編)」にも、いくつかの例が載っています。
今回は、それを参考にして、自分なりのスクリプトを作りました。
{
sphere;
window name;

columnLayout;
floatField testField;

connectControl
testField "nurbsSphere1.sx";


showWindow;
}

Nurbsスフィアが一つ作成され、フィールドの数値を変えるとX方向へスケールされます。

スクリプトエディターのヒストリ欄を見ると、
setAttr "nurbsSphere1.scaleX" 1.115;
と言った表記が見つかります。

要するにsetAttrを実行してアトリビュートをリアルタイムに反映しているということです。

実はこれは、通常オブジェクトのアトリビュート値を「チャンネルボックス」や「アトリビュート・エディター」で値を変更したときの動作で特別な物ではありません。
「チャンネルボックス」や「アトリビュート・エディター」から値を入力するのと同じ事がおきているということです。

逆に「チャンネル・ボックス」から値を変更した場合も通常通り「setAttr」が実行されますが、同時にウインドウ内のフィールドの値も変更されます。
(図:アトリビュートの相互関係)


ここでちょっと気になったのが、
チャンネルボックスで見るとエクスプレッションやキーフレームのようにアトリビュートに接続を示す色はありません。
Hypergraphで見ても、接続を示す→などは見あたりません。

では、この「connectControl」で接続されているアトリビュートにエクスプレッションを使うとどうなるか試してみました。

ポリゴン・キューブを一つ作成し、
nurbsSphere1.scaleX = pCube1.translateX;
というエクスプレッションを作成しました。

キューブをX方向へ移動するとスフィアはその位置に応じてスケールされます。
そしてフィールド内の値も変更されます。
この場合「setAttr」は使われません。

次にフィールド内の数値を変えると、「setAttr」は実行されますが、その数値は反映されません。
これはエクスプレッションが存在するアトリビュートに値を入力しても反映されないのと同じです。
またエクスプレッションを削除すれば、元通り連係動作をします。

要は、このフィールドは完全にチャンネルボックスやアトリビュート・エディター内の該当アトリビュートのフィールドと同じということです。

それらのフィールドを、どこに表示しているかの違いだけです。
(もちろん、アイデア次第で異なる使い方もできるとは思います。)

また、すでに存在する対象のアトリビュートを操作するためのMelには向いていますが、 アトリビュートが存在しない状態で、数値を設定する必要があるクリエイト系のスクリプトには向いてないと思われます。(使えなくはないでしょうが、より複雑になりそうです)



----------------------------------------
(2)簡単便利な「attrControlGrp」

オンラインヘルプで調べて居るときに偶然見つけたのですが、これはひょっとしたら上記のコマンドより簡単で便利な気がします。
ひょっとすると初心者はこれ一つですべて間に合うかもしれません。

それが「attrControlGrp」です。

オンラインヘルプには以下のように説明されています。
「このコマンドは、指定したアトリビュートに最適なタイプのコントロールを作成し、そのコントロールをアトリビュートと関連付けます」

これを使えば
●他のコントロール・コマンドを覚える必要がない。(例外はあります)
●「-attribute」フラグで、特定のアトリビュートへの接続ができます。

早速使ってみます。
{
window name;
columnLayout;

attrControlGrp -attribute "nurbsSphere1.tx";

showWindow;

}

これを実行するだけで、以下の事が自動的に行われます。
●「Translate X」というラベル名の作成
●「floatField」をウインドウ内に作成
●「nurbsSphere1のTranslateXアトリビュート」への接続

(図:attrControlGrpをTranslateXへ使った結果)



floatFieldは簡単なので、やや複雑な例をみてみましょう。
ここでは、ランバート・シェーダーのカラー・アトリビュートのコントロールを作ってみます。
{
window name;
columnLayout;
attrControlGrp -attribute "lambert1.color";
showWindow;
}

●ラベル
●カラー キャンバス
●スライダ
●ボタン
が自動的に作成されます。
(図:attrControlGrpをカラー・アトリビュートへ使った結果)

これは「attrColorSliderGrp」を使用した場合と同じ結果です。
上記のフィールドを作成したのと同じコマンドで達成できています。


このように「attrControlGrp」は個々コントロールの知識が無くても簡単に作成できます。
ただしヘルプにも書いてあるように、万能ではありません。
「すべてのアトリビュート タイプがサポートされているわけではありません。」


----------------------------------------
さて上記の方法を使った場合、入力値を対象アトリビュート以外でスクリプト内で使うには、もう一工夫必要です。(変数への代入など)
しかしながら、現在の自分の計画にはそういった用途がないので、今回は掘り下げることはしません。



----------------------------------------
まとめ
----------------------------------------
アトリビュートとコントロールを結びつけるには

(1)「-attribute」フラグのあるコントロールを使う。
(例)attrFieldGrp、attrFieldSliderGrp、attrColorSliderGrpなど

(2)「connectControl」を「-attribute」フラグのないコントロールと組み合わせて使用。

(3)「attrControlGrp」を使えば、最適なコントロールを知らなくても自動的に作ってくれる。

(4)アトリビュートとの接続なので、該当アトリビュートがすでに存在している必要がある。

(5)接続するアトリビュートが存在しない、クリエイト系のスクリプトには向かない。(?)

(6)これは、チャンネルボックスやアトリビュート・エディターから該当アトリビュートの値を変更するのと同じこと。

(7)リアルタイムに処理が反映される

(8)入力値をスクリプト内で使うには「getAttr」を使うなどもう一工夫必要。

 

0 件のコメント:

コメントを投稿