[pymel] シェーダーを作る + アサインする

よくやるけど、いつも忘れるので mayaでシェーダー(シェーディングノード)を作ってアサインするコマンドのメモ。

Pymelの場合、sets()コマンドでシェーディンググループを作成して、コネクトしなくても createSurfaceShader コマンドを使用すれば
シェーダーとシェーディンググループをまとめて作成することができるようです。
作成したシェーディンググループにオブジェクトを追加する場合は、 sets(se,forceElement=<オブジェクト>) で、
作成したシェーディンググループに入れることができます。

createSurfaceShader コマンドを使用せず、従来の方法でやる場合は

でも、同様の処理ができるようです。

*注意点*
シェーディングノードを作る場合は、createNode ではなく shadingNode にしないと、ハイパーシェードに表示されなくなるようです。
引数には、それぞれなんのタイプなのか を asLight asShader asTexture asUtility から選んで入れる必要があります。

[pymel] シェーダーを作る + アサインする」への10件のフィードバック

  1. 初めまして。
    pymelを勉強してるうちに、こちらへ辿りつきました。

    作ったシェーダをアサインするところで詰まってしまっているのですが、お教え願えないでしょうか。
    記事にされている、

    pm.polyPlane()

    lam = pm.shadingNode(“lambert”,asShader=True)
    se = pm.shadingNode(“shadingEngine”,asUtility=True)
    lam.outColor >> se.surfaceShader

    pm.select(“pPlane1”)
    pm.sets(se,e=True,forceElement=True)

    を実行すると、下記の警告文がでてしまいます。

    # 警告: ノード ‘pPlaneShape1.instObjGroups[0]’: ‘set1’ シェーダに割り当てられません。 #
    # エラー: RuntimeError: file C:\Program Files\Autodesk\Maya2011\Python\lib\site-packages\pymel\internal\pmcmds.py line 98: 次のコネクションが生成されませんでした: ‘pPlaneShape1.instObjGroups[0]’ -> ‘set1.dagSetMembers[-1]’。 ソース ノードはコネクションを許可しません。
    引数の解析エラーです。 #

    ソースノードというのが調べても今ひとつ解らず・・・
    突然の質問で申し訳ないのですが、お答え願えると幸いです。
    よろしくお願いいたします。

  2. コードがおかしな事になっていたので、書き直してみました。
    e=True がいらない+forceElementにセットしたいオブジェクト名 でした。…スイマセン、書き間違いです。

    たぶん、修正記事の方法で動くと思います~

    • ありがとうございます!
      お陰さまでできました!
      Obj = pm.ls(sl=True)は
      Obj = pm.ls(sl=1)にすることで私の環境では動作しました。

      pymelを解説してくれている日本語サイトは少なくて、スクリプト初心者としてとてもありがたいです。
      本当にありがとうございました。

      • あれ・・・maya再起動したらObj = pm.ls(sl=True)でも動きます(;;
        先ほどはUnicodeEncodeErrordeでたのに謎だ・・・
        大変お騒がせいたしました。

  3. いえいえ~
    分からない事があれば、TwitterなりBlogなりに書いていただければ
    できるだけお応えしますよ~

    • たびたび質問すみません。
      ツイッターが見つけられなかったもので…

      ウィンドウを作り、ボタンを押したら入力した数値サイズのpolyCubeを作成するといった
      スクリプトを作ろうとした場合、
      その任意の数値はどうやって参照するんでしょうか?

      import pymel.core as pm
      import maya.cmds as cmds

      def ButtonSakusei():
      WindowName = pm.window(t = “gomi”)
      pm.columnLayout()
      pm.text(label=”gomigomi”)
      pm.separator( w = 250, h = 10)
      pm.text(label=”gomigomigomi”)
      nn = pm.floatField(v=10)
      pm.button(label=’Button 1′, command = “Push()”)

      pm.showWindow()

      def Push():
      ButtonPush=pm.polyCube(w=nn,h=nn,d=nn)

      nnのvの数値さえ取れれば良いと思うのですが、ヘルプのどこをみたらいいのか・・・
      どうぞお願いいたします。
      それと、もしよろしかったらツイッター教えてくださいませ。

      • pymelでの探し方ですが、
        polyCubeのように、ノードを作成する や UI作成 ように、「なにかをつくる」場合は、 HelpのCore の部分を探します。
        作ったオブジェクトを操作したり、「取得したい」場合は、
        Core Module 部分を探します。
        今回は、UIの値を「取得」したいので Core Modulesですね。
        +今回はUIなので、 uitypes になります。
        その中から、作成したUIのタイプを探します。

        取得したり、セットするコマンドは getなんとか() か setなんとか()
        という関数名になっていますのでわかりやすいかと思います(´ω`)

        参考までに手直ししたものを作ってみましたが、まずは調べて試行錯誤してみると良いかも?しれません。
        https://gist.github.com/fereria/9851859

  4. remiria様

    ご丁寧にありがとうございます!
    どう調べたらいいのか途方にくれてましたが、おかげさまでなんとかなりそうです。

    他のサイトでも*argsというのは時折みかけてましたが、こういうときに使うのですね…(;
    勉強になりました。

  5. ご無沙汰しております。
    また解らないことが出てきてしまいましたので、質問させてください。

    for i inで大量のtextFieldButtonGrpを作り、ボタンを押したらそのテキストが返される。
    というものを作りたいのですが、それぞれを認識させるにはどうしたら良いでしょうか?
    変数に i を足していこうとするとエラーが出てしまいますし、他に方法が無いものか煮詰まってしまっています。

    よろしくお願いいたします。

    import pymel.core as pm

    def get_text():
    print pm.textFieldGrp(“tx”+str(i), query = True).getText()

    with pm.window(title = ‘gomigomi’):
    for i in range(10):
    with pm.columnLayout():
    pm.textFieldButtonGrp(“tx”+str(i), text=’test’+str(i), buttonLabel='<',
    buttonCommand = pm.Callback(get_text))

コメントを残す

メールアドレスが公開されることはありません。


*