CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. スクリプト
  5. Maya 2017~ Python;カスタムUVエディタ
SUITE USERS NOTES
Maya 2017~ Python;カスタムUVエディタ
Maya 2017~ Python;Custom UVEditor
プロローグ;Prologue
MayaPythonで便利な新機能付きのカスタムUVエディタを作成し、幾つかの講演で興味があるか聞いてみたところ、たくさんの欲しいリクエストを頂いたので、ここに記事として公開することになりました。
もちろん、Pythonの機能紹介を基本としたページですが、ツールだけをダウンロードして利用することも可能です。

このツールの当初は、Maya2017から一新されたUVエディタを利用していこうと思ったところ、常時表示するUとVの値欄が見当たらなかったので、カスタムで増設出来ないか、という発想からスタートしたものです。
結果的には上図のようなものが作成出来たのですが、その過程で思わぬ苦労があったことがあり、その知識そのものも皆さんに提供出来たらと、記事にしてみました。

また、今回からツール自体をGitHubにて スクリプトを公開し、より皆さんに良いものが出来上がったら良いな~、という思いで試んでみました。

※Maya2017からのUVエディタに対応した機能なので、それ以前のバージョンではUVエディタ自体が異なります。

なお、このサイトに掲載している事例の決まり事ですが、
使用に関しては自己責任でよろしくお願い申し上げます。

Please use this information asyour own risk.
Windows7 Professional 64Bit、Intel Core i7-3930K(3.20GHz,6コア/12スレッド)
メモリ16GB、NVIDIA GeForce GTX970 4GB

maya_12_ritaro_ml



新しくなったUVエディタ(Maya2017以降~)

新機能 満載!!
GTMF2017の時に紹介しました内容になりますが、Maya2017からUVエディタの画面が大きく変化し、たくさんの新機能が追加されました。

■ドキュメントUV エディタ(UV Editor)の概要 <Update3>

UVエディタモデリング > UV > UVエディタから画面表示します。
ビューのプルダウンメニュー 以下のUVの歪み等の機能は上部にアイコンとして表示されています。
下図で/の色表示になっているのはUVの歪みを有効にした時の状態であり、
上部のアイコンだと、左から3番目のアイコンを押すと この表示↓ になります。
maya_12_UVeditor_000s
修正 > 以下のほとんどは新機能緑色表示のもの全部です。
各機能の詳しい説明はドキュメントを見てください。

UVエディタ 内に シェルフ
UVエディタの上部空白部分は Mayaのメイン画面のシェルフを置くことができる部分です。
一番簡単な方法は(例としてハイパーシェードが UVエディタのシェルフ から起動出来る様子を紹介します。)

1)Mayaのメイン画面のカスタムシェルフに一旦 アイコン画像付きのシェルフ を作る。
maya_12_UVeditor_002
2)そのアイコンを中マウスボタンドラッグして UVエディタのシェルフ部分にドロップする。
maya_12_UVeditor_003
以上です。
既にUVエディタ用 カスタムの ツールを Mayaのメイン画面のシェルフに登録して使用しているのであれば、
UVエディタ上のシェルフに移設して使うと便利かと思います。


ツール > シンメトリ化

たくさん追加された新規ツールの中でも、シンメトリ化は紹介したいツールです。

■ドキュメントシンメトリ化 UV ツール (Symmetrize UV Tool)

シンメトリ化は、表示されたオプション画面で、ミラー軸のUVかを選択してミラーする軸位置を決めた後、
筆のサイズに従って塗る操作をすると 反対側がシンメトリのUV位置に置き換わるツールです。
キャラクター作成など、左右のUV値を簡単に一致させることが出来て 非常に便利です。
使い方が色々と考えられるツールなので、ぜひ知って欲しい機能の1つです。
maya_12_UVeditor_010



UVエディタのスクリプト まわり

UVエディタは何のパネル?

Maya2017から搭載された新しいUIであるUVエディタ
どんなパネルを スクリプトで実行 して表示しているのか の情報収集から始めます。

