<< TOP



キャラクター・メイキング
>> モーションキャプチャー その6-1

    キャラクター・メイキング編について
       ここで紹介するキャラクター・メイキング編は、様々な機能を分け隔てせず、
      ”キャラクターの作成に必要だったもの” としてまとめて紹介するかたちにします。
      ですので、シェーディングからリグ、フェイシャルなど、様々な機能の話しが登場すると思います。
       また、キャラクター自身も進歩していきますので、当初と異なってどんどんと変化していくことも予想されます。

       そんな ←このキャラクターを中心とした、”とりとめもない”事例ですが、どうぞ参考にして頂ければと思います。
       このキャラクターのファンになってくれたら もっとうれしい ^_^ ; です。  


 プロローグ
パソコンのスペック WindowsXP SP3、 Intel Core2Duo 3G、 RAM; 3G、NVIDIA Quadro FX1700



 ギターを想定したMoCap
      モデリング編にても紹介していますギターは、ギブソン・レスポール クラシックです。
    これは結構重いし、大きいものです。これをぶら下げながらMoCapすることはあまり良い条件とは言えません。

     そこで工夫となるのですが、ワンコインのショップなどで購入できる安価な材料を使って加工したものを使ったりします。
    意外と良いものが作れます。下のものはつっかえ棒2本とペットボトルホルダーの組み合わせで、
    先っぽに三角が出来るようにマーカーを付けています。 まるで 三味線 って言ってました・・・



     今回の ギター演奏のMoCap の為、にサウンド担当のとあさんに曲を作ってもらっています。Thx!!
    曲は特徴的な部分単位に分けられてあり、それを聞きながら演技をしてもらっています。
    つまり、曲の同じフレーズ部分は、そのMoCaopを使いまわすことを想定しています。
    そうこううするうちに、なんかノリノリになって来て、とても楽しい・・・感じですね。Let's Go♪♪♪

     
     

     さー、うまい具合のデータになったんでしょうか。



 MocapToRig
      はい、またMOTOR機能を使ってMoCapデータ取り込みます。
    T字ポーズのデータと 動きのデータが別ファイルであるケースなのですが、
    すでにT字ポーズのデータから、少しギターを弾く動きが入っています。
    では、さっそくそのデータを読み込んでみましょう。

    アニメーションモジュールにて、 ツール > MOTOR > リグにモーキャップ を選択します。


    <今回のデータでは左肩と腕の位置合わせに試行錯誤しています>

    Step1:モーキャプファイルタイプ:C3D を 右▼のプルダウンメニュから選択
    Step2: Tポーズを含むc3dファイルを指定する 
    Step3: Zアップ
    Step4: MocapBiped を 右▼のプルダウンメニュから選択
    Step5: [C3D読み込み] を実行します。

    表示される黄色のマーカー位置にあわせて C3DRigの球を移動させて位置合わせをします。
    今回のデータは左右対称の位置ではないので、対称を有効のチェックを外して作業をします。

     次に工程で行うMoCapデータの適応で動きがうまく乗らなかった場合、
    ここのポーズマップ作りを何度か繰り返すことになるので、ここまでのシーンを必ず保存しておきます。
    そうしたら、下の [ポーズマップ保存] のボタンを押して マップを保存します。



    一旦、新しいシーンで開きます。
    ツール > MOTOR > リグにモーキャップ を選択します。



    Step1:モーキャプファイルタイプ:C3D を 右▼のプルダウンメニュから選択
    Step2: MoCapを含むc3dファイルを指定する 
     はい、いよいよ、曲のイントロ部分の動きです。手の先に付いている3つのマーカーはギターのものですよ。

    Step3: Zアップ
    Step4: MocapBiped を 右▼のプルダウンメニュから選択
     ここで上記手順で保存したポーズマップ Cap5_Mo05_001_001.c3dpose を指定します。
    Step5: [C3D読み込み] を実行します。

     こんな風に動いたらOKです。



 RigToRigPPG;適用
     今度は C3DRig から キャラクターのRig に動きのデータをリターゲットします。
    まずは両Rigに タグ・テンプレートファイル を設定します。

    C3DRig の、[C] TagPPG というプロパティーをダブルクリックで開きます。
    既にその1で保存している 全部の項目に記述をした
    C3DRig用タグテンプレートファイル を [ロード]ボタン より読み込んで設定します。
    C3DRig用タグテンプレートファイル 御提供!! >>  C3DRig_ForC3Dfile.tagt

     次はキャラクター用のRIgにもタグ・テンプレートファイル を設定します。
    一旦作業用にSceneRoot直下に置いたBipedRigに、やはりその1にて保存した
    キャラクターBipedRig用タグテンプレートファイル を [ロード]ボタン より読み込んで設定します。
    キャラクターBipedRig用タグテンプレートファイル 御提供!! >>  biped_rig.tagt



     そうしたら、C3DRig 、Biped の順に選択状態にし (Ctrl+左マウスクリック)、
    MOTOR > リグからリグへ を選択します。[適用] ボタンを押して データを流し込みます。

     最初のこの段階ではかなりひどいことになっていたりします。 それは [調整] で直していきます。



 RigToRigPPG;調整
     さて、ここの調整は、前述同様、肩や腕の回転値を中心に調整しますが、今回のデータはかなりうまく適応している方でした。

     RIgToRigのPPG内の [調整] ボタンを押して各項目を調整していきます。
    アニメーションの部分は保存されないようですが、アジャストした設定値はプリセットとして保存できるようなので提供します。
    キャラクターBipedRig用リターゲットアジャストファイル 御提供!! >>  BipedRig_Mo05_007.adj



    これでエアーギターはだいたい見えて来ました。
    せっかくあるギターのMoCapデータも利用してみましょう。



 ギターの動き
     [プロット] を行う前の [調整] の段階で、ギターの動きをキャラクターサイズにしてみています。<以下参考↓>

     ギターの動きをキャラクターに合わせるのに色々と試行錯誤しています。
    ギターの動きは、ストラップからぶら下った 紐先っぽの所から動くのが自然だと思うので、
    そこが回転の中心になるような動きにデータ化して、設定しています。
    また同時に、本来ギター全体の位置は肩からぶら下ったストラップ以下にあるので、
    そのストラップ以下の動きをどのようにRIgにするのかも考えてみました。

     プロダクションレベルでは、このような動きに合わせた骨構造や仕組みを構築する (Riggingと言う) Rig班が居て、
    アニメーションを付けるチームとは別のグループとして作業をしていたりします。
     
    --- 追加情報 ----
       MOTORの機能の中には、その構造ファイル(.structure)に追記して、ボーンを増やすことが可能です。
      でずが、初期の段階、ここでは”ギター演奏のボーン構造をどのようにするのか” がはっきりしていない時に
      この構造ファイル(.structure)の作成からアプローチすることはかなり難しいです。
      以下考察をしてからだと、構築すべきRigが理解し易いかと思います。

