2015年5月23日土曜日

【Tips】回転の補間について

CGで回転を補間する方法は一般的に2種類あります。
1つはオイラー補間。もう一つは球面線形補間です。

オイラー補間というのはキーとキーの間をFカーブの形状通り補間する方法で、XYZの数値で決まる姿勢を補間するものです。
さらに細かく言うと、XYZの順番、いわゆるRotationOrderが変わると同じキーフレームでも補間するとき動きが変わります。

上記図は全て同じキーフレームアニメーションですが、RotationOrderが違うことで動きが微妙に違っています。


RotationOrderというのは、X軸を計算して次にY軸を計算して最後にZ軸を計算するというように計算する順番を決めるものです。



次に球面線形補間です。これは英語で書くとSlerp。
簡単に言うと、クォータニオンを使って最短距離で補間するというものです。

MBでこのSlerpを使うのは簡単です。
Propertiesの中のQuaternionRotationにチェックいれるだけです。



この時に注意しないといけないことが、Slerpで補間する方法はいつでも最短距離で補間するということなので、キーフレームで2回転、3回転するように大きい値のキーを打っても、少ししか回転しないということがあります。

下図では、両方とも1回転半(540°)回転するようにキーフレームが打たれています。

青い方はキーフレーム通り1回転半(540°)回転していますが、
赤い方は0度から540度の姿勢の最短距離を補間。つまり、180度しか回転していません。


それぞれのメリット、デメリットを私の経験から書くと以下のようになります。
【オイラー補間のメリット】
・サイクルアニメーションを付けやすい
・XYZの値通りの姿勢になるので直感的

【オイラー補間のデメリット】
・がたついたアニメーションを修正しづらい

【Slerpのメリット】
・最短距離で補間されるので、意図してない動きになりづらい

【Slerpのデメリット】
・サイクルアニメーションが付けづらい
・何回転もするようなアニメーションがつけれない

それぞれの補間の仕方にはメリット、デメリットがあるので適材適所で選択していければ
アニメーションのコントロールがしやすくなる分、試行錯誤の時間が稼げると思います。

2015年3月17日火曜日

【Plug-In】シミュレーションをバージョンアップ

以前にIKハンドルをリアルタイムシミュレーションする記事を書きました。
そのプラグインの機能を幾つか追加してバージョンアップ。

追加した機能とは
・IKハンドルの間(骨の途中)でも円柱の衝突判定を出来るようにした
・ConeLimit(円錐の制限)を追加

今までは円柱との衝突判定はIKハンドル自体では出来ていたのですが
骨の間隔が広い場合IKハンドルの間を円柱が通ってしまうことがありました。

今回のバージョンアップで骨の途中でも衝突判定が出来るようにしたことで
骨の間隔が広い場合でも通りぬけないで衝突判定が出来ます。




シミュレーションがONになったら重力で鉛直方向に垂れてしまうのをCone Limit の機能を追加したことでデフォルトの形状を決めることが出来るようなります。


まだ紹介していな機能がありますのでまた機会をみつけて紹介していきたいと思います。

このプラグインは以下から購入できます。





2014年11月11日火曜日

【Tips】Perlin Noise Filter を使った体の揺らぎ

以前にPerlin Noise Filterを使ったカメラ揺れを紹介しましたが、今回はこのPerlin Noise Filterを使った別のTipsの紹介です。

今回はゲームモーションではなくてカットシーンでのアニメーションを想定しています。
手付けアニメーションでアクション系ではない会話系や何気ない日常の動作を作る時はかなり時間がかかります。しかもアニメーションのクオリティーの落とし所がピクサーやディズニーのようなカートゥーン系ではない、リアルスティックなモーキャプみたないの時は尚更時間がかかります。

さらに言うと何気ない日常の動作というのは意識してないけど普段よくみるアニメーションなので少しでも変だと違和感を感じたりするものです。

手付けで会話系のアニメーションがそんなに大変なら始めからモーションキャプチャーをとれば良いじゃんって話でまさにそうなんですが、予算や時間の関係でモーションキャプチャーが撮影出来なかったり、撮影出来たとしても取りこぼしがあった場合はやっぱりアニメーターやカットシーンアニメーターが作るしかないんですね。

そんな状況の場合、私はビデオカメラを使って自分で演技したものを撮影してそれをロトスコープします。ロトスコープはのやり方は撮影した動画をビューの後ろに張り付けて、ここに特別な方法はなく腰、足、胴、腕、頭に分けて根気よくキーフレームを打ってFカーブを調整するだけです。
コツとしてはフロントビューとサイドビューが同時に見えるようにするとおかしいところがすぐにわかるようになります。

