2023年4月3日月曜日

プロップを入れ替えたりする場合の注意点

 キャラクターリグの場合、武器などの装備品を切り替えてモーション付けをしたいという要望の挙がるってくる場合があるかもしれません。

 ツールなどを作成しなくとも、Reference Editorを使いプロップのモデルシーンの参照先を変更すれば簡単に入れ替えることができるので、ちょっと面倒だけど良いかなぁ、とか思うかもしれません。けれども、これでは次に同じシーンを開いたときに問題が出てきてしまいます。


 どんな問題があるのかというと、何回もクリックして変更したはずのプロップが変更前のモデルに戻ってしまうという現象が起きます。

 アニメーション用のシーンファイルを開き、作業するために Replace Referenceなどでリグシーン内のプロップモデルの参照先を変更しても、アニメーション用のシーンファイルをセーブしたときに保存されるのは、シーンファイル内の編集だけで、参照しているリグシーン内の編集である参照先ファイルパスの変更は保存されません。 

 図のように、参照しているリグファイル内の参照ファイルパスの変更は可能でも、普通のセーブでは、その状態のリグシーンを保存することが出来ないため、次回アニメーションのファイルを開いたとき、プロップは初期状態のものが読み込まれてしまうという事になります。
 リガーも切り替える事を前提にダミーのプロップシーンを組み込んでいたとしても、この段階ではまだまだ準備の状態です。

 ここで、ちょっと mayaのドキュメントを読んだことのある人の中には「リファレンスの編集を保存」という機能を思い出すかもしれません。
 これは Reference Editorで参照しているシーンファイルを直接保存するような機能です。

 ただ、コレをやられるとアニメータが勝手にリグファイルを更新することになるので、リグを管理する側の人たちからすると好ましくありません。
 変更されたリグファイル内のプロップのファイルパスは、このリグを参照しているファイル全体に影響してしまいますし、リガーが調整したリグファイルと競合を起こすなどの問題になったりします。
 なので、この機能の使用は禁止事項にするか、バージョン管理システムでリグファイルの変更をロックしておくべきだと思います。

 まぁ、この機能を知っている人にだけ「そういうのは無しのプロジェクトです」と注意だけしておいて、知らない人に余計な知恵を与えて、わざわざ危険度を上げる必要は無いです。

 そのため、リガーは「リファレンスの編集を保存」という機能とは別の方法でこの問題に対峙する必要があり、ツール作成やリグへ細工を施したりする工夫が必要になってきます。

 例えば、リグのルートコントローラへチャネルボックスに表示しない形でカスタムアトリビュートを追加し、そこへリファレンスファイルの名称かパスを記録しておき、ファイルを開いたときにスクリプトジョブなどでリファレンスファイルを記録してあるものと入れ替えるみたいな感じです。

proc _reloadReference(
     string $NS                         ///< リグのネームスペース(末尾に :あり)
    ,string $PRP                        ///< プロップ用のネームスペース(末尾に :なし)
    ,string $file )                     ///< リロードするファイル名
/**************************************************************************//**
    @protected
    @brief リファレンスファイルのリロードを行う。
 ******************************************************************************/
{
    /// @pre ファイルパスの作成
    string $dir =(`getenv "MAYA_PROJECT_PATH"`+"graphics/_rigs/_tmpProps/");
    
    /// @pre ファイルの存在確認 -> 無かったら戻る※エラー回避
    if(!`filetest -f ($dir+$file)`) return;
    
    
    
    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
    //
    /// @note ロードしているリファレンスファイルの確認
    //------------------------------------------------------------------------------
    /// @note -> Reference Name 
    string $RN =($NS+$PRP+"RN");
    
    /// @note -> 参照しているファイル名(フルパス)を取得
    string $refFile =`referenceQuery -wcn -f $RN`;// プロップファイル名
    
    /// @note -> 比較 -> 同じなら戻る
    if(`basenameEx ($dir+$file)`==`basenameEx $refFile`) return;
    
    
    
    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
    //
    /// @post 差し替え処理
    //------------------------------------------------------------------------------
    /// @post リロード
    evalEcho("file -loadReference \""+$RN+"\" -typ \"mayaAscii\" -op \"v=0;\" \""+($dir+$file)+"\"");
    
}

 これはカスタムアトリビュートでファイル名を管理する場合のサンプルで、26行目と38行目がリファレンスファイルを操作する部分、このスクリプトの肝。
 プロシージャを呼び出す側では、リグ内の特定ノードからアトリビュート値を取得したり、どの部分を入れ替えるのかを指定します。
 シーンを読み込んだ時に scriptJobで実行するようにしておくと便利です。

 これとは逆の原理で、交換可能なプロップファイルを getFileListなどで収集し、現在のシーンと入れ替えるツールを作成することで、アニメータにカスタムアトリビュートの存在を認識させないようにしておくなど、 なるべく作業する人には、裏で何をしているかを隠匿しておいた方が安全だと思います。


0 件のコメント:

コメントを投稿