2021年2月24日水曜日

リグコントローラのピッカーを作る

  リグコントローラを選択するためのツールとして「ピッカー」というものが有るようです。
  「シノプティックビュー」とか「セレクター」とか、いろいろ呼び方が有るようで、どれが一般的な呼び方なんでしょうかね?
  でも、HumanIkの「キャラクタ リプリゼンテーション」は意味不明すぎます・・・。

  mayaで自作のリグを組むと、たいていピッカーも自作しないといけないので、リグを組んだら何となく流れで作成してしまいます。


  今回は、ピッカーを作ることが目的なので、リグはサクッとスクリプトで作ったものを使用。

  createCapsuleCtrl.mel

  ダウンロードした.melファイルを MAYA_SCRIPT_PATH へ配置し、createCapsuleCtrl() を実行すると、この記事のコントローラが出来ます。

 
  そして、本題のピッカー用スクリプト。

  capsulePickerWindow.mel

  同じく MAYA_SCRIPT_PATH へ配置して、capsulePickerWindow() を実行すると、こんなウィンドウが作成されます。


  カプセルリグが無い状態で実行すると、なにも動作しない状態になっていますが、この状態からでも createCapsuleCtrl() を実行すれば正常に動作するようになってくれます。

  サンプル用に簡易版で作成したのに300行くらいあります。

  1. capsulePickerWindow():ツールウィンドウ作成
  2. capsulePickerWindow.buttonClickedCB():ボタンのコールバック
  3. capsulePickerWindow.blinkButton():ボタンの明滅処理
  というのが大まかな処理内容。

  この中で一番たいへんというか、面倒なのがウィンドウ作成ですかね。
  ボタン配置に  formLayout の attachPosition を使っているので、ウィンドウサイズが変化しても、無駄な隙間が出来ないようになっています。これがいちばん面倒。

  フォントは小さいままですが、ボタンは大きくなってくれるので4Kとか高解像度のモニタでもけっこう大丈夫なのですが、このレイアウトを決めるのにウィンドウ作成の大半を費やしてしまいます。

  この各ボタンの名称には接頭辞として"select_"を付けています。人型のリグでは、「選択」の他に「FK/Ik切り替え」とか、「ポーズの反転」なんかを行うボタンも作ったりするので、動作用の接頭辞を付けた状態のボタン名にすることで、UI名の重複を回避します。


  そして、そんなボタンから呼び出されるコールバック関数。

  引数で`getModifiers`を渡すように設定しています。
  これで、[Shift]や[Ctrl]の修飾キーを判定し、select の add、toggle、replace、deselect を判断します。

  そして setFocus $gMainPane; でメインウィンドウにフォーカスを移すようにしておくと1クリック分、操作が軽減できます。

  あとは、setToolTo とかを付けても良いですね。


  最後に、ボタンの明滅処理。


  ボタンが何十も在るようになると、どれを選択しているか分からなくなるので、選択しているボタンは光るようにしておくと便利なのですが、ボタン名を直接指定しているので、コードが美しくない。

  もう少し融通の利くようにならないかと毎回作っていて思います。

  

  基本的な部分はこんな感じなのですが、実務で使う際には、このほかに namespace に対応しないといけないので、そのぶん更にコードを追加しないといけません。



0 件のコメント:

コメントを投稿