![]() |
新しくなったUVエディタ(Maya2017以降~) 新機能 満載!! GTMF2017の時に紹介しました内容になりますが、Maya2017からUVエディタの画面が大きく変化し、たくさんの新機能が追加されました。 ■ドキュメントUV エディタ(UV Editor)の概要 <Update3> UVエディタはモデリング > UV > UVエディタから画面表示します。 ビューのプルダウンメニュー 以下のUVの歪み等の機能は上部にアイコンとして表示されています。 下図で赤/青の色表示になっているのはUVの歪みを有効にした時の状態であり、 上部のアイコンだと、左から3番目のアイコンを押すと この表示↓ になります。 修正 > 以下のほとんどは新機能。緑色表示のもの全部です。 各機能の詳しい説明はドキュメントを見てください。 UVエディタ 内に シェルフ UVエディタの上部空白部分は Mayaのメイン画面のシェルフを置くことができる部分です。 一番簡単な方法は(例としてハイパーシェードが UVエディタのシェルフ から起動出来る様子を紹介します。) 1)Mayaのメイン画面のカスタムシェルフに一旦 アイコン画像付きのシェルフ を作る。 ![]() ![]() 既にUVエディタ用 カスタムの ツールを Mayaのメイン画面のシェルフに登録して使用しているのであれば、 UVエディタ上のシェルフに移設して使うと便利かと思います。 ツール > シンメトリ化 たくさん追加された新規ツールの中でも、シンメトリ化は紹介したいツールです。 ■ドキュメントシンメトリ化 UV ツール (Symmetrize UV Tool) シンメトリ化は、表示されたオプション画面で、ミラー軸のUかVかを選択してミラーする軸位置を決めた後、 筆のサイズに従って塗る操作をすると 反対側がシンメトリのUV位置に置き換わるツールです。 キャラクター作成など、左右のUV値を簡単に一致させることが出来て 非常に便利です。 使い方が色々と考えられるツールなので、ぜひ知って欲しい機能の1つです。 ![]() |
UVエディタのスクリプト まわり UVエディタは何のパネル? Maya2017から搭載された新しいUIであるUVエディタ、 どんなパネルを スクリプトで実行 して表示しているのか の情報収集から始めます。 Mayaのメイン画面のプルダウンメニューで、UV > UVエディタからUVエディタを表示した時、 スクリプトエディタの標準の設定 では何もログを表示してくれないので、 ヒストリ > [レ] すべてのコマンドエコーを有効にした上で 実行して、ログを表示します。 すると以下のようなログが表示されます。 (すべてを表示する必要がなくなったら[] すべてのコマンドエコーは無効に戻しておきましょう。)
この中で、texturePanelShow;を スクリプトエディタ の Mel タブで実行すると、UVエディタが表示されます。 ![]() と思いましたら、whatIsというコマンドを Me タブ で実行させます。すると・・・
と、結果を出してくれるので、texturePanelShow.melってのが動いているのだとわかります。 これをエディタで開いてみます。
ここにはスクリプティングに必要な情報がたくさん書かれています。(Maya独特のめんどーくささ、いっぱいいっぱいですが・・) 最初のDescription:(説明)ってところで、 ” テクスチャーパネルを表示して、その表示にUVツールキットをアタッチする ” って書いてあります。 そう思って、その下のスクリプトをざっと見ると、 "UV Editor" ってパネル名をティアオフ したもの" "その名前の取得 と "Window" 文字の追加" "polyTexturePlacementPanel とUVToolkitPanel を workspaceControl でドッキング" しているのか?と想像できます。 後半部分は 何してるん? は後で詳細を知る事になります。 さて、最初に厄介なのは、このlocalizedPanelLabel("UV Editor") っていうところで、 ローカライズって文字だけで ピン! と来ます。 Mayaは多言語対応なので、もしや 日本語文字が返って来るのか?? と...。 Python スクリプト内で日本語文字は避けたい感じです。 では、実際に試して見ましょう。 Mayaスクリプトエディタ の Mel タブ で、 $textureEditorTitle = localizedPanelLabel("UV Editor" );は何を返すか調べてみます。 ![]() じゃー、その名前のパネル名 って何か? というとgetPanel -withLabelを使います。 ![]() そして、このpolyTexturePlacementPanel1は1つしか表示を許さないパネルみたいなので、 名前は決め打ちで"polyTexturePlacementPanel1" でも良いんじゃね、ということになります。 ちなみに、localizedPanelLabelを使って、こんな風にもパネル名が取得できます。 ![]()
となります。 では一旦、texturePanelShow.mel を 出来る限り Python に置き換えて書いてみたスクリプトを 実行してみます。
すると、おお、起動しました。>>そして、次なる悩みへ進みます ![]() workspaceControl は何してんの? では、次は、上記 スクリプトの後半部分を解明していきます。 workspaceControl は 7回も出て来ることから、設定に関してかなり気にしている 項目と考えます。 途中に "UVToolkitPanel();" というのが出て来ます。 これもwhatIs で何か?と調べますと、
結果は似てるようですが、良く見みますと "texturePanelShow" の場合は "Script found in" と出力しているので、 今回のUVToolkitPanelは" 探し出した .mel の中の 一部の変数として使われている " と理解できます。 で該当部分を見ると、ここにも重要な手がかりがあります。
たくさん書いてあるように見えますが、 つまり、ここでもローカライズのパネルラベル が出て来ていて、 workspaceControl の中でuiScript オプション を使ってUI(" UVToolkitDockControl")を作っていて、 それが存在する (-exists) のか、表示している (-visible) のかを 一生懸命気にしている、という記述になっています。 ご親切にコメントが書いてあって、その理由について少し書いてあります。(↑緑の文字部分) "ワークスペースとして作ったもの (UI)は、存在していても、表示を有効にしないと閉じたものとみなすよ"と。 ではworkspaceControl を調べます。これはコマンドです。 ■ドキュメントworkspaceControl コマンド (Python) レイアウトにウィンドウを配置するために使われるウィジェットを作成および管理します。 これによりウィンドウのドッキングと積み重ねが可能になります。 とあります。そのページの下にはPythonの記述例もあります。 ということで、先に作った Python版UVEditor のスクリプトを再度見ますと、 cmds.workspaceControl("UVToolkitDockControl",e=True,dockToControl=[texWinName,'right']) はdockToControl というオプションで 本体の右に 作ったワークスペースをドッキングしている と理解できます。 しかし、これだけでは失敗します。まだworkspaceControl を制御するには設定が足りてません。 先に作った Python版UVEditor のスクリプトを再再度見ると workspaceControlStateというのがあります。 ■ドキュメントworkspaceControlState コマンド (Python) ワークスペース コントロールの希望するウィンドウ アトリビュートを作成または修正します。 ワークスペース コントロールのサイズや位置は、アプリケーション セッション中は保持されます。 これは何かというと、ワークスペースで作成したUIの位置やサイズがステートとして保持されるので、 ステートが残っている状態(つまり2回目以降)で、任意の位置にドッキングさせようとすると失敗する、ということを意味してます。 それで、ワークスペースが存在していたら必ず!ステートを消去しているのです。 ここは 『なんでドッキングがうまくいかないのか?』 で良く はまる ところです。 これで、やっと必要な情報がそろいましたので、カスタマイズに挑戦していきましょう。 |
追加したい機能 UV値の取得 追加したい機能を考えていきます。 最初は、"選択したUV頂点を任意の値を設定して移動する機能も欲しい"、と考えていたのですが、 それは、既存のUVツールキットの中にありました。↓ ![]() (それでも、選択したUV頂点群を1つのグループとして、まとめて移動させる設定は機能として追加してみました) ![]()
UV選択の部分は ちょっと MEL記述方法 を活用させてもらい、 "mel.eval('ConvertSelectionToUVs;')" なんて記述を使って、 頂点選択など他の選択形態からUV選択になるようにしています。 あとは、polyEditUVというコマンドでquery=Trueオプション を使えば UV値が得られ (Get) ます。 逆に UV値の設定はuValue=とvValue=とで設定し (Set) ます。 さて、あとは、[Get]ボタンで得たUV値を表示したり、 U[ ] V[ ]欄に記入されたUV値を[Set]ボタン で設定出来ればおしまいなのですが、 UV値の編集作業をその結果値を見ながら ちくちく設定する場合もあり、 そういった場合、勝手にUVを取得してくれる機能もあればいいな~と思い、 UV値のインターラクティブな更新が出来ないかを考えてみました。 scriptJobの設定 そこでscriptJobを走らせることにしました。 常時scriptJobを走らせることは避けたいので、 インターラクティブ用の チェックボックスが有効な時にのみscriptJob(ジョブB) が動くようにしたいと考えました。 このscriptJob(ジョブB) はattributeChange(指定したアトリビュートの値が変わった時にスクリプトを実行) にし、 実行する内部コマンドは 上記で作った "UV値を取得する(def get_uv(*args):)" という部分になります。 そして、その誤動作も防ぐ意味でも もう1つscriptJob(ジョブA) を走らせます。 このscriptJob(ジョブA) はevent(指定したイベントが発生した時にスクリプトを実行) にし、 "DragRelease"が発生したら、インターラクティブ用のチェックボックスを外し、最初のジョブ (ジョブB) をKILLするようにしてみました。 つまり、選択を解除した時、例えば UV値を設定するオブジェクトを変更した時が、"DragRelease"になります。 また、インターラクティブ用のチェックボックスが有効にする時は、必ずこの2つのジョブを検索してKILLするように設定します。 実は Maya は普段使っている間中に、たくさんのジョブが走っています。 (listJobsオプションで動いている全てのジョブのリストを得ることが出来ます) 自分で新たに作成して走らせたscriptJobは、自分が作ったカスタムUIのparentに設定することが出来ます。 こうすることによって、既に動いているscriptJobに影響を及ぼすことなく、 親UIが破壊されるとそれに関連付けられたscriptJobを一緒に中断することができます。 また、killWithSceneというオプションも付け、新規シーンになったらscriptJobをKILLにします。 (↑その時の条件として、protected=Falseにしている必要があります。=True だと"保持" が優先されます。) ■ドキュメントscriptJobコマンド (Python) そんなscriptJobの設定部分は、こんな記述になっています。(完成スクリプトより)
UVセットの表示 こちらは、単純な機能しか設定していないのですが、 UV値を取得[GET] した際に、カレントのUVセット名も表示しようと思った程度の実装です。 polyUVSet というコマンドをcurrentUVSet=True というオプションと共に使います。
UVセット名の表示はインターラクティブには変化しなく、 UV値を取得[GET]した時の名前が残ってしまっている状態なので、少し不完全な実装かも知れません。 より細かく組んであげれば機能の向上が出来そうな部分ではあります。 という訳で、新規に実装したい機能は 準備ができました。 後は、これらの操作や結果を表示する新規UIの実装部分になります。 |
カスタムUVの機能説明 UV値の取得/設定 [GET] ポリゴンのモデリング作業中の操作からスムーズにUV値編集が出来るように、 View画面の選択モードから UV値が[Get]出来るようにしてあります。 例えばオブジェクト選択の状態で[Get]ボタンを押すと、全体がUV選択された状態でカスタムUVエディタに表示されます。 同様の操作として、頂点選択、エッジ選択、フェース選択、UVシェル選択からUV選択になって表示されます。 ![]() [SET] [Get]ボタンで取得したUV値を[Set]ボタンで 設定します。 [Get]で取得した UV値 は 単一組の値 なので、 選択したUV頂点が複数の場合、[Set]ボタンを適合させると一点に集中してしまいます。 ![]() 5つある[Set]ボタンで[赤色系は U値]、[緑色系は V値]、[黄色系は 両方]の[Set]ボタンにしてあります。 [Set U only] [Set V only] 選択されているUV頂点群 に対して[U値のみ][V値のみ]にUV値を設定します。 縦や横のUV値を一定の値にそろえる時に便利です。 ![]() 選択されているUV頂点群 をグループとして 一括で[UV値両方]、[U値だけ]、[V値だけ]、にUV値を設定します。 今の選択部分の形状を保持したままの移動が出来ます。 ![]() Interactiveのチェックボックスが[レ](有効)の時、 選択している頂点を移動すると、その時のUV値がU[_]とV[_]欄に 自動的に反映されます。 値の更新自体は正確に言うと、マウスをリリースした瞬間です。動かしながらのUV値取得は処理が重くなると判断しました。 (それでも、頂点数が物凄く多い場合はスクリプトジョブを走らせて実行しているので延滞が起きる可能性はあります。) 細かいUV編集を UVの値変化 を見ながら作業したい場合に役立ちます。 ![]() 現在のUVセット名を表示します。 UV値を[Get]した時に表示が更新するので、UVセット自体を変更した場合に更新するようになっていません。 うまくUVセットプルダウンメニュー内の機能と連動して使用してみてください。 UV編集作業をしていて、ふと現在の UVセット名を確認したい時に便利です。 ![]() |
GitHubを使った公開 という訳で、今回のツールからGitHubを使って公開することにしました。 ツールの設定 Pyファイルはシェルフにボタン登録するか、プルダウンメニューに登録して実行します。
Pyファイルは GitHub に公開しています。
GitHub にアカウント登録していなくても ダウンロードは出来ます。 下記リンクページで、右上[ Clone or downlaod ]という緑色のボタンからダウンロードを行います。 ボタンを押すと表示される[ Download ZIP ]という右側のボタンからZipファイルを取得します。
|
次回もMayaかも?・・・
乞う、ご期待!! Stay tuned .. |