Maya PythonとMaya Python API 2.0で速度を比較してみよう!スキンウェイト取得編!

今回は、
1.Maya Python(maya.cmds)
2.Maya Python API 2.0(maya.api.OpenMaya)
これら2つの手法でスキンウェイトを取得して、 速度を比較してみました。

テストは同じモデルとスキンデータを用いて、
cmdsとAPI 2.0でスキンウェイトを取得するコードをそれぞれ記述し、実行時間を計測しています。

さて、どちらがどれくらい速いでしょうか? 一緒にコーディングして確認してみましょう!

※ この記事は、Maya Advent Calendar 2024 のシリーズ2 6日目の記事です
※ Maya2025 を利用しています。

管理人がYouTubeで解説!

Maya PythonとMaya Python API 2.0 の違い

Maya Python (cmds)
Mayaの標準的なPythonモジュールです。
コマンドベースで直感的に操作できるが、処理速度が遅い場合があります。

Maya Python API 2.0
より低レベルなAPIで、Mayaの内部データに直接アクセスできます。
cmdsよりも高速な処理が可能ですが、使い方が複雑になる場合があります。

サンプルコード

import time
from maya import cmds
from maya.api import OpenMaya as om2
from maya.api import OpenMayaAnim as oma2


# 実行時間を取得するラッパー
def timeit(func):
  def wrapper(*args, **kwargs):
    start = time.time()
    result = func(*args, **kwargs)
    end = time.time()
    print(f"{func.__name__} took {end - start:.4f} seconds")
    return result
  return wrapper


# スキンクラスターを取得
def getSkinCluster(node):
    histories = cmds.listHistory(node, pruneDagObjects=True, interestLevel=2)
    skinCluster = None
    for history in histories:
        if cmds.nodeType(history) == "skinCluster":
            skinCluster = history
            break
    if skinCluster is not None:
        return skinCluster
    return skinCluster


# maya.cmdsを利用したスキンウェイト値の取得
def cmds_get_per_vtx_skin_value(node):
    skinCluster = getSkinCluster(node)
    vertex_count = cmds.polyEvaluate(node, vertex=True)
    vertex_weights = [None] * vertex_count
    for i in range(vertex_count):
        weight = cmds.skinPercent(
                    skinCluster,
                    f"{node}.vtx[{i}]",
                    q=True,
                    value=True
                )
        vertex_weights[i] = weight
    return vertex_weights


# maya.cmdsを利用したスキンウェイト値の取得
def api2_get_per_vtx_skin_value(node):
    def split_list(lst, n):
        return [lst[i:i+n] for i in range(0, len(lst), n)]
    selection = om2.MSelectionList()
    selection.add(node)
    mesh_obj, mesh_comp = selection.getComponent(0)
    skinCluster = getSkinCluster(node)
    selection = om2.MSelectionList()
    selection.add(skinCluster)
    skin_obj = selection.getDependNode(0)
    skinCluster = oma2.MFnSkinCluster(skin_obj)
    weights = skinCluster.getWeights(mesh_obj, mesh_comp)
    weights = split_list(weights[0], weights[1])
    return weights


# おまけ:1頂点のマックスインフルエンスの取得
def check_num_influence():
    nodes = cmds.ls(sl=True)
    for node in nodes:
        weights = api2_get_per_vtx_skin_value(node)
        num_inf = len(weights[0])
        max_influence = 0
        for weight in weights:
            per_max_influence = num_inf - weight.count(0)
            if max_influence < per_max_influence:
                max_influence = per_max_influence
        print(max_influence)


@timeit
def main_cmds():
    nodes = cmds.ls(sl=True, type="transform")
    for node in nodes:
        cmds_get_per_vtx_skin_value(node)
    return


@timeit
def main_api2():
    nodes = cmds.ls(sl=True, type="transform")
    for node in nodes:
        api2_get_per_vtx_skin_value(node)
    return


if __name__ == "__main__": 
    main_cmds() 
    main_api2()

おわりに

Maya Python API 2.0でスキンウェイトを取得すると、従来のcmdsより圧倒的に速いですね!
でも、API2.0で値を設定する場合、Undoを自分で実装する必要があるんです…
Undoできないと困っちゃいますからね。

ちょっとハードル高めだけど、今は参考文献も多いから挑戦しやすいはずです。
API 2.0マスターへの道は、Undo実装から始まるといっても過言ではありません。

いつかプラグイン実装についても解説したいところです…

おすすめ書籍

少し古い書籍ではあるのですが、Python APIについて細かく説明してくれている書籍です。
正直、発売している書籍でPython APIについて書かれているものはこれくらいしかないです。
自身もこれで理解が深まりましたので興味ある方は是非…!

関連記事

  1. リガーに必須の講演資料や書籍4選!

    2020-12-23

  2. アーティストのためのMaya Python入門 番外編「よくわからん!lambda式とやらを使ってみよう!」

    2020-12-01

  3. マウスから手を離さないで!ポップアップメニューを改造で高速化!

    2021-05-25

  4. 再帰関数を使って末端ジョイントを取得しよう!

    2021-01-08

コメントをお待ちしています。

コメント

ABOUT

テクニカルアーティストの為のまとめサイトです。

本サイトでは、『YouTube ✕ Blog』を中心に
情報発信をしていきます。

また、テクニカルアーティストとしての様々な
ライフハック記事も投稿予定です。

限定情報会員

PATREONでは、限定情報やサンプルファイルの配布も行っています。登録頂けると更新頑張れます。支援の方よろしくお願いします。


免責事項

本ウェブサイト内で公開している全ての情報の有用性や安全性については当方は一切の保証を与えるものではありません。
利用したことによって引き起こる直接および間接的な損害に対して当方は一切責任を負うものではありません。
全て自己責任でご使用ください。

3DCGBOOK出版

BOOTHで技術書を販売利しております。







スポンサー

ページ上部へ戻る