きっポグ

- kitposition's weblog -

【Unity】Unity-Chanは二度笑う~ユニティちゃん表情モーション研究~その2

f:id:kitposition:20160224234416p:plain

 すいません!写真は今日のテーマとは全く関係ありません。モデルの表面を黒くする実験をしたらあまりにかわいかったので載せてしまいましたw 現場からは以上です!

 …さ、さて前回は、ユニティちゃんの表情モーションが「ブレンドシェイプ」機能によって作られていること、ユニティちゃんにはこのブレンドシェイプのモーションを保存した表情アニメーションファイルが同梱されているため、ブレンドシェイプの知識がなくても表情の制御が可能なことをご紹介しました。
 とはいえ、ひたすら標準搭載の笑顔で微笑みかけてくるユニティちゃんはちょっとさびしい!ということで、今回はブレンドシェイプそのものを弄ってみたいと思います!

ブレンドシェイプはどこにある?

 前回も書いた通り、Unity自体にはブレンドシェイプを作成する機能はなく、モデルにあらかじめついているブレンドシェイプのウェイト(重み)を調整して形状を制御することになります。それでは、そのブレンドシェイプなるものはどこにあるのか?ユニティちゃんをシーンに置いて、ヒエラルキービューで展開してモデル構造を見ると…?

●ユニティちゃんのモデル構造の一部(左:大人、右:SD)

f:id:kitposition:20160224220226p:plain f:id:kitposition:20160224220238p:plain

  上図の赤枠で囲ったパーツ、どれでもいいのですが例えば大人ユニティちゃんのMTH_DEFを選択すると、インスペクタに次のようなプロパティが表示されます。

f:id:kitposition:20160224220855p:plain

 おお!いきなりありました!これは大人ユニティちゃんの口元の表情を演出する計11個のブレンドシェイプです。

 ブレンドシェイプは、モデルのメッシュ(外形)を構成するパーツにあるSkinned Mesh Rendererコンポーネントの中にあります。ただし、モデルを作成した人がブレンドシェイプを作った場合に限ります。例えば同じユニティちゃんでもスカートのパーツにはSkinned Mesh Rendererはありますが、その中にブレンドシェイプは入っていません。

 さて、今回はこの後ユニティちゃんのブレンドシェイプの構造についてもう少し掘り下げますが、その前にせっかくですからちょっと「ウェイト」とやらを弄っちゃいましょうw

 上図の各ブレンドシェイプ名の後ろにある数値が「ウェイト」で、初期設定では全て0、つまりブレンドシェイプの変形が適用されていない状態です。ここで例えば、ブレンドシェイプMTH_ANG2の数値欄に色々な数値を入力してみると…?

●MTH_ANG2のウェイトによる口元モーションの変化
(順にウェイト0→50→100)

f:id:kitposition:20160224223648p:plainf:id:kitposition:20160224223700p:plainf:id:kitposition:20160224223707p:plain

 何やら怒らせちゃったようです!でも、おかげで「ウェイト」の意味は分かりました。要するに「ウェイト=変形の度合い」って訳ですね。

 なお、Unityではウェイトは0が最低、100が最高(モデル作者が設定した変形が完全に適用された状態)で、その範囲を超える数値を入れてもそれ以上には変形しないようです*1

ユニティちゃんのブレンドシェイプを徹底調査!

 最初に掲載したヒエラルキービューの各パーツを選択してインスペクタでよく見るとわかりますが、ユニティちゃんのブレンドシェイプ(が入ったSkinned Mesh Rendererを持つパーツ)は以下のように組み込まれています。

  • 大人ユニティちゃん
    →「○○_DEF」という4つのパーツに、各々眉・目・まつ毛・口のブレンドシェイプが入っている
  • SDユニティちゃん
    →「_face」というパーツに、眉・目・口のブレンドシェイプが全て入っている

 それぞれ、各部位と用意されているブレンドシェイプをまとめると下の表の通りです。 

●大人ユニティちゃん ブレンドシェイプ一覧 

  BLW(眉)EYE(目)EL(まつ毛)MTH(口)
