Upload
game-tools-middleware-forum
View
1.251
Download
7
Embed Size (px)
Citation preview
2
番外編!
Presented By Ritaro HomePage http://www.comtec.daikin.co.jp/DC/UsersNotes/
@DaikinComtec_CG @SI_UsersNotes
Maya; 大人気!カスタム・グラフエディタと
便利ツールをPythonで!!
Agenda ● 最新カスタム・グラフエディタの紹介
使用ソフト; Maya 2016,MotionBuilder2016
● Pythonで実現した便利ツールの紹介 ● カスタム・ハイパーグラフの紹介 ● これまでの経緯と最新版で達成した機能
● Rig用ICONツール ● SynopticView(Softimage名);選択用GUI ● 表の作成と書き込み/読み込み
scriptTableコマンドとCSVファイル SynopticView機能考察と組み合わせて出来たものとは。。。
● おまけ
● 最新カスタム・グラフエディタの紹介
● これまでの経緯と最新版で達成した機能
■ カスタム・グラフエディタ
● 既存グラフエディタの一大要望と問題点 ● [一大要望] = タイムラインの表示
■ 現在は以下2点を解決している。
● [問題点] = パネルの取り扱い
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_02/
GraphEditorのパネルタイプは scriptedPanel
これまでの経緯と最新版で達成した機能 1
~少しずつヒモ解いていった 初投稿 Version 1 は 2014年8月 からスタート
・メインウィンド下と連動してスクラブで動くキーフレーム変更GUI
・スクリプティングからのパネルの作成と管理
windowコマンド扱いにしたい、trearOffPanelは増殖し続ける MEL記述部分をなるべくPython記述にしてすっきりさせたい
カレントタイムスクラブ k ;Maya-SIHOTキー Alt+k
これまでの経緯と最新版で達成した機能 2
● [一大要望] = タイムラインの表示 >> なんとかメインウィンドウ下のTimeLineを実現したい。
mel.eval('tearOffCopyItemCmd scriptedPanel graphEditor1;') の下に追記しただけ。
・intSliderGrp コマンド を Slider 表示
・intSliderGrp を GraphEditor 下に表示
★ ふと timePort コマンドを知る!! だが、マニュアルのPython記述だと表示しない > 縦横値が必要
cmds.timePort(enableBackground=True,bgc=[0.2,0.2,0.2],width=500,height=20 )
cmds.intSliderGrp('TimeSlider',field=True,・・・
・最初は QT Designer の Slider の試作から始まった。
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 3
● [問題点] = パネルの取り扱い >> なんとかMel記述からの脱却とWindow内表示で管理したい。1
・最初は Melコマンドのティアオフ 表示方法から始まった。
最初から複数表示で使うことを考えている
★ ふと window コマンド 内に scriptedPanel を表示する方法を知る!!
パネル名に連番を追記して、ボタンコマンドのユニーク名とした
grp_panel_no_a = str( len(cmds.getPanel( scriptType='graphEditor' )) + 1 ) panel_name = "GraphEditor" + grp_panel_no_a mel.eval('string $panel_name = "%s"' % panel_name) mel.eval('tearOffPanel $panel_name "graphEditor" true;')
この記述の下に記述することで、下に button や timePort を追加した
paneLayout コマンドを利用してフラグに horizontal2 を使う
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 3.5
● [問題点] = パネルの取り扱い
win1 = cmds.window('custom_graphEditor'+ grp_panel_no_a, title='New CustomGraphEditor'+ grp_panel_no_a, resizeToFitChildren=True, widthHeight=(1100, 450)) pane1 = cmds.paneLayout(configuration='horizontal2', paneSize=[2,1,1], parent=win1) graphmenu = 'graphEditor' + grp_panel_no_a cmds.scriptedPanel(graphmenu, label=graphmenu ,type='graphEditor', parent=pane1)
この記述で、windowを親とするパネルとしてグラフエディタを入れることが出来た
>> なんとかMel記述からの脱却とWindow内表示で管理したい。2
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 4
● [問題点] = パネルの取り扱い >> なんとか増殖し続けるパネルを整理したい。
★ ふと deleteUI コマンドのフラグで パネル を削除することを知る!! 表示していないパネルリストから、グラフエディタがあったら削除する
invis_panel = cmds.getPanel(invisiblePanels=True) graphpanels = cmds.getPanel(scriptType='graphEditor') graphpanels.remove('graphEditor1') for o_graphp in graphpanels: if o_graphp in invis_panel: cmds.deleteUI(o_graphp,panel=True)
★ 使用したパネルがドンドン溜まっていくのを防ぐことが出来た !!
ただし graphEditor1 は削除しない
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 5
● 最新バージョンの発表 ! = Outliner の設置 (未公開) >> なんとかノード選択機能を補いたい。
★ ふと paneLayout コマンド のフラグを vertical2 にする方法を知る!! pane1 = cmds.paneLayout(configuration='vertical2', paneSize=[1,20,1], parent=win1) in_panel = cmds.outlinerPanel() outliner = cmds.outlinerPanel(in_panel, query=True,outlinerEditor=True) cmds.outlinerEditor(outliner, edit=True,showDagOnly=True, transmitFilters=False,setFilter='DefaultPolygonObjectsFilter')
講演後公開予定お楽しみに・・・
CustomSideGraphEditor.py
■ カスタム・グラフエディタ
● カスタム・ハイパーグラフの紹介
■ カスタム・ハイパーグラフの紹介 1 http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_06/
●最新バージョン公開中 こちらも同じくWindow化と未使用パネル削除対応になっている。
invis_panel = cmds.getPanel(invisiblePanels=True) hyphpanels = cmds.getPanel(scriptType='hyperGraphPanel') hyphpanels.remove('hyperGraphPanel1') for o_hyphpanel in hyphpanels: if o_hyphpanel in invis_panel: cmds.deleteUI(o_hyphpanel,panel=True) hyper_panel_no_a = str( len(cmds.getPanel( scriptType='hyperGraphPanel' )) + 1 ) win1 = cmds.window('custom_HyperGraph'+ hyper_panel_no_a, title='New CustomHyperGraph'+ hyper_panel_no_a,resizeToFitChildren=True, widthHeight=(800, 500)) pane1 = cmds.paneLayout(configuration='horizontal2', paneSize=[2,1,1], parent=win1) hypergraphmenu = 'hyperGraphPanel' + hyper_panel_no_a cmds.scriptedPanel(hypergraphmenu, label=hypergraphmenu , type='hyperGraphPanel', parent=pane1)
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_06/
●最新バージョン公開中 階層表示方法設定子画面 [Setup],Softimage的SRT一致ツール、ちかんツール(置換ね)
■ カスタム・ハイパーグラフの紹介 2
● Pythonで実現した便利ツールの紹介
● Rig用ICONツール
● SynopticView(Softimage名);選択用GUI
● 表の作成と書き込み/読み込み scriptTableコマンドとCSVファイル SynopticView機能と組み合わせて出来たものとは。。。
● Pythonで実現した便利ツールの紹介
● Rig用ICONツール
■ Pythonで実現した便利ツールの紹介 Rig用ICONツール 1
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/
・キャラクター制御Rig用のICON集表示 + Tool GUI
★ 実は、最大の便利さは Scale にある HIKなどのRigはスケールが大きい。
中身は、作成したカーブをデータ化して
cmds.curve(name='curve1',d=3, p=[(-1.1112534999848538, 2.4959175586702926, 0.14370895922185412), (-0.9331233132338141, 2.563328364756063, 0.14413296666402145), ・・・・・ (-1.111253499984741, 2.4959175586700435, 0.14370895922183932)], k=[0.0, 0.0, 0.0, 1.0, 2.0, ・・・ 25.0, 26.0, 26.0, 26.0])
cmds.curve(name='作成されるカーブの名前',d=次数,p=ポイントの x、y、z の位置, k=ノットベクトルにあるノットの値)
リギング>コントロール>コントロールリグの作成>作成
スクリプトから生成している。
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/
★ 面白い点; カーブのShapeデータを別のノードの子供にして、
例えば、
cmds.parent(relative=True, shape=True)
ICON表示と同じく、回転軸に制限を設け ⇔の方向だけに回転するようにすれば 解りやすり Rig が作成が可能
■ Pythonで実現した便利ツールの紹介 Rig用ICONツール 2
選択用の表示物として移せる。
選択も出来る Joint などが作成出来る カーブ表示物が付いた
● Pythonで実現した便利ツールの紹介
● SynopticView(Softimage名);選択用GUI
■ Pythonで実現した便利ツールの紹介 SynopticView 1 (未公開)
・キャラクター制御Rig用の選択GUI + 選択性(Selectability) Softimageのコントロールリグ選択画面 (html+Script)
>> なんとか、自由に表示を変えられ、認識しやすく、 Rig選択が楽になるような GUIが作れないか
1) 表示ウィンドウ内にボタンを自由に配置する 2) クリックした時、そのノードに予定しているアニメーションの種類
(移動/回転/スケール) に変化する (選択性 = Selectability)
・既定表示マニュピレータ; 「マニュピレータの表示ツール」 にして選択する必要がある。
・キー>キーの設定; ◎現在のマニュピレータハンドル
■ Pythonで実現した便利ツールの紹介 SynopticView 2 (未公開)
★ 1) 背景用の画像を表示する formLayout コマンド なら 選択ボタンを自由に配置出来る
cmds.window() window = cmds.window('synoptic_body', title=Synoptic Body HIK',sizeable=False, topLeftCorner=[200, 200], widthHeight=(356,443)) form = cmds.formLayout() bg1 = cmds.image( image= ’W:/Maya/Maya_GTMF2015/icons/sy_main00.png’ ) bot1 = cmds.button('b_body',label='Body HIK',bgc=[0.25,0.25,0.25], enable=False) cmds.formLayout( form, edit=True, attachForm=[ (bg1, 'left', 0), (bg1, 'top', 40),(bg1, 'right', 0),(bg1, 'bottom', 0), (bot1 'left', 10),(bot1, 'top', 60), ・・・・・・・ ]) cmds.showWindow(window)
■ Pythonで実現した便利ツールの紹介 SynopticView 3 (未公開)
cmds.setToolTo( 'moveSuperContext' )
★ 2) 選択性(Selectability)は setToolTo コマンドを使って マニュピレーター自身を変化させる
cmds.setToolTo( 'Rotate' )
今選択しているツール・コンテキストの名前(マニュピレータ)を知るには cmds.currentCtx() を使う。
移動ツールは 'moveSuperContext'
if cmds.currentCtx() != 'moveSuperContext':cmds.setToolTo( 'moveSuperContext' )
回転ツールは 'RotateSuperContext'、 'Rotate' スケールツールは 'scaleSuperContext' 移動/回転/スケールツールは 'Transform' 既定のオブジェクト マニュピレータは 'ShowManips'
■ Pythonで実現した便利ツールの紹介 SynopticView 4 (未公開)
★ 2.5) 選択性(Selectability)を マウスの中ボタン に持たせたい
head_eff = cmds.iconTextButton('b_head_eff',image1= 'mbutton15r.png',style='iconOnly', annotation='S_Ctrl_HeadEffector', command=lambda *args: select_lists('head_eff',sy_names_b), dragCallback=lambda *args: select_lists('r_head_eff',sy_names_b), dropCallback=select_lists_dropcallback)
ここでは単純に 回転ツールにしているだけ
dropCallback もダミー処理を用意して、キー受付処理を終わらせる
elif o_select == 'r_head_eff': if cmds.currentCtx() != 'Rotate':cmds.setToolTo( 'Rotate' )
実は buttonコマンドには 中ボタン用に dragCallback というフラグがある 本来の目的は dropCallback と対で使用して Drag&Drop機能 を実現させる
def select_lists_dropcallback(*args): pass
■ Pythonで実現した便利ツールの紹介 SynopticView 5 (未公開)
★ 2.5) 選択性(Selectability)を マウスの中ボタン に持たせたい
def callbackName( dragControl, x, y, modifiers ):
実は dragCallback で中ボタンを押した時のキーの組み合わせまで取得出来る
def filter_rz( dragControl, x, y, modifiers ): # in CustomGraphEditor if modifiers == 0: # MMB コマンド1 elif modifiers == 1:# MMB + SHIFT コマンド2 elif modifiers == 2:# MMB + CTRL コマンド3
modifiers が 0 == 中ボタン + モディファイアなし、
3 == 中ボタン + CTRL + SHIFT、
1 == 中ボタン + SHIFT、 2 == 中ボタン + CTRL、
■ Pythonで実現した便利ツールの紹介 SynopticView 6 (未公開)
実例 ; HIK コントロールリグ 選択GUIを作成
選択内容はコントロールリグと同等 だが、もっと解りやすく細かい。
ri_synoptic_body.py ri_synoptic_hand.py
● Pythonで実現した便利ツールの紹介
● 表の作成と書き込み/読み込み scriptTableコマンドとCSVファイル
■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み1 (未公開)
・表のGUI作成は scriptTableコマンド で行う。 table1 = cmds.scriptTable('table',rows=3, columns=7,columnWidth=([1,135],[2,145],[3,70],[4,45],[5,40],[6,40],[7,40]), label=[(1,"SourceNodeName"), (2,"DestinationNodeName"), (3,"Constrain"), (4,"Offset"), (5,"X"), (6,"Y"), (7,"Z")], cellChangedCmd=edit_cell)
行末に行を追加したり、削除したり、選択行を削除したり、 選択行に値を入れたり出来る。
addButton = cmds.button(label="Add Row",command=add_row) deleteButton = cmds.button(label="Delete Row",command=delete_row) deleteSelRowButton = cmds.button(label="Delete Selected Row",command=delete_sel_row) def edit_cell(row, column, value): return 1 def add_row(*args): last_row_num = cmds.scriptTable('table', query=True, rows=True) cmds.scriptTable('table', edit=True,insertRow=last_row_num)
■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み2 (未公開)
・import csv で excel でも扱える ,(カンマ)で区切ったテキストファイルを
import csv cmds.textFieldButtonGrp('load_csv', edit=True, text=import_filename[0]) o_file = open(import_filename[0], 'r') reader = csv.reader(o_file) header = next(reader) o_file.close()
Maya上のGUI表で記入した値を CSVファイルに書き込んだり、
Pythonで 読み込み/書き込み できる。
外部CSVファイルをMaya上の表に記入したり出来る。
if not (cmds.file(csv_file,query=True, exists=True)): tmp_csv_file = open(csv_file, 'w' ,os.O_CREAT) else: tmp_csv_file = open(csv_file, 'w') writer = csv.writer(tmp_csv_file, lineterminator='¥n') writer.writerow(data_list) tmp_csv_file.close()
■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み3 (未公開)
実例;Rig作成に良く使用する コンストレイント表 を作成
ソースのノード,影響を受けるノード,コンストレイントの種類,オフセット設定の有無,独自設定値
表に基づき 複数種類のコンストレイント を一気に付ける。
table1 = cmds.scriptTable('table',rows=3, columns=7,columnWidth=([1,135],[2,145],[3,70],[4,45],[5,40],[6,40],[7,40]), label=[(1,"SourceNodeName"), (2,"DestinationNodeName"), (3,"Constrain"), (4,"Offset"), (5,"X"), (6,"Y"), (7,"Z")], cellChangedCmd=edit_cell)
ri_constraint_table.py
● Pythonで実現した便利ツールの紹介
● 表の作成と書き込み/読み込み
SynopticView機能と組み合わせて出来たものとは。。。
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察1 (未公開)
1)背景絵を選択させて、大きさも目標物も自由なシノプティックを作成出来る
import maya.OpenMaya as OpenMaya w = OpenMaya.uIntPtr() h = OpenMaya.uIntPtr() img = OpenMaya.MImage() img.readFromFile(tmp_bg_file) img.getSize(w, h) window_w = w.value() window_h = h.value()
★ ActiveSynopticツール > シノプティックGUIを作成ツール
選択した画像からwindowの大きさを設定するには、 Mayaに読み込む時に画像の縦横値を取得する必要があるが、 それはOpenMayaを使う。
● やれる事
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察2 (未公開)
● やれる事 2)ボタンの配置する位置は 中マウスボタンクリック地点 を応用する
bg1 = cmds.image(image=tmp_bg_file,dragCallback=bg_pos ) def bg_pos( dragControl, x, y, modifiers ): sel_cell_list = cmds.scriptTable('table', query=True, selectedCells=True) selected_row = cmds.scriptTable('table', query=True, selectedRows=True)[0] cmds.scriptTable('table', edit=True, selectedCells=[selected_row,2]) cmds.scriptTable('table', cellIndex=(selected_row,2), edit=True, cellValue=str(x)) cmds.scriptTable('table', edit=True, selectedCells=[selected_row,3]) cmds.scriptTable('table', cellIndex=(selected_row,3), edit=True, cellValue=str(y)) cmds.scriptTable('table', edit=True, selectedRows=selected_row)
細かい値は後からでも表値で修正できる。
★ ActiveSynopticツール > シノプティックGUIを作成ツール
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察3 (未公開)
● やれる事 3)最終的にシノプティック用のPythonを書き出す時、
tmp_py_file = open(tmp_py_file, 'wb') writer = csv.writer(tmp_py_file, lineterminator='¥n') tmp_py_file.write( "# -*- coding: utf-8 -*-" + '¥n' "import maya.cmds as cmds" + '¥n' "import maya.mel as mel" + '¥n' "import maya.OpenMaya as OpenMaya" + '¥n' ・・・・・ if o_type == '' or o_type == "0": if o_sel == "0": tmp_py_file.write( " " + o_name + " = cmds.button('" + o_namespace + "_" + py_name + o_name +"',label=' '," + '¥n'
表の値に基づいて決まったパターンのPythonコマンド群を書き込んで行く。
★ ActiveSynopticツール > シノプティックGUIを作成ツール
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察4 (未公開)
最終出力された選択GUIは、通常のPython GUI なので 細かい設定がもっと必要なら追記が可能。
実例 ; ActiveSynopticツール ri_maya_active_synoptic.py
・ どんな形の Rig にも対応できる ・ 短時間で初期セットが完成する ・ csvファイルで再利用が可能 ・ ネームスペース名に対応できる
● おまけ ● MotionBuilderのHIKとのリンク
時間があったら
簡単にモーションをMayaに持ってこれて、出力データに対応できる。
35
番外編!
Presented By Ritaro HomePage http://www.comtec.daikin.co.jp/DC/UsersNotes/
@DaikinComtec_CG @SI_UsersNotes
ご静聴ありがとうございました。 おしまい!
36
番外編!
Presented By Ritaro HomePage http://www.comtec.daikin.co.jp/DC/UsersNotes/
SUITE UsersNotes ページへの記事
★ アンケートの記入のおねがいです。
感想、リクエスト・・・、 なども ありましたら・・・・どうぞ!