1)基点のアニメーション取得
     単純な方法として、”動きをマネシンボする2つの階層構造” を作って、
    片方のスケールをキャラクターサイズに縮小する、ということで動きの移行が出来ます。



     考察として、”ギターを想定したモノ” は変形しないもの 硬いモノとよく言う) に付いているマーカー3つなので、
    その相対的な位置関係は変わらないものとします。
    で、2つのマーカーが 1直線上にあり、もう1つが方向を決めるアップベクターだと考えれば、ボーンで傾きが得られます。



    1) root3-root
     1つの3Dボーンを作成します。この時、スナップをONにすると、Root と Effの位置を正確にその位置に合わせられます。
    そのRootを C3DData.root3 位置コンストレイントし、Effを C3DData.root1 にコンストレイントします。
    boneを選択しておいて、スケルトン>チェーンアップベクター を実行して、C3DData.root2 をピックします。
    するとクルッと回転して Y軸が上になります。
    そうしておいて、C3DData.root2 のグローバルの位置を boneのUpVectorの各XYZ値にD&Dして 位置エクスプレッションでイコールを作ります。

    2) C3DData-ROT
     親Nullを1つ作った下に別の3Dボーンを1つ作ります。今度は表示サイズを大きくするのと同時に、表示もボックスにしてあります。
    Rootを 先に作ったボーンのRootに位置コンストレイントし、boneも回転コンストレイントします。 それだけ。

    3) Biped-ROT
     上で作った階層構造の複製を作成し、設定してある各コンストレイントは全て外します。
    今度のは 親Nullでスケールを小さくしてキャラクターサイズにするものです。
    複製したRootを 複製元のRootの ローカル位置をエクスプレッションでイコールにします。
    複製したboneも、複製元のboneに回転コンストレイントします。
    親Nullごと、全部を小っちゃくします (0.013 =この値はMotorの調整の中に書いてる数値です) 。



     手の位置は、[調整] にで、アニメーションの設定をして合わせています。

     次に、ギターの動きをとらえる位置をギターのストラップ付近を基点とすることを考えました。
    棒になっている上から約36%位の所にパスコンストレイント、タンジェント 1 X軸 として 位置・回転値をPLOTします。



    その基点は胸骨の子供の構造体として動くようにしてみました。
    しかし、ストラップは左肩を基点として動くようにしています。
    ここは骨でIK的な動きを使いそのエフェクターがギターにつながっています。
     ですが、ここに少し面白いRigを用意してみました。
    ストラップ自体はエンベロープの動きで滑らかに動きますが、このIK的動きをする骨をエンベロープとして設定しているのではありません。





 ギターのストラップ用Rig
     まずはじめの考察としては紐のような動きですが、骨に対してエンベロープをかけた場合、
    骨数が少ないと関節みたいな動きになりそうで、また服にめり込んだ場合にその位置修正が難しそうに思いました。
     そこで、骨ではなくCurveにエンベロープを付ける考えで、カーブのポイントにセンタークラスターを作成してそれにエンベロープを付けたと考えます。
    すると、カーブの一部分ずつしか動かないので、胴体の全体で動いた場合、部分制御のアニメーションが面倒だと直感します。
     今度は、Curveの頂点にセンタークラスターを作成して、それらが個々に骨に位置コンストレイントされていると考察します。
    IKの動きでCurve全体が動き、エフェクターはギターの側面にピン付けされたように動いてくれます。(下左図)

      

    ストラップは骨にエンベロープするのではなく、Curveにパス位置コンストレイントしたNull郡対してエンベロープを付けます。
     が!!、そうすると、今度はどうやってカーブの位置調整を楽に設定できるかです。
      ちなみに、階層構造的に、子に位置するものが親の位置を制御するように設定すると、それは動きの矛盾になってしまいますね(アニメーションのサイクル)。

    そこで考えられるのは、骨構造体の中にNullをこしらえて、その位置が実はCurveのオフセット値を制御するという発想です。



     各骨の直下に置いてあるNull(表示だけ ボックス ) はそのローカルの位置はもちろんXYZ= 0,0,0, です。
    カーブのクラスターセンターは骨に位置コンストレイントしているので、そのオフセット値も 0,0,0, です。

    つまり、骨直下のNullの位置を =クラスターのオフセット値と同じ値 というエクスプレッションにすれば、
     Biped.Strap_Curve_Point4_ClsCtr.kine.poscns.off2x は  Biped.strap_bone2__Ichi3.kine.local.posx
     Biped.Strap_Curve_Point4_ClsCtr.kine.poscns.off2y は  Biped.strap_bone2__Ichi3.kine.local.posy
     Biped.Strap_Curve_Point4_ClsCtr.kine.poscns.off2z は  Biped.strap_bone2__Ichi3.kine.local.posz



    箱を動かすだけでオフセット値の変更できることになり、結果、Curveの位置調整が、骨の動きに追加して更に設定できることになります。
    個別のケースでストラップの位置が自由に設定できる、そしてアニメーションが付けられる、ということになります。



    動きに合わせて 位置調整をしたストラップの形状です。



    こうしたRigの再構築と動きの検証をした上で、改めてGuitar演奏時用の デフォルトRig と Tポーズ を用意してみました。





 ギターの弦の動き
     ストリングの動きも出来ないか考察してみます。
    でもなるべくアニメートが簡単にできるような方法を考えてみましょう。

     まずはストリングを ジャーン♪ と弾いた時の動きです。
    ここはエクスプレッションで動きを作って、それをプロットして Clip化すると便利なのではないでしょうか。
    エクスプレッションも 三角関数(SIN等)を使った計算式で求める方法はグラフィッカーには馴染みにくいものですね。
    そこで数値を勝手にいじって、それらしい事ができる便利な関数が用意されています。その名もずばり [ 振動 ] です。



     エクスプレッション・エディターのビューを グラフ表示 にすると、作成された動きをカーブで表示してくれます。
    使う関数は 関数>プロファイル>振動 から表示される oscil というもので、
    オシロスコープ (Oscilloscope)からの意味でなんとなく理解できます。

     こんなシーンを用意して試行錯誤してみてください。
    カーブの両端にセンタークラスターを作成、真ん中の頂点にもセンタークラスターを作成して表示だけ ボックス にしておきます。
    下図画面 ↓ は TOPビューで見ているので、ローカルのZ軸に関数を付けます。
     各値の説明は、[?] ボタン で日本語のヘルプが出るので、
    検索したい語句 で oscil と検索かけると以下のような説明が出てきます。

       oscil(10,90,5,15,LinearInterp,1,20,SplineInterp) フレーム10で開始し、フレーム90で終了する振動を生成します。
      最初の半周期は5フレーム持続し、15フレーム持続する最後から2番目の半周期で線形になります。
      振幅は、最初のSoftimage単位1からスプライン補間で20に増大します。



    フレーム単位で動きを制御出来るので三角関数で求めるよりも感覚的に楽です。
     これを oscil( 1, 15, 7, 0, SplineInterp, 0.7, 0, SplineInterp ) で再生させると、こんな動きです。
      ちゃんと15フレで動きが収束している制御が良いです。
     

     これを参考に、開放弦の音に合わせたアニメーションを作成してみます。
    音を聞くと意外と長く響いていて、あまり細かい動きだと見えにくいので誇張を入れるつもりで動かしてみました。

     Curveにパス設定したNull (表示はボックス)はストリングのエンベロープにもなっています。
    そのパスの 向きから影響を受ける を有効にしています。
    子供が親を制御するアニメーションを作成するとサイクルのエラーになってしまうので、
    別の階層のNullがぱやり同じCurveにパス設定していますが、その値は先のNullとイコール (=)のエクスプレッションになっています。
    その子のNull(表示は黄色のボックス)に、 oscil( 1, 150, 8, 0, SplineInterp, 0.1, 0, SplineInterp ) 
    から整理して作成した曲線運動がY軸に付けていて、この動きが、最初のNullの 向きから影響を受ける のY軸に
    Biped.Kiten_06s.kine.local.posy * -1 と設定されています。



     実は、直接 Y軸のファンクションカーブが付いているのは、この6弦用のNulll(表示は黄色のボックス) だけであり、
    あとの5個は at_frame( Fc - 2, Biped.Kiten_06s.kine.local.posy ) などと時間差設定がされています。
    at_frame 関数は そのフレーム数から 何フレーム後に 次の動きが設定される という フレームオフセット なんです。
     つまり、 2フレームあとに動くということで、時間差を作っています。
    では、なぜ1フレームじゃないかというと、動きの上下が逆のなると、アニメーション的に綺麗じゃかったからです。
    そういう意味で、6・5弦、4・3弦、2・1弦 という組でずれて動いています。


    そうしたら、6つの弦の動きをファンクションカーブにPlotして、それをClip化します。
    ClipをPresetとして保存しておけば、あとで色々と使い回せます。





 ギターのコード
     今回撮ったモーションでは、手の指の動きまで考慮に入れていません。
    ですが、キャラクターの指をそのように設定できるのか実験的に試してみることにします。

     前頁からの音続きなので C - Am7 - Dm7 - G7 -- C   としてみましょう。 
    こんな押さえ方なんだということが調べれば解ります。

     左の指だけ、Code_LYubi-Anm なんていうGroupを作成して、回転キーフレームが付け易くしておきます。



     ここまで使うのか決めていないのですが、仕組みとして面白いかと思って、弦が押さえられているようにしてみました。
    内容は上記 ギターの弦の動き と同様なんです。このBox表示のNullの位置は弦が動かない基点に出来ます。
    これで、コード毎に この%の値を取っておけば、アニメーションに使えるデータになります。
     更に突っ込めば、このBox表示のNullにはそれ自体に位置アニメーションが付けられえるので、”チョーキング” 時に弦を動かせます。



     どうせなら、もっと突っ込んでみましょうか。
    このPass%の値だけを登録したようなGroup って作成できないようでした。
    ならば、最も簡単な方法としては、特定のオブジェクトの位置の値が %に連動するようにしておけば良いのではないでしょうか。
    6つのNull群を作成して、1~100の値で動くという制限を作っておき、その値が =%にエクスプレションでリンクを
    作成しておけば簡単な位置アニメーションでNull%値を制御できますね。

    ここまでのアニメーションをMixer上に設定すると、こんな感じになりました。



     指先だけだと味気ないけど、音と合わせるとこんな感じです。




     と、ここまで下準備だけでこれだけかかってしまいました・・・・。
    いよいよモーションデータを乗せていきたい・・・・・・・・・・・ってところで、次になってしまいました。 
    まだ続くんかい、、、


     という訳で、次こそ、ギターを弾きたい・・・
       乞う、ご期待!!