|
プロローグ モーションキャプチャーその6-1、ギターの演奏になります。 ”その場動き”の最も典型的な例であるダンス同様楽器の演奏なんかも人気のある動作ではないでしょうか?。 最近の MoCap は顔の動きも撮れるものですから、指の動きも工夫次第で撮れるものと思います。 今回は演奏の動きがちゃんと撮れるのか?をメインにした実験ですので、 自由に振舞ってもらって楽しく MoCap したものを都合に合うような動作に加工する というアプローチです。 >ギターを想定した MoCap >MocapToRig >RigToRigPPG;適用 >RigToRigPPG;調整 >ギターの動き >ギターのストラップ用のRig >ギターの弦の動き >ギターのコード パソコンのスペック 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ファイルを指定する モーションキャプチャーデータ >> Cap5_Mo05_001_001.c3d
Step3: Zアップ
Step4: MocapBiped を右▼のプルダウンメニュから選択 Step5: [C3D読み込み] を実行します。 表示される黄色のマーカー位置にあわせてC3DRig の球を移動させて位置合わせをします。 今回のデータは左右対称の位置ではないので、対称を有効のチェックを外して作業をします。 位置調整データ >> C3DRigPositin-Mo05_0-Map_75.emdl
次に工程で行う MoCapデータの適応で動きがうまく乗らなかった場合、ここのポーズマップ作りを何度か繰り返すことになるので、ここまでのシーンを必ず保存しておきます。 そうしたら、下の [ポーズマップ保存] のボタンを押してマップを保存します。 ポーズマップデータ >> Cap5_Mo05_001_001.c3dpose
一旦、新しいシーンで開きます。 ツール > MOTOR > リグにモーキャップを選択します。 Step1:モーキャプファイルタイプ:C3Dを右▼のプルダウンメニュから選択
Step2: MoCapを含むc3dファイルを指定する はい、いよいよ、曲のイントロ部分の動きです。手の先に付いている3つのマーカーはギターのものですよ。 モーションキャプチャーデータ >> Cap5_Mo05_007_001.c3d
Step3: Zアップ
Step4: MocapBiped を右▼のプルダウンメニュから選択ここで上記手順で保存したポーズマップCap5_Mo05_001_001.c3dposeを指定します。 Step5: [ C3D読み込み] を実行します。
こんな風に動いたらOKです。 |
RigToRigPPG;適用 今度は C3DRig からキャラクターの Rig に動きのデータをリターゲットします。
まずは両Rigにタグ・テンプレートファイル を設定します。 C3DRig の、[C] TagPPG というプロパティーをダブルクリックで開きます。
既にその1で保存している全部の項目に記述をした C3DRig用タグテンプレートファイルを[ロード]ボタンより読み込んで設定します。 次はキャラクター用の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が理解し易いかと思います。 単純な方法として、”動きをマネシンボする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 というもので、 オシロスコープ(Oscilloscop)からの意味でなんとなく理解できます。 こんなシーンを用意して試行錯誤してみてください。 カーブの両端にセンタークラスターを作成、真ん中の頂点にもセンタークラスターを作成して表示だけボックスにしておきます。 下図画面 ↓ は TOPビューで見ているので、ローカルのZ軸に関数を付けます。 各値の説明は、[?] ボタンで日本語のヘルプが出るので、 検索したい語句で oscil と検索かけると以下のような説明が出てきます。
フレーム単位で動きを制御出来るので三角関数で求めるよりも感覚的に楽です。
これを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上に設定すると、こんな感じになりました。 指先だけだと味気ないけど、音と合わせるとこんな感じです。
|
と、ここまで下準備だけでこれだけかかってしまいました・・・・。 いよいよモーションデータを乗せていきたい・・・・・・・・・・・ってところで、次になってしまいました。 まだ続くんかい、、、 |
という訳で、次こそ、ギターを弾きたい・・・ 乞う、ご期待!!
|