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()