ただ日常系のアニメーションの場合意外と静止しているようにみえて体が揺らいでいるものです。ロトスコープで撮影した動画では静止しているように見えても若干の体が揺らでいるのですが、動画中の人が静止しているからとCGキャラも静止させるととたんに凍りついたように見えるものです。

そこで動いてないような時でも人間の揺らぎを根気よくアニメーションを付けてあげればいいのですが時間がかかるので、ちょっとお手軽揺らぎとしてPerlin Noise Filterを使用して揺らぎを表現しましょうということです。

前置きが長くなってしまいましたが、ただ立っている人のアニメーションをPerlin Noise Filterを使って作成します。本当ならどういうシチュエーションでどんな感情で立っているかで演技が入ってきますが今回は揺らぎをフォーカスしますので割愛します。

地味なものですが、この微妙な揺らぎがあると無いとでは全く違うものになります。

IK/FKのReachは上半身は全て0%(全部FK制御の状態)にして
足と腰だけ100%にしている状態です。


この状態でIKリグのHipsEffectorにアニメーションレイヤーでresampleしたものにPerlinNoiseFilterを適用します。このときTransとRotを別々に適用しています。



そして腕のFKリグのRightArm、RightForeArm、LeftArm、LeftForeArmに同じようにアニメーションレイヤーでPerlin Noiseを適用します。

この時のポイントとしてパラメーターを変えてあげてそれぞれのFKのリグのFカーブが同じにならないようにすることです。またForeArmはZ軸のみで動いているのでX,Y軸はFカーブが0になるように調整しています。

パラメーターのサンプルとしてこんな感じでやっています。



日常系のアニメーションでモーションキャプチャーみたいな手付けアニメーションを作る時はこんな感じの体の揺らぎを入れてあげると意外としっくりくるものになります。
もちろん自分でキーを打っても揺らぎを作成しても全く問題無いですが、今回はPerlin Noise Filterで揺らぎを作成することでトライ&エラーや効率化が計れるものとなります。




2014年11月10日月曜日

MBでカットシーンを作るときのカメラデータ

MotionBuilderを使ってカットシーンを作っていざゲームエンジンにデータを組み込みましょうってなったときにゲームの仕様にもよるんですが、
僕がいままで経験した中で結構多かったのが、1つのカメラデータにまとめるということが多かった気がします。
この1つのカメラデータにまとめるというのは例えば、1カット目はCamera1で作り、2カット目はCamera2でつくり・・・・・・というように別々のカメラで各カットを作りそれをCameraSwitcherでつなげてみている状態の結果を1つのカメラとしてデータを作成するということです。
これを仮にマスターカメラという呼称にします。
マスターカメラのデータは各カットチェンジでは1フレームで切り替わるようになるデータになります。

MBのデフォルトの機能であるCameraSwitcherを右クリックPlotTo→<New Camera>で
マスターカメラのデータは作成できます。


ただこれの問題はベースレイヤーのアニメーションしかこないということです。

カメラのアニメーションを付ける時、ドリーやパンなどのベースのアニメーションはベースレイヤーにいれて手ぶれ感や微調整をする時には他のレイヤーにアニメーションを入れることが多いかと思います。
それらをプロットしてベースレイヤーに統合すればCameraSwitcherを右クリックPlotTo→<New Camera>でマスターカメラのデータは作成出来るのですが、ベースレイヤーにPlotしてしまうと後から調整するのがかなり困難になってしまいます。

わたしの経験上、ゲームエンジンに組み込んでみてから調整の作業は発生しやすいのでやっぱり作業中のレイヤー別のアニメーションはとっておきたいですね。

これまた無いなら作ろうの精神で、ベースレイヤにPlotせずともCameraSwitcherで表示されている状態のデータを出力出来るプラグインを作成しました。


単純にRelationコンストレインを使用してCameraSwitcherで表示されているカメラデータが出力されるのでマスターカメラにしたいカメラに繋ぐだけでの簡単構造のものです。

実機に組み込む時はこのマスターカメラをPlotするだけなので、各カットを作成しているカメラはPlotせずレイヤー別のアニメーションを保持出来るということです。

これで調整を含めたトライ&エラーをしやすく、作業効率が図れるものとなります。

2014年4月26日土曜日

【Tips】Mayaでキーフレームアニメーションからダイナミクスに切り替えるアニメーション

ここ最近Mayaを使って、吹っ飛ばされて死亡するアニメーションを作ってます。
キャラによっては武器などを持っているので、武器も地面にぶつかって転がるアニメーションをつけなくちゃいけないんですが、これが微妙にめんどくさいので地面にぶつかるまではキーフレームアニメーションで、地面にぶつかる寸前で物理シミュレーションに切り替える方法でアニメーションを付けています。