Mayaのメイン画面のプルダウンメニューで、UV > UVエディタからUVエディタを表示した時、
スクリプトエディタの標準の設定 では何もログを表示してくれないので、
ヒストリ > [レ] すべてのコマンドエコーを有効にした上で 実行して、ログを表示します。

すると以下のようなログが表示されます。
(すべてを表示する必要がなくなったら[] すべてのコマンドエコーは無効に戻しておきましょう。)
ModelingUVMenu MayaWindow|mainUVMenu;
TextureViewWindow;
texturePanelShow;
unlocalizedPanelLabel "UV エディタ";
// UV Editor // 
addTextureWindow polyTexturePlacementPanel1;

この中で、texturePanelShow;を スクリプトエディタ の Mel タブで実行すると、UVエディタが表示されます。
maya_12_UVeditor_020
このtexturePanelShow;ってのはなんぞ?
と思いましたら、whatIsというコマンドを Me タブ で実行させます。すると・・・

whatIs texturePanelShow;

// 結果: Script found in: C:/Program Files/Autodesk/Maya2017/scripts/others/texturePanelShow.mel // 

と、結果を出してくれるので、texturePanelShow.melってのが動いているのだとわかります。
これをエディタで開いてみます。

//.....
global proc texturePanelShow()
//
//  Description:
//		Show texture panel, and attach it to UV toolkit panel
//		
//  Input Arguments:
//		None
//
//  Return Value:
//      None
//
{
    //Delete workspace state of toolkit panel, otherwise UV editor will automatically attach to it. 
	if(`workspaceControl -q -exists UVToolkitDockControl`) {
		if(`workspaceControlState -q -ex UVToolkitDockControl`)
		    workspaceControlState -e -r UVToolkitDockControl;
	}
	string $textureEditorTitle = localizedPanelLabel("UV Editor" );
    string $win = `tearOffRestorePanel $textureEditorTitle polyTexturePlacementPanel true`;
    if(!`window -ex $win`)
        return;
	// The UI is dependent on plugin load state, so make sure the parent workspace control
	// (if any) waits until plugins are auto-loaded before rebuilding UI
	string $texWinName[] = `getPanel -sty polyTexturePlacementPanel`;
	if(size($texWinName) != 1)
	    return;
    string $texWin = $texWinName[0] + "Window";
	if(`workspaceControl -q -exists $texWin`) {
		workspaceControl -e -checksPlugins true $texWin;
	}
	
	if(!`workspaceControl -q -exists "UVToolkitDockControl"`) {
		UVToolkitPanel();
		workspaceControl -e -dockToControl $texWin right "UVToolkitDockControl";
	}
	else if (!`workspaceControl -q -visible "UVToolkitDockControl"`){
		workspaceControl -e -visible true "UVToolkitDockControl";
		refresh;
		workspaceControl -e -dockToControl $texWin right "UVToolkitDockControl";
	}
} 

ここにはスクリプティングに必要な情報がたくさん書かれています。(Maya独特のめんどーくささ、いっぱいいっぱいですが・・)
最初のDescription:(説明)ってところで、
” テクスチャーパネルを表示して、その表示にUVツールキットをアタッチする ” って書いてあります。
そう思って、その下のスクリプトをざっと見ると、

"UV Editor" ってパネル名をティアオフ したもの"
"その名前の取得 と "Window" 文字の追加"
"polyTexturePlacementPanelUVToolkitPanel workspaceControlドッキング"

しているのか?と想像できます。 後半部分は 何してるん? は後で詳細を知る事になります。

