2013年6月2日日曜日

.notesアトリビュートの書き込み

自作セットアップツールの改定をしていて、外部ファイルに書き出すほどではないものの、
次の作業時に参照するデータを残したいということになりました。
そこでアトリビュートエディタのNotesを使えばよかろうと、
軽い気持ちで試してみたところちょっとした落とし穴にはまってしまったというのが今回。


まずロケータを作成し、アトリビュートエディタのNoteに文字を記入します。
これを取得するのにgetAttrを試したところ、".notes"アトリビュートで成功。
それでは書き込みはsetAttrでいけるだろうと、Notesを空にして実行したら
エラーが出てしまいました。
どうやら"-string"フラグを使用せよとのこと、それではと追加したのですが
今度は".notes"アトリビュートそのものが無いと言われてしまいました。
一体なにがなにやらとスクリプトエディタをEchoAllにして、
アトリビュートエディタに文字を書いたり消したりしてみますと、
どうやらscriptJobでアトリビュートをaddしたりdeleteしている様子。
そこで、適当な文字を入力したままでもう一度setAttrしてみると成功です。
つまり何か入力されている時だけ".notes"アトリビュートが存在し
内容が無くなると削除されてしまう様子。
何も書き込まれていない状況からは、addAttrを使用して
アトリビュートを追加してから書き込む必要があるのでした。
これで書き込み成功です。
テキスト情報は、改行されていても文字配列とはならず
改行情報込みの文字列として扱われるので、
取得して利用する場合は必要に応じてtokenizeすることりなります。









2013年5月27日月曜日

アトリビュートのロック・ハイド

今回もあっさり目のプロシージャネタであります.

キャラクターリグのコントローラにはNURBSカーブやロケータが用いられます.












その際コントローラで制御する以外のアトリビュートにアニメーションが入らないよう
アトリビュートをLock&Hideすることがよくあります.

そんなに面倒な作業ではありませんし、プロシージャ化も容易です.
しかし、さまざまなツールを書いていると「またか」と思うこともしばしば.
隠すチャンネルがそろっていればいいのですが、
隠したいアトリビュートが異なってくると似たような記述でやたらと行が増えてやっかい.
そこで別途のグローバルプロシージャとして使いまわせるよう記述したのがこれです.

引数はtranslateX,Y,Z,RotateX,Y,Z,ScaleX,Y,Z,Visivilityの順に
隠したい場合は0、そうでなければ1を記述し、最後にオブジェクト名.
オブジェクト名以外を一旦整数の配列にした後、
対応するアトリビュート名の文字配列と照らし合わせてfor文で処理するとすっきり.
この文字配列を使った手法は、
分岐が多いけれどあらかじめ分岐内容が判っている場合にとても便利です.

2013年5月20日月曜日

MELで変数の内容を追加させる

またしばらく空いてしまいました.
個人的な事でちょっとバタバタしており、内容も薄味ですが
継続はなんとやらで少しずつでも投稿してゆきます.

スクリプトで変数を扱うとき、たまに必要になるのが
すでにある変数に何かを追加することです.
代入内容をずらっと作成して、一気に入れ込むことが不可能だったり
スクリプトが冗長になってしまうことを避けたいときに用います.

文字変数に追加したい場合は"+="演算子が使えます.
for-in文の場合はこちら
文字にコマンド、フラグ、引数、フラグ、引数・・・、と書き連ね
evalコマンドで実行する内容を作成する場合などに使用できます.

文字配列に追加したい場合、for文であればインデックスを用います.
for-in文の場合は配列の長さ=最終インデックスとなることを利用して
このように追加してゆきます.
複数選択したオブジェクト名を文字列的に処理して、
新しい文字配列を作成する場合などに使用します.

こういったプログラミングでは当たり前の記述については
Mayaのオンラインヘルプはあまり説明されていないので
自分で試行錯誤してゆくか、別のプログラム言語の書籍で知るということになりますが.
一番手っ取り早いのは本職のプログラマーに聞くことなんですよね.
これまで色々と質問に答えてくださったみのまわりのプログラマーさん
どうもありがとうございました.これからもオネガイシマス.

2013年5月7日火曜日

QtDesignerによるUI作成

