Maya Shelfの整理

MayaのShelfの整理です。よく使うスクリプトはメニュー化していますのでShelfには何かに使ったけどもはや何に使うのかよくわからんスクリプトがゴロゴロしてます。どんどん削除してもいいけどもしかしたら何かの参考になるかもって事でブログにバックアップです。

動くかどうかは保証しません!(The scripts below was written by me a long time ago. I can’t promise that it will work properly!)

機能の分からんモノがたくさんあるのでまた次の機会に載せるとして今日のところは3つ。まず1つ目はシーンからスムースメッシュがかかったメッシュオブジェクトを選択するもの。なんのために?

#Select smooth meshes
import pymel.core as pm 

mesh_shapes = pm.ls(type='mesh') 
smooth_meshes = [] 
for s in mesh_shapes: 
	pm.select(s) 
	r = pm.displaySmoothness(query=True, polygonObject=True) 
	if r != None and r[0] >= 3: 
		smooth_meshes.append(s) 
pm.select(smooth_meshes) 

2つ目、レガシーなレンダーレイヤーの削除かな?

続きを読む “Maya Shelfの整理”

Reading mcx part1

Maya nParticleのキャッシュファイルを自前で作成したくなって、まずは読み込みから。

Devkitの中に「cacheFileExample.py」が入ってますが間違ってる箇所が多いので、必要のないものをバッサリ削って、整理して。で、いちから書きました。

One File/One file per object なmcxファイルの読み込みテストです。PythonスクリプトはTest for Reading mcx file[GitLab]へ置きました。

読み込み結果は長いので別ページ。

続きを読む “Reading mcx part1”

Maya + V-Ray Material Variations

ひとつのマテリアルからカスタムアトリビュートに応じてバリエーションを作成する方法です。オブジェクト毎に不透明度のアニメーションをつける場合、Mayaではその数だけマテリアルの複製が必要ですが、VrayUserScalarを使用することで複製をすることなしに実現することができます。

残念ながらビューポートでの確認ができませんけどね。

VrayUserScalarノードを扱う場合は、オブジェクトへカスタムアトリビュート「vrayUserScalar_アトリビュート名」をデータタイプをfloatとして追加します。 VrayUserScalarノード の「User Scalar Attribute」へ「アトリビュート名(vrayUserScalar_はいらない)」を入力します。

VaryUserColorノードの場合はカスタムアトリビュート「vrayUserColor_アトリビュート名」、データタイプはVectorです。Colorとしたいところですがアトリビュート追加ダイアログではできないみたいです。下のスクリプトではカラーピッカー付きのアトリビュートを追加できます。

選択したオブジェクトへ一括でカスタムアトリビュートを付加するMelは以下に置いときます。UIは無しです、$attrNameを適宜書き換えてください、「value」と書くと、「vRayUserScalar(もしくはColor)_value」と言うアトリビュートが追加されます。

参考: User Attributes[docs.chaosgroup.com]


VRayAddOpenSubdivAttrGrp更新

Maya V-Ray:OpenSubdiv一括適用スクリプト」がMaya2017 Update5で起動しない不具合のお知らせをいただいておりましたので、対処してアップロードしました。合わせてMaya2018へも対応しております。

古いバージョンはMaya2017 Update2までの動作確認でして、原因はPythonクラス「maya.app.general.mayaMixin.MayaQWidgetBaseMixin」に動作の変更があったためでした。ファイルでいうと「”C:\Program Files\Autodesk\Maya2018\Python\Lib\site-packages\maya\app\general\mayaMixin.py”」です。

古いMayaQWidgetBaseMixin(少なくとも2017 Update2まで)はそれを継承したダイアログを作成した場合、ダイアログをインスタンス化(初期化)した時点でMayaのメインウィンドウの子になっていたのに対して、新しいものはshow()メソッドを呼ばない限り、メインウィンドウへの子となりません。

ダイアログの初期化時にすでに開かれているインスタンスをメインウィンドウに問い合わせて閉じるようにしていますが、初期化時にはメインウィンドウへの参照が無い状態となってエラーが出ていました。

マイナーアップデートでAPIの変更は勘弁してもらいたいですね。


MASHで複製されたメッシュ上にロケータを配置

タイトルがこれでいいのか分からない…

現在時刻の位置、回転を参照してロケータを配置します。

MASH Waiterノードを選択して以下(Shelfにでも登録して下さい)を実行です。Maya2018.2で動作確認済み。

import pymel.core as pm

def createLocatorOnMashPoint():
    if len(pm.selected()) == 0:
        return
        
    if pm.selected()[0].nodeType() == "MASH_Waiter":
        waiter = pm.selected()[0]
        #print pm.listAttr(waiter)
        
        rotations = waiter.inRotationPP.get()
        positions = waiter.inPositionPP.get()
        visibilites = waiter.inVisibilityPP.get()
        
        for i,p in enumerate(positions):
            if visibilites[i][0] == 0:
                continue
            locator = pm.spaceLocator()
            locator.setTranslation(p,space='world')
            locator.setRotation(rotations[i])

createLocatorOnMashPoint()

MASH APIを使うのかと思ったらいらんかった。