さて、最初に厄介なのは、このlocalizedPanelLabel("UV Editor") っていうところで、
ローカライズって文字だけで ピン! と来ます。
Mayaは多言語対応なので、もしや 日本語文字が返って来るのか?? と...。
Python スクリプト内で日本語文字は避けたい感じです。
では、実際に試して見ましょう。
Mayaスクリプトエディタ の Mel タブ で、
$textureEditorTitle = localizedPanelLabel("UV Editor" );は何を返すか調べてみます。
maya_12_UVeditor_021
うわー、やっぱり、”UV エディタ”(日本語文字) だよ、となります。
じゃー、その名前のパネル名 って何か? というとgetPanel -withLabelを使います。
maya_12_UVeditor_022
polyTexturePlacementPanel1” と返して来ます。ふーん。
そして、このpolyTexturePlacementPanel1は1つしか表示を許さないパネルみたいなので、
名前は決め打ちで"polyTexturePlacementPanel1" でも良いんじゃね、ということになります。
ちなみに、localizedPanelLabelを使って、こんな風にもパネル名が取得できます。
maya_12_UVeditor_023
すると、結果は…なんだ、polyTexturePlacementPanel1って同じじゃん 、と確認できましたので、Pythonで書きますと、

uvTextureViews = cmds.getPanel(scriptType='polyTexturePlacementPanel')
print uvTextureViews

結果: [u'polyTexturePlacementPanel1'] 

となります。
では一旦、texturePanelShow.mel を 出来る限り Python に置き換えて書いてみたスクリプトを 実行してみます。

import maya.cmds as cmds
import maya.mel as mel

def original_uv_editor(*args):
    mel.eval('refresh;')

    if cmds.workspaceControl("UVToolkitDockControl",q=True,exists=True):
        if cmds.workspaceControlState("UVToolkitDockControl",q=True,exists=True):
            cmds.workspaceControlState("UVToolkitDockControl",e=True,remove=True)

    mel.eval('string $textureEditorTitle = localizedPanelLabel("UV Editor" );')
    mel.eval('tearOffRestorePanel $textureEditorTitle polyTexturePlacementPanel true;')
    uvTextureViews = cmds.getPanel(scriptType='polyTexturePlacementPanel')[0]
    texWinName = uvTextureViews + "Window"

    if cmds.workspaceControl(texWinName ,q=True,exists=True):
        cmds.workspaceControl(texWinName ,e=True,checksPlugins=True)

    if not cmds.workspaceControl("UVToolkitDockControl",q=True,exists=True):
        mel.eval('UVToolkitPanel();')
        cmds.workspaceControl("UVToolkitDockControl",e=True,dockToControl=[texWinName,'right'])
    elif not cmds.workspaceControl("UVToolkitDockControl",q=True,visible=True):
        cmds.workspaceControl("UVToolkitDockControl",e=True,visible=True)
        mel.eval('refresh;')
        cmds.workspaceControl("UVToolkitDockControl",e=True,dockToControl=[texWinName,'right'])

original_uv_editor()

すると、おお、起動しました。>>そして、次なる悩みへ進みます
maya_12_UVeditor_024


workspaceControl は何してんの?

では、次は、上記 スクリプトの後半部分を解明していきます。
workspaceControl は 7回も出て来ることから、設定に関してかなり気にしている 項目と考えます。

途中に "UVToolkitPanel();" というのが出て来ます。
これもwhatIs で何か?と調べますと、

whatIs UVToolkitPanel;

// 結果: Mel procedure found in: C:/Program Files/Autodesk/Maya2017/scripts/others/UVToolkitPanel.mel //  

結果は似てるようですが、良く見みますと "texturePanelShow" の場合は "Script found in" と出力しているので、
今回のUVToolkitPanelは" 探し出した .mel の中の 一部の変数として使われている " と理解できます。
で該当部分を見ると、ここにも重要な手がかりがあります。

