D日記

モーションアーティストの技術ブログだよ。日常も書くよ。

MENU

【Maya】選択したメッシュ数分ジョイントを作成し、結合したメッシュとジョイントをスキニングする。

やりたいこと

モデリングやアニメーションの制作中に、複数のメッシュを迅速にジョイント化し、スキニングする作業が必要になることがあります。
このツールは、選択したメッシュの中心にジョイントを作成し、それをメッシュにスキニングするプロセスを自動化するために作りました!
手作業でのジョイント配置やスキニングの手間を大幅に削減できます。

youtu.be

今回作ったコード

メッシュを選択して実行!
バラバラのメッシュを結合して、ジョイント位置はそのままでリニアにスキニングする感じです!

import maya.cmds as cmds
import maya.mel as mel

def create_joints_and_skin_meshes():
    # 選択されたオブジェクトを取得
    selected_objects = cmds.ls(selection=True)
    
    if not selected_objects:
        cmds.error("メッシュを選択してください。")
        return
    
    joint_names = []

    for obj in selected_objects:
        # メッシュのバウンディングボックスの中心を取得
        bbox = cmds.exactWorldBoundingBox(obj)
        center_x = (bbox[0] + bbox[3]) / 2
        center_y = (bbox[1] + bbox[4]) / 2
        center_z = (bbox[2] + bbox[5]) / 2
        
        # メッシュの回転を取得
        rotation = cmds.xform(obj, query=True, rotation=True, worldSpace=True)
        
        # ジョイントを作成
        cmds.select(clear=True)
        joint_name = cmds.joint()
        joint_names.append(joint_name)
        print("ジョイント {0} を {1} の位置に作成しました。".format(joint_name, obj))
        
        # ジョイントの位置と回転を設定
        cmds.xform(joint_name, translation=(center_x, center_y, center_z), rotation=rotation, worldSpace=True)
    
    # 複数メッシュを結合
    combined_mesh = cmds.polyUnite(selected_objects, name="skin_merge_mesh", constructionHistory=False)[0]
    
    # 全ジョイントと結合されたメッシュを再選択
    cmds.select(joint_names, combined_mesh, replace=True)
    
    # スキニングを実行
    cmds.skinCluster(joint_names, combined_mesh, toSelectedBones=True, maximumInfluences=1)
    

# スクリプトを実行
create_joints_and_skin_meshes()

活用できるシチュエーション

大規模なプロジェクトでの一括処理
大規模な3Dプロジェクトでは、膨大な数のメッシュを扱うことがあります。このツールを使えば、一括してジョイントを配置し、スキニング作業を自動化できるため、作業時間を大幅に短縮できます。

ゲームアセットの初期セットアップ
ゲーム開発の初期段階では、アセットの基本的なセットアップを短時間で行う必要があります。このスクリプトを利用することで、モデルのプロトタイピングや、アニメーション用の基礎を素早く構築することが可能です。