SMILE1(口を開けて笑う)
SMILE2(口を閉じて笑う)
SAP(驚く)*2
CNF(困惑)
ANG1(口をへの字にして怒る)
ANG2(口を開けて怒る)
DEF_C(目を閉じる)    
A(あの発音(口開け))      
I(いの発音(口一文字))      
U(うの発音(口つぼみ))      
E(えの発音(口横開け))      
O(おの発音(口縦開け))      

●SDユニティちゃん ブレンドシェイプ一覧

  BLW(眉)EYE(目)MTH(口)
blk(目を閉じる)   ○   
sml(口を閉じて笑う)
sml2(口を開けて笑う)    
ang(怒る)
sad(悲しむ)  
cnf(困惑)    
rlx(リラックス)  
sup(驚く)  
sco(叱る)    
dmg(被ダメージ)   ○   
str(一文字)    
drop(あんぐり)    
a(あの発音(口開け))    
i(いの発音(口一文字))    
u(うの発音(口つぼみ))    
e(えの発音(口横開け))    
o(おの発音(口縦開け))    
L(左下がりのニヤリ)    
R(右下がりのニヤリ)    

 後発のSDちゃんはまつ毛の動きが省略されているなど構造は単純ですが、表情はより豊かな印象を受けますね。

ウェイトを調節してオリジナルの表情をつくろう!

 ここまでたどり着けば、あとは各ブレンドシェイプのウェイトを弄りまくればどんどんユニティちゃんの表情は変わっていきます。もちろん、上の表の英語名や日本語はUnityの開発者さんや私が勝手につけただけで、SMILEだから笑う表情に使わなければならない、なんてことは全然ありません。また、同じ部位に設定されている複数のブレンドシェイプに一度にウェイトをかけてももちろんOKで、よりオリジナリティある表情を作ることができます。
 例えば、SDユニティちゃんの口元の複数のブレンドシェイプに大胆に値を入れるとこんな感じです。

f:id:kitposition:20160224231129p:plain f:id:kitposition:20160224231139p:plain

 標準搭載の表情よりも思いっきり口をあんぐり開けることができました!*3

 このように、ブレンドシェイプのウェイト調整によって、モデルを自由に変形させることができます。ただし、自由に、といってもあくまでモデルの作者が設定した範囲なので、例えばユニティちゃんに片目でウインクしてもらうとかはそもそもそういうブレンドシェイプが入っていないので無理です*4。その領域に挑みたい方は、ぜひMayaBlenderでブレンドシェイプ自体の作成に挑戦してみてはいかがでしょう(私にはちょっと無理です^^;)。

まとめ

 …さて、これで当面ユニティちゃんをぐりぐり弄って遊べるのですが、これだけではその場でフーン楽しいねーで終わりであり、自作ゲームに取り入れることはできません。ゲームの任意のタイミングで自作の表情を取らせるためには、前回紹介した標準の表情と同様、自作の表情モーションをアニメーションファイルとして保存し、適切に使用する必要があります。が、長くなったので、何とまたも次回に続いてしまいます!

ライセンス表記

ユニティちゃんライセンス

※記事中で使用したユニティちゃんモデルはユニティちゃんライセンス条項の元に提供されています。

*1:実は0~100を超えて変形させる方法も見つけたのですが、まともな方法なのかわからないし話が複雑になるので紹介しません。探してみてください。あとUE4にうまくインポートすると実は…w

*2:「驚く」ならSUPのような気がするのですがとにかく名称はSAPです。別の単語かな?

*3:ブレンドシェイプは結局のところメッシュを歪める操作なので、やりすぎると外形やテクスチャのデッサンが狂ってきます。実は全ブレンドシェイプを100にしてみたりもしたのですが、ブログ垢BAN間違いなしの恐ろしい生命体になったので止めました。良い子の皆さんは絶対にやっちゃダメですよ!

*4:もしかしたら私が知らないだけで何か方法があるようでしたら、ぜひ教えてください。