global proc UVToolkitPanel() {
	
// #ifdef MAYA_WANT_WORKSPACES
	// Ready the float layout
	global string $gUVToolkitFloatForm;
    if(!`workspaceControl -q -exists UVToolkitDockControl` ) 
	{
		string $prevActiveTab = `getActiveMayaTab`;
		string $LEcomponent = getUIComponentDockControl("Layer Editor", false);
		workspaceControl
			-tabToControl $LEcomponent -1
			-label (localizedPanelLabel("UV Toolkit"))
			-uiScript "createUVToolkitDockControl();"
			-loadImmediately true
			UVToolkitDockControl;
		//Set visiable to true, otherwise workspace will take it as a closed one.
		workspaceControl -e -visible true UVToolkitDockControl;
		if($prevActiveTab != "") {
			workspaceControl -e -raise $prevActiveTab;
		}
	}
	else
	{
	    deleteUI UVToolkitDockControl;
	}
// #else
	// Ready the float layout

// #endif
}

// #ifdef MAYA_WANT_WORKSPACES
global proc createUVToolkitDockControl()
 ......<略>

たくさん書いてあるように見えますが、
つまり、ここでもローカライズのパネルラベル が出て来ていて、
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ツールキットの中にありました。↓
maya_12_UVeditor_025
なので、UV値の取得と表示に専念します。
(それでも、選択したUV頂点群を1つのグループとして、まとめて移動させる設定は機能として追加してみました)
maya_12_UVeditor_026
import maya.cmds as cmds

seleced_uv = cmds.ls(sl=True,flatten=True)
print seleced_uv

#結果[u'pPlane1.map[120]']

seleced_uv_val = cmds.polyEditUV(seleced_uv,query=True)
print seleced_uv_val

#結果 [1.0, 1.0]