ゴールデンウィークで一回お休みしました。
今回はQtでのUI作成を取り上げてみたいと思います。
MayaにQtが採用された時には、
これまでツール作成時の労力の半分を占めていたUI作成が
もうなくなるぜヒヤッホーイと思ったものですが、
現在のところ完全に取って代わっている様子は無いようです。
実際にUIを作成し、いろいろ調べたところ
全てのコントロールに対応しているわけではないこと
少々ですが、見た目のスクリプトでの直接記述との違い等が判りました。
検索した結果と自分で試した結果を総合すると、対応できているコントロールは


QtWidget          MELcommand
PushButton        button
RadioButton       radioButton
CheckBox          checkBox
ComboBox          optionMenu
LineEdit          textField
TextEdit          scrollField
ListView          textScrollList
HorizontalSlider  intSlider
VerticalSlider    intSlider
Label             text
ProgressBar       progressBar
HorizontalLine    separator
VerticalLine      separator
TabWidget         tabLayout
MainWindow        window

以上に限られているようです。
今後対応が増えるとのアナウンスもありましたが
Mayaバージョンアップ時に触れられていないのでしばらくはこのまま?

まず試しに既存のツールを置き換えてみようかということで
いつものウェイト読み書きツールであります。
現在のUIがこう。
QtDesignerを起動します、場所はMayaがインストールされているbinフォルダです。
新規フォームでmainWindowを選択

ウィジェットボックスからTabWidgetをドラッグ&ドロップ
何も選択されていない状態でツールバーの格子状に並べるをクリック。
するとタブレイアウトとウィンドウがグループ付けされてタブがウィンドウにフィットします。
ウィジェットボックスからボタン、テキスト、テキストフィールド等をドロップし、
それらをすべて選択して、ツールバーの垂直に並べるをクリック。
するとmelのcolumnLayoutのように縦に整列され、グループ化されるので
大きさや位置を調整します。
次に、レイアウトやコントロールの名称やラベルを設定します。
プロパティエディタのオブジェクトネームやテキストで
コントロールの名称やラベルを設定します。
全てのウィジェットの名称を設定する必要はありませんが
コマンド実行時に参照されるコントロールのオブジェクトネームは必須です。
リネームが完了したら次はボタンにコマンドを付け加えます。

ボタンを選択し、プロパティエディタの緑十字ボタンをクリック
プルダウンメニューから文字列を選択し
ダイアログに"+command"と入力します。
今回はpythonなので、コマンドフラグの前に"+"をつけます。
melの場合は"-"を付け足します。
コマンド内容をシングル、ダブルクォートでくくって文字列とするのを忘れずに。
これでQtでの作業は完了、適切な場所と名称(今回はqtWeightTrade.ui)で保存します。

呼び出すpythonファイルの編集をします。

レイアウトやコントロールの定義部分を全削除。
loadUIコマンドで.uiファイルを呼び出し、showWindowコマンドで表示するだけになります。
下線部は各自が.uiファイルを保存したパスに書き換えてください。
テスト実行時にmelコマンドのインポートエラーが出てしまい。
ファイル先頭部分と実行の記述を書き換えました。
ここら辺はまだまだpythonの勉強不足です。

実行させたものがこちら
melで直接記述したものと微妙に異なってしまいます。
プロパティを細かく詰めてゆけばあるいは同一になるやもしれませんが
どうやらQtはUIを作るツールというものではなく、
UI作成に強いプログラム開発ツールのようです。
細かくUIを設定したい時より、とりあえずUIが欲しいけれど
コントローラが多くて手書きは面倒な時などに役立つのかもしれません。

ysWeightTrade2.py

qtWeightTrade.ui

2013年4月21日日曜日

ウェイト移行ツール

キャラクターセットアップをやっていますと
ローポリモデルでアニメーション用セットアップ
後にハイポリモデルをレンダリング用に同じジョイントでセットアップ
なんてことがよくあります.

大きなプロダクションではラップデフォーマをカスタマイズしたもので
ハイポリモデルを変形させることがありますが
直接バインドして、ローポリモデルやハイを間引きしたモデルから
ウェイトをコピーする手法もまだ多く使われています.

しかし、ハイポリモデルはディテール追加のため
同じジョイントにバインドされている部品が多くなることが多く
ウェイトコピーコマンドが一対一でしか機能しないので
メンドクサイことこのうえない作業になります.

