3DCGbook

映像プロダクションに所属しています。主に毎日のアウトプットを配信していこうと思います。

スクリプトが苦手な方にオススメ!PyMEL講座3(フィニッシュスクリプト編)

スクリプトが苦手な方にオススメ!PyMEL講座1(リネームから始めよう編) - 3DCGbook
スクリプトが苦手な方にオススメ!PyMEL講座2(値の取得と設定編) - 3DCGbook

さて、早くも最終回な感じです。
今回はフィニッシュスクリプトというのを考えてみましょう。

そもそもフィニッシュスクリプトとは何か?
仕事ではデータの完成後にシーンを整理します。

そのような動作は、基本的にはプロジェクト毎にほとんど同じです。
なので毎回手作業でやるよりはスクリプトで自動化させることをお勧めします。

例えば以下のようなスクリプトを作ってみました。
モデリングが終わったらトランスフォームのフリーズやリセットをかけることが多々あります。

編集が終わったら、
1. 適用したいノードを選択
2. 以下のスクリプトを実行

それでクリーンになった最終盤が出来上がる...といったイメージです。
最終盤は最終盤として保存して、編集用とは分けて管理することが大事です。

編集用と最終盤を分ける理由は様々ですが、
トランスフォームのフリーズは若干危険な時もあるので数値を残しておいた方がいいです。
また最終盤は次の人に渡すためのデータとして管理されるものです。
データ不具合の報告があったらその最終盤のバージョンを上げて管理していきます。

不具合をなくすにはバージョンを管理することが非常に重要になってきます。

# PyMELのロード
import pymel.core as pm

# 選択したノードの取得
nodes = pm.selected()

# 法線ロック解除
pm.runtime.UnlockNormals()

# ヒストリー削除
pm.runtime.DeleteHistory()

# フリーズ
pm.runtime.FreezeTransformations()

# トランスフォームのリセット
pm.runtime.ResetTransformations()

# アトリビュート関係のセット
for node in nodes:
	shape = node.getShape()
	
	# トランスフォーム値のロック
	node.translate.lock()
	node.rotate.lock()
	node.scale.lock()

	# シェイプノードの取得
	shape = node.getShape()

	### シェイプのアトリビュートを設定
	#ソフトエッジにする
	pm.polySoftEdge(shape,a=180,ch=False)
	
	#smoothLevelを0にしてロックする
	shape.smoothLevel.set(0)
	shape.smoothLevel.lock()
		
	#overrideEnabledをオンにしてdisplayTypeをReferenceにする
	shape.overrideEnabled.set(1)
	shape.overrideDisplayType.set(2)

上記のスクリプトには、
pm.runtime.コマンド というのを多く使っています。
これはMayaにはランタイムコマンドというのが多く存在します。
大文字から始まるものがほとんどです。

PyMELではpmの後ろにruntimeとつけることで使用することができるようになります。


また今回はfor文が登場しています。
これは選択したノード(nodes)の中から、
最初から取り出して一つ一つ中のスクリプトを適用してね!
というのを行っています。

例えば、

for node in ["nodeA","nodeB","nodeC"]:
	print node 

nodeA
nodeB
nodeC
という順番にノードを選択している時に

nodeA
nodeB
nodeC
の順番に中のスクリプトが適用されます。

という感じでPyMEL講座は終了となります。

一部、口うるさくバージョン管理とか言ってしまいましたが;
皆様に少しでもお役に立てればと思います。



Pythonスタートブック
Pythonスタートブック
posted with amazlet at 15.01.18
辻 真吾
技術評論社
売り上げランキング: 4,190



Maya Python 完全リファレンス (Maya Python for Games and Film)
Adam Mechtley Ryan Trowbridge
ボーンデジタル
売り上げランキング: 387,589