my funeral week

少しでも日々の生活に変化を。

MayaScripts_AimRigGenerator:エイムリグ生成

こんにちは。
毎回、この冒頭部分に何かしら挨拶文的なことを書こうとして・・・、結局消すんですけど、ブログやっている人ってどんな挨拶しているんでしょうね。自分も調べものをしている時は、良く他の技術系のブログを閲覧するんですが、なんだかんだ全文しっかり読まずに「画像」とか本題の部分まで飛ばしちゃうんで、いざ自分で何か書こうとしたら、文章の引き出しの少なさに我ながら驚愕しますわ。

さて、今回は個人的に最も利用しているスクリプトの紹介です。


AimRigGenerator

このスクリプトは回転制御でアニメーションしているノードに対して、エイム制御できる外部リグを生成できます。 キャラクターが手に持っている剣の軌道をキレイに整えたい、顔の視線を固定したい、そんなときに便利なスクリプトです。

f:id:garysfirearms108:20200520163337g:plain:w350


ダウンロード

www.dropbox.com

クリエイティブ・コモンズ・ライセンス


インストール

DLして解凍したフォルダ内の「AimRigGeneratorフォルダ」を、以下の場所に配置してください。

C:\Users\"ユーザー名"\Documents\maya\scripts

で、実行するには以下の2行をシェルフ等に登録してお使いください。

import AimRigGenerator
AimRigGenerator.main()


使い方

実行前にエイムリグを生成する対象ノードを選択してください。
対象ノードは回転アニメート可能なトランスフォームノードであることが条件です。

※複数のノードに対して同時リグを生成することもできますが、それなりに時間がかかるので注意してください。

対象となるノードを選択した上で前述の2行のコードを実行すると、以下のようなウィンドウと仮接続されたエイムリグが生成されます。

f:id:garysfirearms108:20200520155448j:plain

ウィンドウに各種値を入力することでリグの設定を行うことができます。

  • 必須項目
    • Length:エイム先までの距離
    • Axis:エイムする方向
  • オフセット
    • Aim Offset:エイムするXYZ位置のオフセット(ワールド空間)
    • Upv Offset:アップベクターの高さのオフセット値
  • リグの見た目
    • Rig Scale:各リグの大きさ
    • Color Type:各リグの配色タイプ

「Length」と「RigScale」の項目には、選択された対象ノードのシェイプの大きさに基づき、おおよその値が自動で入力されますので、普通に利用する分には「Axis」の項目を確認するだけで大丈夫かと。

ちなみに、エイム距離やオフセットの項目はマイナスの値にも対応しています。

オフセットの2つはエイム位置とアップベクターの高さの「オフセット位置」が設定できます。あくまでオフセットなので実際のエイム位置が変わる訳ではありません。リグの見た目上の位置を整える為に利用します。

各項目に値を入力し、「エンターキー」を押すと仮接続されているリグが設定された値に基づき再生成され、結果を確認することができます。

各設定項目に問題がないのであれば、「Accept」ボタンを押すと、対象ノードのアニメーションをエイムリグに反映され、設定完了です。ウィンドウは自動で閉じられ、リグが利用可能状態になります

Cancel」ボタンを押すか、ウィンドウ右上の「閉じる」ボタンにて ウィンドウを閉じると、リグの生成がキャンセルされ仮リグは削除されます


このウィンドウが表示されている間は、リグの設定が未完了状態なので、シーンのセーブやノードの編集は絶対に行わないでください。必ず、設定を完了するか、ウィンドウを閉じてから行ってください。


イムリグの使い方

下記の2つがアニメーション制御するコントローラとなります。

f:id:garysfirearms108:20200520155507j:plain

IKハンドルを利用したシンプルなリグです。
ダイアモンド状のノードがIKハンドル でエイム先の位置アニメーションを制御し、ピラミッド状のノードがアップベクター で傾きの制御を行います。

元のノードにアニメーションを戻す場合

アニメーションの編集が終了し、エイムリグが不要となった場合は、イムリグのルートノードを選択した状態で、再度このスクリプトを実行すると、元の接続先のノードにアニメーションをベイクし、選択されたエイムリグは自動的に削除されます。エイムリグのルートは下図のように対象ノード名に「_AimRoot」を追加した名前のトランスフォームノードになっています。

f:id:garysfirearms108:20200520155525j:plain



基本的な使い方は以上になります。

もう一つだけ注意点、このスクリプトは一般的なトランスフォームノードに対して利用することを想定しています。HumanIK等、回転コンストレイントの接続が難しいノードには対応していません。HumanIKについては追々対応したいと考えてはいますが・・・如何せんHumanIKを利用する機会がほとんどない為、まだまだ先になりそうです。アレめっちゃ使いにくくないですか?


更新履歴

  • ver 1.2.5
    • Upvectorのオフセット値を入力するとAnimationの移植が正しく実行されない問題の解消。
  • ver 1.2.4
    • 配布開始


余談

なんやかんや言うて、どのアニメーション制作においても、私はこのスクリプトを一番使ってます。 ブログにアップするのに伴って細かい追加機能を足したので、色々とコードを書き直しましたが、根本の仕組みは変更していません。

冒頭で言った視線や剣先制御以外にも、胸や腹のリグが回転で制御されているキャラクターリグなんかにも有用です。というのも結局アニメーションって・・・キャラクターのシルエットの末端部分の動きがある程度キレイに動いていれば、それなりのものに見えるので、このスクリプト使ってささっと末端部分のノイズを取るだけでも、パッと見の印象は良くなると思います。
もちろん後々のブラッシュアップは必要ですが、昨今の技術進歩に伴ってアニメーション制作も物量が求められる時代になってきました。クオリティの低いとりあえずの仮データでも、素早く仕上げられるのであれば、その後の空いた時間でブラッシュアップする時間も出来るんじゃないですかね。
アニメーションでもモデリングでもなんでも、高いクオリティを求めるのであれば、相応の時間の確保は必須です。面倒ごとは機械に任せてどんどん時短していきましょう。

話は変わりますが、みなさんバージョン管理ってどうやっているんですかね。
自分は愚直にフォルダにバージョン名付けて、丸々バックアップを取っているんですが、面倒な上にヒューマンエラーが起きやすいので、もういい加減やめたいと感じています。
この記事のスクリプトみたいな、小さいデータなら今の手法でも問題ないですが、Unityのプロジェクトなんかはファイル数が多くて複製するだけでも時間が掛かるし・・・。こんなアナログな方法じゃなくて、やっぱりSourceTreeとかGithubを利用するのが一般的なんでしょうか。一時期それらを利用していたこともあったんですが、古い考え方が抜けない為にネットワーク接続が必須という点に引っ掛かってしまい、この有様です。

とまぁ、今回はこんなところで。
それではまた。