KnowShare

Home

❯

Tips&Tutorials

❯

Maya Tips

❯

スラッシュエフェクト用リグ簡易化ツール

スラッシュエフェクト用リグ簡易化ツール

Oct 11, 20253 min read

Step1プレーンとジョイントを作成しスキニングを行う

import pymel.core as pm
 
def create_motion_trail_setup_with_skin():
 
    # プレーン作成(YZ 平面上に配置)
    plane, history = pm.polyPlane(w=1, h=1, sx=10, sy=10, ax=(0, 1, 0), cuv=2, ch=1, name='pPlane1')
    pm.setAttr(plane.scaleX, 10)
    pm.setAttr(plane.scaleY, 10)
    pm.setAttr(plane.scaleZ, 10)
    pm.setAttr(f"{history}.subdivisionsHeight", 1)
 
    # ジョイント作成関数
    def create_joints(z, prefix):
        joints = []
        for x in range(5, -6, -1):  # X: 5 to -5
            pm.select(clear=True)
            jnt = pm.joint(p=(x, 0, z), name=f'{prefix}_joint_{x}', radius=0.5)
            joints.append(jnt)
        return joints
 
    lower_joints = create_joints(-5, 'lower')
    upper_joints = create_joints(5, 'upper')
 
    # 中心ジョイントの作成
    pm.select(clear=True)
    center_joint = pm.joint(name='center_joint', radius=1)
 
    # lowerJointとupperJointをcenter_jointの子にする
    for joint in lower_joints:
        pm.parent(joint, center_joint)
    for joint in upper_joints:
        pm.parent(joint, center_joint)
 
    # バインドスキンの実行
    pm.select(center_joint, plane)
    skin_cluster = pm.skinCluster(
        bindMethod=0,  # Closest distance
        skinMethod=0,  # Classic linear
        normalizeWeights=1,  # Interactive
        weightDistribution=1,  # Distance
        maximumInfluences=3,
        removeUnusedInfluence=True,
        name='motionTrailSkinCluster'
    )
 
    pm.select(clear=True)
    print("プレーンとセンタージョイントのバインドスキンが完了しました。")
 
    return {
        "plane": plane,
        "center_joint": center_joint,
        "lower_joints": lower_joints,
        "upper_joints": upper_joints,
        "skin_cluster": skin_cluster
    }
 
motion_trail_setup = create_motion_trail_setup_with_skin()

Step2上辺ジョイントをコンストレインする

import pymel.core as pm
 
def upper_constraint():
    selected_parents = pm.ls(selection=True)
    if not selected_parents:
        pm.warning("親となるオブジェクトが選択されていません。")
        return
 
    upper_joints = pm.ls('upper_joint_*', type='joint')
    if not upper_joints:
        pm.warning("シーンに 'upper_joint_' で始まるジョイントが見つかりません。")
        return
 
    for parent in selected_parents:
        for joint in upper_joints:
            constraint = pm.parentConstraint(parent, joint)
            print(f"'{parent.name()}' を親として '{joint.name()}' に upper_joint '{joint.name()}' へペアレントコンストレイントを適用しました。")
 
    pm.select(clear=True)
    print("upper_joint へのペアレントコンストレイント処理が完了しました。")
    
# スクリプトを実行する前に、親となるオブジェクトを選択してください。
upper_constraint()

Step3下辺ジョイントをコンストレインする

import pymel.core as pm
 
def lower_constraint():
    selected_parents = pm.ls(selection=True)
    if not selected_parents:
        pm.warning("親となるオブジェクトが選択されていません。")
        return
 
    lower_joints = pm.ls('lower_joint_*', type='joint')
    if not lower_joints:
        pm.warning("シーンに 'lower_joint_' で始まるジョイントが見つかりません。")
        return
 
    for parent in selected_parents:
        for joint in lower_joints:
            constraint = pm.parentConstraint(parent, joint)
            print(f"'{parent.name()}' を親として '{joint.name()}' に lower_joint '{joint.name()}' へペアレントコンストレイントを適用しました。")
 
    pm.select(clear=True)
    print("lower_joint へのペアレントコンストレイント処理が完了しました。")
 
# スクリプトを実行する前に、親となるオブジェクトを選択してください。
lower_constraint()
 


Graph View

Created with Quartz v4.5.1 © 2025

  • GitHub
  • Discord Community