今回はそんなTipsです。

始めに地面にぶつかるまではキーフーレムアニメーションを作ります。
この例だと0~20f(30fps)で作っています。

次にダイナミクスを設定していきます。
まずは床のポリゴンにパッシブリジッドボディを割り当てます。


次にキーフレームアニメーションをつけたオブジェクトにアクティブリジッドボディを割り当てます


次にキーフレームアニメーションからダイナミクスに切り替わるようにキーを打ちます。
アクティブリジッドボディを割り当てたオブジェクトを選択し、rigidbodyのノードでアクティブのところに、この作例だと19fにオフ、20fにオンのキーを打ちます。

これで再生すると地面にぶつかってから跳ねた状態のまま上へ上昇して戻ってこない状態になっているのでフィールドの重力を割り当てます。
オブジェクトを選択した状態でフィールド→重力で割り当てます。


これで重力に従って動いてくれるはずですが、ダイナミクス(シミュレーション)は単位が重要なので、重力のマグニチュードがデフォルトだと9.8になっていますが、9.8という値は作業単位がメートルの場合に都合がいい値なのですが、この作例だと作業単位はセンチメールとになっていて9.8だと小さすぎるので980に設定しています。


地面を付け抜けてしまう場合はrigidSolverノードのコリジョン許容値を小さくしてみると
突きぬけを直すことが出来るようになります。


後はこれをベイクしてダイナミクスからキーフレームアニメーションに直してあげれば完了です!

簡単な手順で効率的なアニメーションを作れる方法だと思います。

2014年2月12日水曜日

【Tips】MotionBuilder のAudioで文字化けするのを直す方法

MotionBuilderで作業していて実務にはさほど影響は出ないのですが、気になるところがあります。
その気になるところというのが、MotionBuilderに音声を追加した時にAudioのセクションで文字化けが起きていることです。以下の図で黄色く囲った個所です。


この文字化けが起きているのはどうやら日本語(全角文字)が混じっているため起きているようです。この日本語文字はどこからきているかというと、画面の右下のスピーカーの設定からきています。

そのスピーカーのアイコンを右クリック → 音声デバイス で以下の画面が開きます。


表示されたデバイス(スピーカーだったりヘッドホン)の名称がそのままMoitonBuilderに読み込まれてるため文字化けが起きています。

これらの名称を日本語(全角文字)から英数字(半角文字)に変更すれば文字化けも直ります。
方法はそれぞれのアイコンの上で右クリック → プロパティで以下の画面が開きます。


黄色く囲ったところを半角の文字で例えば「speaker」などとしてあげてOKボタンを押します。

同様に録音タブのマイクやライン入力も英数字(半角文字)にしてあげます。



これでMotionbuilderを立ち上げなおすと文字化けしていたのが直ります。






おまけ◆
まだ上図では文字化けしている個所がありますが、これは下図の黄色く囲ったところの文字が表示されて文字化けしているみたいです。



2013年11月29日金曜日

【Script】キーフレームのオフセット

アニメーションを付けているとキーフレームをオフセット(時間をずらす)したいときがあります。
とくに、手付けアニメーションのとき等先端に行くにしたがって遅らせてアニメーションを作成したいときがあります。

そんな時は順番にキーフレームを選択してずらすやり方をします。
数が少なければこの方法でも大きな時間的なロスは少ないかと思いますが
骨階層が20とか100になった場合それを手作業でやるとなると相当時間がかかります。

これまた無いなら作ろうの精神で、キーフレームをオフセットするスクリプトを作成しました。



オブジェクトを選択して、オフセットしたいフレームを決めボタンを押下します。
 



このときオプションでALLにしてボタンを押すと選択したオブジェクトが同じフレームだけ
オフセットされます。



また、Eachにしてボタンを押下すると選択したオブジェクトごとにキーフレームがオフセットされます。



これで手付けアニメーションが少しでも効率的になって、トライアンドエラーの回数がこなせるようになるかと思います。

注意として、このスクリプトは選択しているオブジェクトの全てのキーフレームに対して実行するようになってます。



DownLoad
KeyFrameOffset.py
(MotionBuilder2012で動作確認済み)



2013年9月21日土曜日

【script】プロットの簡略化

MotionBuilderでキャラクターアニメーション作るときの方法の1つで、レイヤーを使ってアニメーションを調整する方法があります。そこでどんどんレイヤーを使って編集していくとどんどん複雑になっていくので一度骨にPlotして、またRigに戻してスッキリさせていく方法があるかと思います。