そこでまとめてやってしまおうと書いたのがこのMELです.
ハイモデルを選択(複数可)し最後に元になるモデルを選択して実行すると
同じジョイントにバインドした上でウェイトコピーを実行します.
これが全文、細かく説明しますと
まず選択したオブジェクトの一覧をリストに取得
最後のオブジェクトがソースなので、リストのサイズから最後の一つを
ソースオブジェクトとして取得後、forループのためにリストからソースオブジェクトを削除
ターゲットオブジェクトのリストとします.
次にソースオブジェクトのシェイプノードを取得
そこからスキンクラスタノードを取得、さらにバインドされているジョイントのリストを取得します.
for-inループでターゲットオブジェクトに対して、まずは取得したジョイントでバインド.
ソースオブジェクトからコピーウェイト、を繰り返します.
ループ処理が終わったら、戻り値としてスキンクラスタ名を戻します.
stringを戻す場合、string配列の一要素でオッケー?
と思っていたら戻した先で「これ配列じゃね?」とエラーが出てしまったので
一旦stringに代入してからreturnしております.

元はshelfに登録していてコマンド形式にはしていなかったのですが
他のツールで使う必要が出てきて書き直した次第で、戻り値もそのためです.

ysBindAndCopyWeights.mel

初歩的な(これまでのも似たようなもん?)内容ですが
このブログの目的が、防備録的なものだけではなく
これまで自分がネット検索でお世話になったのでその恩返しというような面もあります.
まあ、始めたばかりで方向性が定まらずに迷走中というのが一番正しいのかも.

2013年4月14日日曜日

ウェイトツール改修その2

今週も引き続きウェイト読み書きツールの改修です.
これまでは書き出した場合と全く同じジョイントで
オブジェクトをバインドしてあることが前提でした.
たとえウェイトゼロであっても、書き出したリストに
現在バインドしてあるジョイントが含まれていないとダメ.

間違えて異なるものを読み込んでしまうことを防ぐことにはなりますが
そうでない時、しかもバインドしているジョイントが多数になるとメンドクサイ.
そこで記録されているジョイントで、選択されているオブジェクトをバインドする
チェックボックスを追加しました.

ここにチェックが入っているかを、読込プロシージャで参照し
オンならば読み込んだジョイントでバインドします.
変数の参照先が空のままなので別途代入してあげることも忘れずに.
skinClusterコマンドの戻り値でskinCluster名を取得しようとしたところ
戻り値は配列でないstringとなっていたのですが
[u'skinClusterName']
となっていてなぜかそのままではエラーが出てしまったので
仮の変数で取得してから配列ゼロ番を代入して解決.
pythonでの文字列の扱いやユニコードやらのエンコード関係を
きちんと勉強する必要がありそうです.

ysWeightTrade.py

2013年4月7日日曜日

ウェイト保存読込ツール

ようやく環境が整いつつあるMacBookで今週末取り組んでみましたのは
自作pythonスクリプトの改良であります.
Mayaのウェイト情報保存ツールは、UV空間でグレースケール画像に読み書きします.
使い物にならないわけではないのですが、
UVが重ならずに展開されていなくてはならなかったり、
8bitグレーで0~1を置き換えているので精度がいまいちだったりします.

ネット上でもフリーのツールがいくつもあるように、
私も自分で制作することにしたのでした.
頂点番号とウェイト情報のみをテキストデータに羅列するという
かなり大雑把なツールですが、それゆえの便利さもあると思っております.
最初はMELで記述したのですが、pythonを勉強し始めたときに
既存のMELを書き換えることをしたうちのひとつで、
pythonの配列操作の柔軟性を利用できたかなあというものでした.

今回は、これまで読み書きするオブジェクト名まで一致しないとエラーとなる点を改善し
頂点数が合っていれば、確認ダイアログを出すということをやりました.
それに従い保存ファイルの書式を少し変更.
先頭に保存した時のオブジェクト名を記述して、
頂点名を完全に番号のみに.
これで読み込むときにオブジェクト名を確認した後
頂点番号前に読み込むオブジェクト名を書き足せば終了.
と思ったのですが、ここで壁にぶつかりました.
保存時と読込時の名称が同じならば、
確認ダイアログは出現せずに読込に入るはずが
何回やっても出てくるのです???
変数をprintさせてみても同じだし、なんでだろなあと頭をひねっていたところ
これ、改行情報まで読み込まれてるのでは.

