graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

Reading PyMEL: ex01. ノード周り書いてみた

いくら趣味とはいえずっと読んでるのも大変だから、試しに自分でも書いてみた。
まずは PyNode に相当する部分から。

github.com

QyMEL って名前に特に意味はなくて、まぁとりあえず "P" の隣で "Q" にしとこうかな*1ってくらい。

  • 基本設計
    • __new__ を使わない
    • プロパティを明確に露出する
    • maya.cmds との併用を前提とする
    • __repr__()
  • コード生成
  • 型判定
  • クラス設計
    • MayaObject
    • Plug
    • Component
    • Iterator
    • DependNode

*1:宗教は同じだけど宗派が違うイメージ。

続きを読む

Reading PyMEL: 02. createFunctions

前回の記事で "import pymel.core as pm" はなぜ遅いのか? を書いたので、ここをもうちょっと深堀りしてみる。
pm.polyCube() みたいに、PyMEL はなぜ MEL コマンドを直接呼ぶことができて、しかも返り値を PyNode で受けとれるのか?

  • PyMEL 経由でコマンドを叩くと何が起きるのか?
  • newFuncWithReturnFunc
  • createFunctions
  • CmdCache
  • コマンド名と maya.cmds 内の関数との紐付け
    • MEL コマンドの実体
    • DLL 遅延ロード
    • stubFunc
    • コマンドの引数と返り値の PyMEL-friendly にする
    • wrappedCmd
続きを読む

Reading PyMEL: 01. PyNode

ふと思い立ってコードを読んでみることにした。
github.com

まずは pymel.core.PyNode から。
意外と複雑だし、ちゃんと読んだことのある人ってそんなに多くはないんじゃなかろうか。

  • PyNode の機能
  • シーン内オブジェクトへのアクセス
    • PyNode インスタンスの作成
    • __init__ と __new__
    • 作成すべきインスタンス型の特定
    • 余談1: "import pymel.core as pm" はなぜ遅いのか?
    • 余談2: ProxyUnicode
  • ノードの作成
続きを読む

C#とPythonからC++を叩いてみる。

たとえば Unity と Maya の両方で同じロジックを使いたい場合、C#Python で同じものを実装するのはとてもだるいので、C++ で書いてから共有できるようにしてみた。
GitHub - hal1932/DllExportTest

この手のことをやるときは基本的には SWIG で全然問題ないんだけど、あれはあれで面倒*1なので手動でやる方法を整理しておくのも悪くないとは思う。

  • 仕組み
  • C++
    • DLLエクスポート宣言
    • 関数の呼び出し規約
    • クラス定義
  • C#
    • DLL のロードとアンロード
    • 関数呼び出し
    • 引数と戻り値
    • コールバック関数
    • メモリ領域のやりとり
  • Python
    • DLL のロードとアンロード
    • 関数呼び出し
    • 引数と戻り値
    • コールバック関数の定義
    • メモリ領域のやりとり
    • スレッド周りの扱い

*1:例えば生成した Python モジュールを Maya で使いたい場合、mayapy を使って pyd を作ってやる必要があったりして無駄に汎用性を落とすことになる。ctypes 直叩きだと依存先に Maya が含まれないはずだからちょっとだけ嬉しい。

続きを読む

PySide ウィンドウに大量の画像を表示する


そういや PySide でスレッド周りあんまやったことないなぁ……と思ってやってみた。
お題はアセットブラウザとかでよくあるサムネ画像の一覧表示。
おおよそ悪くないとこまでいけたので、主にパフォーマンス周りについてメモっておく。

コードはこちら → py3_test/thread_pool_test.py at master · hal1932/py3_test · GitHub

  • 概要
  • Thread と ThreadPool
  • スレッド間の役割分担
  • QImage と QPixmap
  • 雑多な話題
続きを読む

Maya 用 PySide メインウィンドウの雛形。

ホリデープログラミング向けの Maya メインウィンドウの雛形を晒してみる。
ちょいちょい雑な実装もしてるけど、まぁそこはあくまで個人開発のテスト向け*1ってことで。
maya_test/maya.py at master · hal1932/maya_test · GitHub

  • ライブラリコード
    • findChildren() を使わない多重起動防止
    • UI を動的に再構築するための一番楽な実装
    • QApplication 生成ロジックの隠蔽
    • QApplication の初期化と QMainWindow の初期化を分離
  • ユーザーコードの例

*1:そもそも業務で実戦投入してるコードをこんなとこで晒すわけにはいかない。ほんとはそっちを出したいんだけど……。

続きを読む

PySide で多言語対応してみる。

f:id:hal1932:20190813202035p:plain f:id:hal1932:20190813202052p:plain
maya_test/main_window.py at master · hal1932/maya_test · GitHub

そのうち必要になる気がするので手順をメモっておく。

  • Qt Linguist のインストール
  • 多言語対応の UI を組む
  • pyside-lupdate
  • 言語の反映
  • 動的な言語切り替え
続きを読む