Mayaでウェイト情報を書き出すスクリプトを書いた+使ったコマンド解説
1個前のエントリーの続き.
CSVの行が頂点番号と対応していて,ボーン名とウェイト値が交互に書き込んでる.
頂点あたりの影響ボーンの最大数も指定することができるので,MMDみたいに2個しかボーンをアサインできないみたいな環境でも使うことができる.ただし,最大数を指定してカットされると,影響値を全部足しあわせても1にならないので注意.
ボーンの情報とウェイトの情報をCSVに書き出すMayaスクリプト
という訳で,せっかくなのでMayaのコマンドを解説しようかなと思う.
使ったコマンドを羅列すると,
- cmds.select
- cmds.listRelatives
- cmds.xform
- cmds.polyEvaluate
- cmds.skinPercent
- cmds.listHistory
- cmds.objectType
意外とたくさんある…….
cmds.select
selectコマンドはその名の通り,指定したオブジェクトを選択するコマンド.
hierarchyオプションをTrueにすると,指定したオブジェクトが親になっているオブジェクトをすべて選択することができる.select hierarchyとほぼ同じ.
cmds.listRelatives
listRelativesコマンドは指定したオブジェクトの親子関係を返す.pオプションを指定すると,指定したオブジェクトの親をリストで返す.ただし,親がいない場合は空のリストではなくNoneを返すので注意.
cmds.xform
xformコマンドは言わずと知れた,指定したオブジェクトのアトリビュート値を返すコマンド.
オプションはたくさん種類があるけれども,q,ws,tオプションをTrueにすると,絶対座標を取得できる.ちなみに,それぞれquery, world space, translateと訳せる.
cmds.polyEvaluate
polyEvaluateコマンドは指定したオプションのカウントを取るコマンド.vオプションで頂点数を返してくれるようになる.その他にもfとかeとかuvとか色々とオプションがある.
cmds.skinPercent
skinPercentコマンドはざっくりと説明すると,ある頂点のウェイト値を返すコマンド.スキンクラスタノード,頂点,transformオプションでボーンを指定しないとウェイト値を返さない.
スキンクラスタノードはヒストリかHypergraphでしか見えないので,後で説明するlistHierarchyコマンドとobjectTypeコマンドを組み合わせてノードを取得している.
使い方はたくさんあるらしい.
cmds.listHistory
listHistoryコマンドは指定したオブジェクトのヒストリーを返す.ただし,返ってくるオブジェクトが必ずしもノードとは限らないため,そのまま使うのはかなり難しいと思う.
cmds.objectType
objectTypeはオブジェクトの種類に関するコマンド.このスクリプトではisTypeオプションでオブジェクトの種類を指定することで,指定したオブジェクトが指定したオブジェクトの種類と一致しているかどうか調べてくれる.
オブジェクトの種類がわからない時は,オプション無しで実行するときちんと文字列を返してくれるので,lsやselect同様に覚えておいて損はないコマンド.
とりあえず,使ったコマンドはこれで全部.
MayaのスクリプトはMayaの操作を知っている上で,Echo All Commandsで実行されたコマンドを調べたりすると捗る.たぶん,Mayaの操作がわからない状態でスクリプトを組むのは物凄く難しい.と言うのも,コマンド名があまりにも直感的じゃないので,リファレンスの目次を読んでも検索をかけてもコマンドが引っかからない.
Mayaを知っている人が,Mayaをどうにかするためのスクリプト.安易にMayaでPythonが使えるらしいからとMayaのスクリプトを組むのは自殺行為なので本当にお勧めしない.Mayaを仕事か趣味で普通に使っていて,それなりに操作を覚えて初めてスクリプトが書けるようになる.プログラマがゲーム業界で就活のネタ作りのために勉強するもんじゃない.Mayaがクソでどうしようもなくて,このままだとどうにもならないところからスタートする.Mayaが完璧だったらスクリプトを勉強する必要はないはず.
なんでこんなこと書くのかと言うと,過去にテクニカルアーティストになりたいと言っているプログラマー志望の学生がいて,もやもやっとMayaのスクリプト書ければいいんじゃないの,みたいに言っていたのをふと思い出した.Mayaがゴミクズの産廃ぐらいに思ってないと,そもそも作るもんないんじゃないかなって思います.
個人的にこのもやもやっとした言い方は,懇親会とは言え,かなりイラってくる発言だったので記憶に残ってる.なんというか,COBOL勉強すれば高級プログラマになれるんでしょ的なその筋の人を確実に怒らせる一言だった…….