【Unity4】Unityでスクリプトからスキンメッシュアニメーションのフルコントロールに挑戦、その1

仕事で必要になりそうな技術的調査として、タイトルのとおりUnityを使ってスクリプトからスキンメッシュアニメーションのフルコントロールの方法を調べていこうと思う。

スキンメッシュアニメーションのフルコントロールということで何を指しているかというと、ボーン操作(主に回転)によるキャラクターアニメーション+ブレンドシェイプによるフェイシャルアニメーションを指している。

今日調べた感じでは、どちらもスクリプトから自由にコントロールができそうなことがわかった。

たとえば、ボーンを動かしたい場合、原理としては下記の要領。

//ボーン名からボーンをゲームオブジェクトとして取得する
GameObject bone = GameObject.Find(boneName);

//ボーンを回転する。
bone.transform.localEulerAngles = boneRot;

Unity上でボーンは親子関係をもっているので、ボーンローカル座標で角度を指定してやれば、末端の子ボーンまでちゃんと追従してくれる。

問題はブレンドシェイプによるフェイシャルアニメーションのほうなんだけれども、これも調べてユニティちゃん使っていろいろ試してみた結果、スクリプトからコントロール可能なことがわかった。

これも、もっとも単純化した処理で記すと以下のようになる。

//BlenderやMayaで作成済みのブレンドシェイプを取得する(作成されていればFBXからインポートしたモデルの中に入っている)
//下記はユニティちゃんの例
GameObject target = GameObject.Find("EYE_DEF");

//ブレンドシェイプにあたるオブジェクトにはSkinnedMeshRendererコンポーネントが登録されているのでそれを取得する。
SkinnedMeshRenderer renderer = target.GetComponent<SkinnedMeshRenderer>();

//ブレンドしたいシェイプキーを指定してインデクスを取得する(下記はユニティちゃんの例)
int faceIndex = renderer.sharedMesh.GetBlendShapeIndex("blendShape2.EYE_SMILE1");

//ブレンドしたいウェイト0~100%を指定する。
float weight = 100;

//ブレンドしたいシェイプキーとウエイトを指定してブレンドシェイプする
renderer.SetBlendShapeWeight(faceIndex, weight);

以上を組み合わせれば、スクリプトからキャラクターアニメーションを自由にコントロールできると推測。

明日、試しに外部ファイルから読込んだモーションデータでユニティちゃんを動かしてみようと思う。

あと、問題はフレームレート。スクラッチでアニメーションさせた場合に著しくフレームレートが下がるようなら別の方法を考える必要がある。

4年前

コメントを残す

メールアドレスが公開されることはありません。