人によるかと思いますがMotionBuilderのアニメーション作業に慣れてくるとPlotの嵐になるので
いちいちPlotCharacterボタンを押して、どこにPlotするかのボタンを押して、オプションを確認してPlotボタンを押して一度骨にPlotして、さらにRig戻す時は同じようにPlotCharacterボタンを押して、どこにPlotするかのボタンを押して、オプションを確認してPlotボタン押すという、一度スッキリさせたいのにクリックする回数が6回あります。

時間を短縮すれば塵も積もればのことなので、作業効率が計れるかと思います。
そこでRig→Skeleton→RigというPlotの工程を1クリックで出来るスクリプトを作成しました。



このスクリプトを実行すると上図のウィンドウが表示されます。
キャラクターがRigで動いている時にCharaPlotボタンを押すとRig→Skeleton→RigというPlotの工程をしてくれます。

Select Plotボタンは選択しているオブジェクトをPlotしてくれます。
All Takesチェックボックスは読んで字のごとく、チェックがONのときは全てのテイクに対してPlotの工程をしてくれます。

ポイントとしては一度手動でPlotオプションを設定してからのほうがいいです。
このスクリプトでPlotされるときは現在設定されているPlotオプションで実行されます。

私はこのスクリプトを実作業で使って作業効率を計っています。

DownLoad
AutoPlotPlot.py
(MotionBuilder2012)

2013年7月29日月曜日

【Tips】MotionBuilderのRigidBodyシミュレーション

MotionBuilderには便利な機能として剛体の物理シミュレーション、いわゆるRigidBodyシミュレーションがあります。
MoitonBuilderのRigidBodyシミュレーションのメリットとしては、やはりリアルタイムで動いてくれるのでトライ&エラーが何回も出来るところです。
デメリットとしては、複雑な形状をシミュレーション出来ないことですが、プリミティブのオブジェクトを組み合わせて複雑な形状を近似させてあげれば問題ありません。

例えば下図のような形状を近似させることをやってみます。


複雑な形状を近似させる事とは、プリミティブの形状を複数使って形を似せるってことです。
今回はCylinderとCubeを使って、近似させてみました。(赤いワイヤーフレームの物です)




これらをまとめるNullを1つ出して、この形状の重心の位置にくるように配置します。


このNullが親になるようにプリミティブをペアレント化します。

次にRigidBodyをNullへドラッグ&ドロップしてアサインします。


RigidBodyのプロパティで、Correct Mass Center のチェックをオフにします。


ここまで設定すれば後はいつも通りのシミュレーションのやり方です。
適当なアニメーション付けて、RigidBodyのプロパティのActivationのPassiveとActiveにキーフレームを打ち、キーフレームアニメーションからRigidBodyシミュレーションへと変わるように設定します。


その結果が以下の動画です。


今回のRigidBodyシミュレーションのポイントとして、複数のプリミティブをNullでシミュレーションするということと、そのNullが形状の重心になるということです。
これを応用すれば、色々な形状をRigidBodyシミュレーションさせることが出来るようになります。

 

2013年5月21日火曜日

【PlugIn】 Perlin Noise Filter でお手軽カメラ揺れ

CGでハンディカメラっぽい揺れを作るときの1つの方法として、
注視点をランダムに動かして揺れを作る方法があります。

この時ランダムに動かすっていうのが結構面倒くさいのでプログラム的なアプローチで自動で出来ないかと色々考えます。

最初に思いつくのがrandom関数などで出力された値を使ってランダムに動かすことです。
試しに作ってみると、出力される値がバラバラすぎて規則性が無いものになります。

これだと1フレで瞬間移動しているような動きになりハンディカメラっぽい揺れに適さないです。



次にnoise関数を色々調べるとPerlinNoiseというのが具合が良さそうです。
このPerlinNoiseというのは簡単に言うと、山の起伏のように連続していながらもランダムな数値を返すもののようです。

Mayaではnoise関数というのがあって、この関数自体がPerlinNoiseとして実装されています。
MotionBuilderには勿論そういう機能がないので、いつもの事ながら無いなら作ろうの精神で
PerlinNoiseを加えるFilterを作りました。


選択した範囲にあるキーフレームに対して、PerlinNoiseで出力された値を加算します。
なのでカメラのアニメーションを作るときは、ベースレイヤーには普通にアニメーションを付けて、
別レイヤーで値が0のキーフレームでResampleしてある状態にこのPerlinNoiseフィルターをかけてカメラ揺れを再現するのが調整しやすいやり方だと思います。

DownLoad
Nagao_PerlinNoise_Filter.zip
(MotionBuilder2012 64bit版)