見出し画像

アウトライン作成ツール

頂点押し出し法でのアウトライン作成ツールです。
初めて作ったPythonスクリプトなのであんまし使いやすくないんですけど、せっかくなのでおいておきます。

使い方

  1. アウトラインを生成したいモデルを選択(複数選択可)

  2. 「アウトラインを作成」ボタンを押す

  3. 上段のスライダーを動かす、またはテキストボックスに数値を入力してアウトラインの太さを設定

注意事項

スライダーやテキストボックスによるアウトラインの太さの調整は、「アウトラインを作成」ボタンによって生成されたアウトライン用モデルにしか反応しません。
「アウトラインを作成」ボタンを押したときにpolyMovevertexというノードを作成しているのですが、この時ノード名を「選択しているオブジェクト名+_PMV」にしています。アウトラインの太さを調節する時も同じように、「選択しているオブジェクト名+_PMV」にして無理やり名前指定して値を変更しているので、いろいろ融通聞かない仕様になってます……

すでにトランスフォームかけてあるオブジェクトのアウトラインの太さを変更したい場合は、polyMovevertexノードの名前を「選択しているオブジェクト名+_PMV」に変更するか、「アウトラインを作成」ボタンで生成したアウトライン用オブジェクトを使用するようにしてください。

あとこのツールで作成できるアウトラインの太さは0.100までです。

正直かなり使いにくいのですが、モデリング中に「いったんアウトライン有で様子みたいな……」って時にパパっとアウトライン作れるので、そんな感じの用途でご使用いただくといいのかもしれない?

以下、スクリプトの中身です。

from maya import cmds

def outlineMaker():
    
    ### アウトライン作成ボタンの関数 ###

    def LineObjectButton(*args):
        
        # 選択したオブジェクトを取得
        select_object = cmds.ls(selection=True)
        
        # 選択したすべてのオブジェクトを複製
        for obj in select_object:
                
            # オブジェクトを複製
            duplicated_object = cmds.duplicate(obj)[0]
            
            # 複製したオブジェクトの名前を変更
            new_name = obj + '_Line'
            rename_object = cmds.rename(duplicated_object, new_name)
            
            # 新しいLambertマテリアルを作成
            new_material = cmds.shadingNode('lambert', asShader=True)
            
            # マテリアルの名前を設定
            new_material = cmds.rename(new_material, new_name + "_m")
            
            # レンダリング可能なシェーディンググループを作成
            shading_group = cmds.sets(renderable=True, noSurfaceShader=True, empty=True, name=new_name + "_SG")
            
            # マテリアルをシェーディンググループに接続
            cmds.connectAttr(new_material + '.outColor', shading_group + '.surfaceShader', force=True)
            
            # マテリアルをオブジェクトにアサイン
            cmds.select(rename_object)
            cmds.hyperShade(assign=new_material)
            
            # マテリアルの色を変更
            cmds.setAttr(new_material+".color",0,0,0)
            
            # オブジェクトを選択
            cmds.ls(rename_object)
            
            # オブジェクトのメッシュ表示を反転
            cmds.polyNormal(normalMode=0)
        
        # リネーム後のオブジェクト名を格納していく変数を定義
        select_object_line = []
        
        # リネーム後のオブジェクト名を格納していく
        for obj in select_object:
            select_object_line.append(obj + "_Line")
        
        # リネームオブジェクトを選択
        cmds.select(select_object_line)
        
        # トランスフォームかけてPMVを作成
        Ohta_Transform()
        

    ### トランスフォーム(PMV作成)関数 ###

    def Ohta_Transform():
        
        # 選択したオブジェクトを取得
        select_object = cmds.ls(selection=True)
        rename_PMV = []
        
        for obj in select_object:
            
            # 選択したオブジェクトの頂点数を数える
            count_vertex = cmds.polyEvaluate(obj, vertex=True)
            
            # polyMoveVertexを作成する
            cmds.polyMoveVertex(obj + ".vtx[0:" + str(count_vertex) + "]", localTranslateZ=(0))
            
            # polyMovevertexの名前を変更し、変数に追加格納していく
            rename_PMV.append(cmds.rename("polyMoveVertex1", str(obj) + "_PMV"))


    ### スライダー関数 ###

    def SliderLocalTranslateZ(*args):
        
        # 選択したオブジェクトを取得
        select_object_PMV = cmds.ls(selection=True)
        
        # スライダーの数値を取得
        slider_value = cmds.floatSlider(slider, query=True, value=True)
        
        # スライダーの値を小数点第3位までにしてテキストフィールドに表示
        cmds.textField(text_field, edit=True, text="{:.3f}".format(slider_value))
        
        # PMVの名前を入れる変数を定義
        PMV_name = []
        
        # PMVの名前を作る
        for obj in select_object_PMV:
            PMV_name.append(obj + "_PMV")
        
        # PMVのローカル移動Zをスライダーの値に指定
        for PMV in PMV_name:
            cmds.setAttr(PMV + ".localTranslateZ", slider_value)


    ### テキストフィールド関数 ###

    def Slider_in_textField(*args):
        
        # テキストフィールドに入力された値をstring型からfroat型に変換して取得
        text_value = float(cmds.textField(text_field, query=True, text=True))
        
        # スライダーの数値を変更
        cmds.floatSlider(slider, edit=True, value=text_value)
        
        SliderLocalTranslateZ()


    ### UI ###

    # ウィンドウの名前を定義
    window_name = "ohtaOutlineTool"

    # すでに同名のウィンドウが開かれていた場合は閉じる
    if cmds.window(window_name, exists=True):
        cmds.deleteUI(window_name)

    #ウィンドウを作成
    window = cmds.window(window_name,  width=300, sizeable=True)

    # 縦レイアウトを作成
    cmds.columnLayout(height=120)

    # 横レイアウトを作成
    cmds.rowLayout(numberOfColumns=3)

    # テキストフィールドを作成
    text_field = cmds.textField(height=30, width=50, text="0.00", changeCommand=Slider_in_textField)

    # スライダーを作成
    slider = cmds.floatSlider(height=50, width=250, minValue=-0.1, maxValue=0, value=0, step=0.01, dragCommand=SliderLocalTranslateZ)

    # レイアウトを改行
    cmds.setParent("..")

    # アウトライン作成ボタンを作成
    cmds.rowColumnLayout(width=300, height=90, numberOfColumns=1)
    cmds.button(width=300, height=50, label="アウトライン作成", command=LineObjectButton)

    # レイアウトを改行
    cmds.setParent("..")

    # ウィンドウを表示
    cmds.showWindow(window)


この記事が気に入ったらサポートをしてみませんか?