Pythonスクリプトを使い、位置情報の値が入力されたCSVファイルを読み込んで、キーフレームをセットする手順を紹介します。
旅客機や人工衛星など飛行物体が移動する軌跡や、人間や動物の移動経路 など、分単位、秒単位で変わる大量の位置情報が収められたデータファイルを使って、アニメーション作成を依頼された事はありませんか?
もし、数百、数千の位置情報を、一つ一つ手動でセットするとしたら、想像しただけで気が狂います。
この様な単純作業はスクリプトでサクッと終わらせたい。
「CSVファイルを読み込みキーフレームを設定する」
Pythonスクリプトでこれを実行するには、大まかに次の処理が必要です。
・CSVファイルを読み込み、位置情報を取得する
・指定したオブジェクトにキーフレームをセットする
コードも短く処理も単純なので、MAYAのスクリプトに慣れてない方も是非参考にしてみて下さい。
MAYAにCSVファイルを読んでキーフレームをセットするPythonコード
今回使用するCSVファイルには、
time (キーフレームを設定する時間), x (translateXのキーフレームの値), y (translateYの キーフレームの値), z(translateZの キーフレームの値)
上記のデータが書かれています。
この、キーフレームの値が入力された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)
勿論、 csvfile_open = open(CSV_FILE) でも同様の処理はされますが、close() の閉じ忘れを防ぐ為にも with を使う方が望ましいでしょう。
import csv
CSV_FILE = "D:/liquidJumper/maya_csv_data.csv"
csvfile_open = open(CSV_FILE)
csvfile_csvread =csv.reader(csvfile_open)
for i_csvfile_csvread in csvfile_csvread:
print(i_csvfile_csvread)
csvfile_open.close()
■CSVの表題をスキップ
読み込んだCSVファイルの一行目は、キーフレームの数値データでは無く表題なので、for文の処理をする前に、next関数でスキップしておきます。
csvfile_header = next(csvfile_read)
他にも、for文以下で表題か否かを判別する方法もありますが、一行目に邪魔な表題があると分かっているなら、next関数で「サクッ!」と、無視するのが最もシンプルだと思います。
for i_csvfile_read in csvfile_read:
if(i_csvfile_read[0].isnumeric()):
if文で使っている「isnumeric()」は、ハンドルがcharやfloatなどの単純な数値情報だと判断した場合、Trueを返します。
注意点として、「isnumeric()」は、”百万”、”二十”など漢数字も数値として判定します。
この挙動を良しとするかどうかは意見が分かれるところ。
|
■キーフレームをセットする
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] に全てのキーフレームがセットされました。
>> デジハリ・オンラインスクール|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 TERAKOYA(侍テラコヤ)」
・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
・オンラインで学べるので地方在住者でも受講可能
|
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|