cmds.polyEditUV(seleced_uv, relative=False,uValue=seleced_uv_val[0],vValue=seleced_uv_val[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というオプションも付け、新規シーンになったらscriptJobKILLにします。
(↑その時の条件として、protected=Falseにしている必要があります。=True だと"保持" が優先されます。)

■ドキュメントscriptJobコマンド (Python)

そんなscriptJobの設定部分は、こんな記述になっています。(完成スクリプトより)

    if cmds.checkBoxGrp('intract_check',q=True,v1=True):
        jobNum_a = cmds.scriptJob(event = ["DragRelease",sel_changed],
            protected=False,killWithScene=True,parent="Custom_UV_Editor")
#        print jobNum_a
        jobNum_b = cmds.scriptJob(attributeChange = [o_obj_shape_uv_pivot,get_uv],
            protected=False,killWithScene=True,parent="Custom_UV_Editor")
#        print jobNum_b
    else:
        jobs = cmds.scriptJob( listJobs=True )
        for o_job in jobs:
            if "Custom_UV_Editor" in o_job:
                jobNum = (o_job[:o_job.index(':')])
                cmds.scriptJob(kill=int(jobNum), force=True)

UVセットの表示

こちらは、単純な機能しか設定していないのですが、
UV値を取得[GET] した際に、カレントのUVセット名も表示しようと思った程度の実装です。
polyUVSet というコマンドをcurrentUVSet=True というオプションと共に使います。

import maya.cmds as cmds

o_c_uvset = cmds.polyUVSet( query=True, currentUVSet=True )[0]
print o_c_uvset

// 結果: map1 //  

UVセット名の表示はインターラクティブには変化しなく、
UV値を取得[GET]した時の名前が残ってしまっている状態なので、少し不完全な実装かも知れません。
より細かく組んであげれば機能の向上が出来そうな部分ではあります。

という訳で、新規に実装したい機能は 準備ができました。
後は、これらの操作や結果を表示する新規UIの実装部分になります。




追加 UI の実装

UIの作成

追加したい機能に合わせてUIを組んでみますと、こんな記述になりました。
UI自体は横長にして、既存のUVエディタの上部に表示するようにしてみました。
出来たUI設定を内部コマンド "custom_uv_editor_menu()" から引けるように設定します。 (完成したスクリプトより)

def custom_uv_editor_menu(*args):
    try:
        o_c_uvset = cmds.polyUVSet( query=True, currentUVSet=True )[0]
    except:
        o_c_uvset = ""
    cmds.columnLayout(columnAttach=('both', 5), height=40,
        rowSpacing=4, columnWidth=10, adjustableColumn=True)
    cmds.text(label='Custom UV Editor V 2.1',width=220,bgc=[0.2,0.2,0.2],align='center',height=10)
    cmds.rowLayout(numberOfColumns=20,adjustableColumn=20)
    cmds.text(label='',width=2)
    cmds.text(label='Current UV Set ; ',width=100)
    cmds.text('c_uv',label=o_c_uvset,width=90,font="boldLabelFont")
    cmds.checkBoxGrp('intract_check',columnWidth2=[120, 40],numberOfCheckBoxes=1,
        label='Interactive >', v1=False,changeCommand1=interactive_on)
    cmds.floatFieldGrp('u_number',label='U',precision=4,value1=0.00,columnWidth2=[10,80])
    cmds.floatFieldGrp('v_number',label='v',precision=4,value1=0.00,columnWidth2=[10,80])
    cmds.button('get_uv',label='GET',width=30,command=get_uv)
    cmds.text(label='',width=5)
    cmds.button('set_uv',label='SET',width=30,command=set_uv)
    cmds.text(label='',width=10)
.....<以下略> 

やりたいことは、workspaceControlのオプションuiScript="custom_uv_editor_menu()"で上記のUIを呼び出し、
オプションdockToControl=[texWinName,'top']で、既存のUIの上部にドッキングさせることです。
workspaceControlStateの 削除設定もあるので、ここの部分は 細かく設定することになり、注意が必要です。

def custom_uv_editor(*args):

    mel.eval('refresh;')

    if cmds.workspaceControlState("Custom_UV_Editor",q=True,exists=True):
        cmds.workspaceControlState("Custom_UV_Editor",e=True,remove=True)

    if cmds.workspaceControl("UVToolkitDockControl",q=True,exists=True):
        if cmds.workspaceControlState("UVToolkitDockControl",q=True,exists=True):
            cmds.workspaceControlState("UVToolkitDockControl",e=True,remove=True)

    if cmds.window('Custom_UV_Editor',exists=True):
        cmds.deleteUI('Custom_UV_Editor')

    mel.eval('string $textureEditorTitle = localizedPanelLabel("UV Editor" );')
    mel.eval('tearOffRestorePanel $textureEditorTitle polyTexturePlacementPanel true;')
    uvTextureViews = cmds.getPanel(scriptType='polyTexturePlacementPanel')[0]
    texWinName = uvTextureViews + "Window"

    if cmds.workspaceControl(texWinName ,q=True,exists=True):
        cmds.workspaceControl(texWinName ,e=True,checksPlugins=True)

    if not cmds.workspaceControl("Custom_UV_Editor",q=True,exists=True):
        cmds.workspaceControl("Custom_UV_Editor",retain=False,initialWidth=120,initialHeight=45,width=120,height=40,
            dockToControl=[texWinName,'top'],
            widthProperty="fixed",uiScript="custom_uv_editor_menu()")
    elif not cmds.workspaceControl("Custom_UV_Editor",q=True,visible=True):
        cmds.workspaceControl("Custom_UV_Editor",e=True,visible=True)
        mel.eval('refresh;')
        cmds.workspaceControl("Custom_UV_Editor",retain=False,initialWidth=120,initialHeight=45,width=120,height=40,
            dockToControl=[texWinName,'top'],
            widthProperty="fixed",uiScript="custom_uv_editor_menu()")

    if not cmds.workspaceControl("UVToolkitDockControl",q=True,exists=True):
        mel.eval('UVToolkitPanel();')
        cmds.workspaceControl("UVToolkitDockControl",e=True,dockToControl=[texWinName,'right'])
    elif not cmds.workspaceControl("UVToolkitDockControl",q=True,visible=True):
        cmds.workspaceControl("UVToolkitDockControl",e=True,visible=True)
        mel.eval('refresh;')
        cmds.workspaceControl("UVToolkitDockControl",e=True,dockToControl=[texWinName,'right'])


似たような行がたくさんあるのですが、要はステートもワークスペースも、
"あったら消し、無かったら作り、作って表示してなかったら表示する " ってやってるだけです。




カスタムUVの機能説明

UV値の取得/設定

[GET]
ポリゴンのモデリング作業中の操作からスムーズにUV値編集が出来るように、
View画面の選択モードから UV値が[Get]出来るようにしてあります。
例えばオブジェクト選択の状態で[Get]ボタンを押すと、全体がUV選択された状態でカスタムUVエディタに表示されます。
同様の操作として、頂点選択、エッジ選択、フェース選択、UVシェル選択からUV選択になって表示されます。
maya_12_UVeditor_030
複数の選択頂点がある場合は、"***.map[番号] の一番若い頂点番号にある UV値" が表示させれます。(通常は一番右下)

[SET]
[Get]ボタンで取得したUV値を[Set]ボタンで 設定します。
[Get]で取得した UV値 は 単一組の値 なので、
選択したUV頂点が複数の場合、[Set]ボタンを適合させると一点に集中してしまいます。
maya_12_UVeditor_031
このような動作の[Set]ではなくて、選択頂点群に対して[Set]出来る5つのボタンが その横にあります。
5つある[Set]ボタンで[赤色系は U値][緑色系は V値][黄色系は 両方][Set]ボタンにしてあります。

[Set U only] [Set V only]
選択されているUV頂点群 に対して[U値のみ][V値のみ]にUV値を設定します。
縦や横のUV値を一定の値にそろえる時に便利です。
maya_12_UVeditor_032
[SET as Group] [SetGroup U only] [SetGroup Vonly]
選択されているUV頂点群 をグループとして 一括で[UV値両方][U値だけ][V値だけ]、にUV値を設定します。
今の選択部分の形状を保持したままの移動が出来ます。
maya_12_UVeditor_033
Interactive >[レ]
Interactiveチェックボックス[レ](有効)の時、
選択している頂点を移動すると、その時のUV値U[_]V[_]欄に 自動的に反映されます。
値の更新自体は正確に言うと、マウスをリリースした瞬間です。動かしながらのUV値取得は処理が重くなると判断しました。
(それでも、頂点数が物凄く多い場合はスクリプトジョブを走らせて実行しているので延滞が起きる可能性はあります。)
細かいUV編集を UVの値変化 を見ながら作業したい場合に役立ちます。
maya_12_UVeditor_034
Current UV Set ;(例:map1
現在のUVセット名を表示します。
UV値を[Get]した時に表示が更新するので、UVセット自体を変更した場合に更新するようになっていません。
うまくUVセットプルダウンメニュー内の機能と連動して使用してみてください。
UV編集作業をしていて、ふと現在の UVセット名を確認したい時に便利です。
maya_12_UVeditor_035



GitHubを使った公開
という訳で、今回のツールからGitHubを使って公開することにしました。

ツールの設定
Pyファイルはシェルフにボタン登録するか、プルダウンメニューに登録して実行します。

既知の制限・注釈
Current UV Se;t の UVセット名の表示はUV値を [Get]すると更新する設定に今はなっています。UVセットを変えても表示が自動更新しません。
起動コマンドは以下の通りです。
custom_uv_editor()



GitHubからの取得
Pyファイルは GitHub に公開しています。
GitHub にアカウント登録していなくても ダウンロードは出来ます。
下記リンクページで、右上[ Clone or downlaod ]という緑色のボタンからダウンロードを行います。
ボタンを押すと表示される[ Download ZIP ]という右側のボタンからZipファイルを取得します。

ツィッターウェア (twitter ware)@SI_UsersNotes
あくまでも自己責任でお使いください。Use as your own risk.

https://github.com/O-Ritaro/Maya_CustomUVEditor


次回もMayaかも?・・・
乞う、ご期待!! Stay tuned ..
戻る次へ

Twitter

ページの先頭へ