ファイルの読込は行単位、プログラマーさんなら常識かもしれませんが
思わぬところに落とし穴があったものです.
保存オブジェクト名を読み込んだ変数から改行文字'\n'を取り除いてようやく解決
なんかいろいろ迷走しているのが分かるコードになってますねぇ.


使用するときは、スクリプトエディタのpythonタブで

from maya.cmds import *
from types import *
import ysWeightTrade
reload(ysWeightTrade)
ysWeightTrade.ysWeightTrade()

と打ち込みます.
よろしければお試しください.

2013年3月31日日曜日

テキストエディタ

CGソフトウェアでスクリプトを作成するのにテキストエディタを使う人は多いでしょう.
最近のMayaはスクリプトエディタが便利になってきているので、
そちらで済むこともあるでしょうし、
本職プログラマーの方々は開発環境のツールが強力ですから、
MELごときメモ帳で十分というツワモノもいらっしゃいます.

私は秀丸というテキストエディタを使用しています.
2ちゃんの「どのエディタが最強?」みたいな話題では名前を見ることも少ないですが
国産ですし、いろいろカスタマイズしやすいので未だに(開発者さんすみません)愛用しております.

MELというマイナーもいいところの、しかもスクリプト言語に対応した表示は
検索してもヒットするわけもなく、だったら自分で作ればいいじゃんというのがこれ.
コマンドマニュアルからコピーペーストしたコマンドをすべて強調させるという力技.
ついでに構文や変数の型、変数名やフラグも追加しました.
それでMELを表示するとこうなります.
前述のように、Mayaのスクリプトエディタも色分けできるようになりましたし、
基本的な編集(置換とか)もできるようになってきているのですが、
なんにも無かった頃に始めたカスタマイズなのです.
バージョンアップごとにコマンドが新しく出来たりするのでそれにも対応.
現在は2012版となっております.

秀丸でMELを編集する方はよろしければ使ってみてください.

mel2012.hilight

2013年3月27日水曜日

作業環境

かなり遅ればせながら二回目の更新にこぎ着けた.
自宅にワークステーションがあるものの、怠け心からあまり触ることもない.
それでは、普段ベッドで寝そべって腹の上で使っているMacBookに
環境を構築してしまえ.

これを口実に新しいMacBookRetinaモデルに惹かれまくったが、ガマン.
2007モデルの黒MacBookに手を入れて頑張ってもらおう.
まずはHDDをSSDに換装、メモリを最大限の4GBに.
最新のモデルに比べるともう一息というスペックですが、
この後いろいろ揃えないといかんのでハードの投資はここらへんまで.
SSD装換の前にtimeMachineでバックアップをとる.

 21GBのバックアップに、テキトーに買った32GBUSBメモリを使ったのだが大失敗.
一週間かかっても終わりません.
仕事先からUSBHDDを持ち帰って繋げてみたらばあっという間、
一時間くらいで終了、オレはなんてムダな時間を.....

SSDをフォーマットしてOSX雪豹(ハード的にこれまでしか入らぬ)をインストール.

その後timeMachineから復元して完了.
のはずが、フォーマットをMac拡張ジャーナリング(大文字小文字区別)
にしてしまったのが大間違い、adobe製品起動しなくなっちまいました.

そうこうしているうちに光学ドライブがお亡くなりになってしまいました
まあ5年前のマシンなので致し方無し、交換することに.
ようやく完調となった黒MacBookに再度雪豹をインストールします.
そしてVMwearFusion5→windows7x64→Maya2013をインストール.

ドキドキしなからMayaを起動、成功!!やったぜ.
仮想環境なのでぐりぐりとはいかないが、
スクリプトやプラグインのテスト環境としては十分でしょう.

この後visualStudio2010expressやテキストエディタ、python等を入れたら完成.

この環境でいろいろ試して行けますように.

2013年1月5日土曜日

あけましておめでとうございます.
主に仕事のCG関係の備忘録を兼ねたブログをやりたいと思っていましたが
ブログサービスどれにするか決めかねておりました.
知人のリンクに良く出てくるオレンジのBマークはなんじゃらほいと
クリックしたところ、Bloggerのページにたどり着いたので始めてみます.

とりあえず新年なので、年賀状に使った写真なぞを.