liquidjumper MAYA,Python [MAYA] Pythonでキーフレームの値が入っているCSVファイルを読み込み、アニメーションカーブにセットする方法

[MAYA] Pythonでキーフレームの値が入っているCSVファイルを読み込み、アニメーションカーブにセットする方法

maya_python_csvfile_to_setKeyframe_topimage

Pythonスクリプトを使い、位置情報の値が入力されたCSVファイルを読み込んで、キーフレームをセットする手順を紹介します。

旅客機や人工衛星など飛行物体が移動する軌跡や、人間や動物の移動経路 など、分単位、秒単位で変わる大量の位置情報が収められたデータファイルを使って、アニメーション作成を依頼された事はありませんか?

もし、数百、数千の位置情報を、一つ一つ手動でセットするとしたら、想像しただけで気が狂います。

この様な単純作業はスクリプトでサクッと終わらせたい。

「CSVファイルを読み込みキーフレームを設定する」

Pythonスクリプトでこれを実行するには、大まかに次の処理が必要です。

・CSVファイルを読み込み、位置情報を取得する
・指定したオブジェクトにキーフレームをセットする

コードも短く処理も単純なので、MAYAのスクリプトに慣れてない方も是非参考にしてみて下さい。



MAYAにCSVファイルを読んでキーフレームをセットするPythonコード

今回使用するCSVファイルには、

time (キーフレームを設定する時間), x (translateXのキーフレームの値), y (translateYの キーフレームの値), z(translateZの キーフレームの値)

上記のデータが書かれています。

CSVファイル[maya_csv_data.csv]
▲今回使用するCSVファイル[maya_csv_data.csv]


この、キーフレームの値が入力されたCSVファイルを読み込み、時間とX・Y・Zそれぞれの値を取得。

選択したオブジェクト(ロケーター)の [Translate] にキーフレームを設定するPythonスクリプトがこちらです。

import maya.cmds as cmds 
import csv 


CSV_FILE = "D:/liquidJumper/maya_csv_data.csv" 
LOCATOR = cmds.ls(sl=True)[0] 

with open(CSV_FILE , "r") as csvfile_open: 
    csvfile_read = csv.reader(csvfile_open) 
    csvfile_header = next(csvfile_read) 

    for i_csvfile_read in csvfile_read:         
        f_time = float(i_csvfile_read[0]) 
        value_x = float(i_csvfile_read[1]) 
        value_y = float(i_csvfile_read[2]) 
        value_z = float(i_csvfile_read[3]) 
         
        cmds.setKeyframe(LOCATOR, at = "translateX", t = [f_time], v = value_x) 
        cmds.setKeyframe(LOCATOR, at = "translateY", t = [f_time], v = value_y) 
        cmds.setKeyframe(LOCATOR, at = "translateZ", t = [f_time], v = value_z) 

Pythonコードの解説

■open関数で読み込み

CSVモジュールをインポートし、対象のCSVファイルをopen関数で読み込み専用[r]でオープン。変数[csvfile_open]に代入。

そして、csv.reader(csvfile_open)で、一行ずつ読み込み。

import csv

with open(CSV_FILE , "r") as csvfile_open:
    csvfile_read = csv.reader(csvfile_open)

■CSVの表題をスキップ

読み込んだCSVファイルの一行目は、キーフレームの数値データでは無く表題なので、for文の処理をする前に、next関数でスキップしておきます。

csvfile_header = next(csvfile_read)


■キーフレームをセットする

f_time = float(i_csvfile_read[0])  
value_x = float(i_csvfile_read[1])  
value_y = float(i_csvfile_read[2])  
value_z = float(i_csvfile_read[3])  
cmds.setKeyframe(LOCATOR, at = "translateX", t = [f_time], v = value_x)  
cmds.setKeyframe(LOCATOR, at = "translateY", t = [f_time], v = value_y)  
cmds.setKeyframe(LOCATOR, at = "translateZ", t = [f_time], v = value_z)

Pythonスクリプトでキーフレームをセットするには、次のコマンドを使用します。 

setKeyframe

setKeyframe(オブジェクト名, at = アトリビュート名, time = キーフレームを設定する時間, value = キーフレームを設定する値)


一行ずつ読み込んだデータは、0は時間、1は[x]、2は[y]、3は[z]の順番でリスト化されているので、それぞれ取り出し、setKeyframe()に設定。

cmds.setKeyframe(LOCATOR, at = "translateX", time = [f_time], v = value_x)


アニメーション カーブが[1,2,3…..]の様な時間ベースの場合は、設定する時間のフラグにtime(t)を使用しますが、時間の単位が無い[0.1,0.2,0.3….]の様な浮動小数点数ベースのアニメーション カーブ上でキーフレームを設定する場合float(f)を使用します。

cmds.setKeyframe(LOCATOR, at = "translateX", float = [f_time], v = value_x)

Pythonスクリプトを実行してオブジェクトにキーフレームをセットする

キーフレームをセットするオブジェクト(ロケーター)を選択し、スクリプトを実行。

一瞬でオブジェクト(ロケーター)の [Translate] に全てのキーフレームがセットされました。

Pythonスクリプトを実行してオブジェクトにキーフレームをセットする


>> デジハリ・オンラインスクール|Web、CG、映像、プログラミングの通信講座の申込

まとめ

MAYAで使い位置情報が収まるCSVファイルをPythonスクリプトで読み込みキーフレームをセットする方法を紹介しました。

Pythonスクリプトで「CSVファイルを読み込みキーフレームをセット」を処理する手順


■CSVファイルを読み込み、位置情報を取得する

with open(CSV_FILE , "r") as csvfile_open: #open関数で読み込み
    csvfile_read = csv.reader(csvfile_open) #一行ずつ読み込み


■キーフレームをセットする

cmds.setKeyframe(LOCATOR, at = "translateX", t = [f_time], v = value_x)



本記事の内容に限らず、大量のデータを手動だけで処理するのは限界があります。

でもスクリプトを使えば、面倒な作業も一瞬で終わらせる事が可能。

「MAYAは毎日の様に使ってるけど、スクリプトはプログラマーに任せっきりで、自分では手をつけてない」

スクリプトで作業を効率化すれば、その分、作品のクォリティを上げる作業の時間が作れます。

現在、MAYAアーティストでスクリプトを習得したいと思いながらも後回しにしているなら、少しずつでも良いので、今から始める事をお勧めします。


SAMURAI ENGINEER Plus+


 月額定額制の完全オンライン・プログラミングスクール

 「SAMURAI TERAKOYA(侍テラコヤ)」

 ・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
 ・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
 ・オンラインで学べるので地方在住者でも受講可能

侍テラコヤ







𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事