Adsense

2014年12月15日月曜日

MMD と SL ~ モーフ編

これはセカンドライフ技術系 ADVENT CALENDER 2014 12月15日向けの投稿になります。

モーフとは

今日はモーフの話しです。
モーフ(Morph)もしくはモーフィング(Morphing)と呼ばれる技術があります。ある形状から別の形状に徐々に変化させることを指します。
セカンドライフの標準アバターでもモーフィングの技術が採用されています。一番わかりやすいのは「シェイプスライダー」を使って体型を変えるアレです。また、ボイスチャットの LipSync の口をパクパクさせるアレもモーフです。笑う、怒る、ウィンクするなどの顔の表情もモーフです。(*1)

セカンドライフの LipSync 

3DCG のモデルの表面は「頂点」、「面」、「辺」から構成される「メッシュ」で表現されています。この頂点を移動させて形状変化を作っています。
LipSync も口の周りの頂点や、歯、舌の頂点が動いて「口パク」しているように見せています。
モーフとは頂点を移動させることによって形状変化することを指します。

Wireframe 表示での LipSync による頂点の動き

(*1) もしかすると、ここにあげたすべてをモーフといえない可能性があります。隠しボーン(Armature)があって、それを動かして形状変化しているものは、モーフと見た目は一緒で、頂点が移動しますが、厳密には頂点だけで形状変化をするモーフとは言えません。詳細に調べたわけではありませんが、組み込みアニメーションを使って形状変化しているものは隠しボーンのようなものを動かしてメッシュを追随させている可能性があるからです。

MikuMikuDance のモデルでもモーフが至るところで使われています。まばたきをする、ウィンクをする、笑う、など顔の表情から、キュンキュン眼鏡のサイズおよび場所の変更、照れを表現するテクスチャのサイズ・場所変更などなど。キュンキュン眼鏡や照れテクスチャはサイズを小さくして頭の中に入れ、モーフスライダーでサイズ・位置を変更して装着、表示しています。

PMX Editor の Transform ビューでモーフを確認

Blender でのモーフ 「ShapeKey」

MMD モデルを Blender にインポートする mmd_tools は MMD モデルに設定されているモーフも Shape Key としてインポートしてくれます。 Blender の Shape Key は MMD でいうところのモーフに相当します。


ShapeKey をざっくり説明すると、ベースとなるメッシュ オブジェクトの形状に「Basis」という名前の ShapeKey をつけ、頂点を移動させて変形させた(つまり、モデルを編集した)結果の形状を「Key 1」と設定すれば、Basis から Key 1 までの形状変化を 0 (basis) から 1.0 (key1) でスライダーを使って連続して変化させる機能です。大切なのは Basis と Key 1 は変化する頂点数に増減がないことです。

Shape Key がサポートされないセカンドライフ メッシュ

セカンドライフのメッシュでは、これら モーフ / Shape Key がサポートされていません。
私も暫くの間「あ~、じゃぁ、まばたきとか、できないじゃん」と思ってあきらめていました。MMD モデルをお借りして Rigged Mesh アバターは作っても表情ないと面白くない、、、

スカルプを使ったアニメヘッドの表情などはテクスチャアニメーションを切り替えることで表情を作ることができました。形状が変化する Mesh でテクスチャアニメーションでの実装はありません。

顔全体を透明・不透明で切り替えることも考えましたが、そうすると表情のバリエーションが限られてしまう、オブジェクトの数が表情の数だけ必要になる、など、ちょっと無理ゲー。。。

ところが 2012年の11月に、この動画を見て「!?」と衝撃が走りました。


SNOW RABBIT さんのところの NEA ちゃん(発売前)の動画ですが、3日間くらい「なに、なに、これ、なに使ってるの?」と悩み、Linden のサイトを探しましたが、モーフができるなんて一文もない、、、

で、口元をよくよく見ると、これ、どうも、透明・不透明の切り替えを行っているっぽい、、、と気が付くわけです。それも「口元」だけ。

そこで、気が付きました。顔のパーツを口元、目元などに分けて、それぞれに形状を変化させたオブジェクト(もしくは材質)合わせて構成すれば、単独で瞬きしたり、瞬きしながらクチパクしたりできる!

でも、問題が発生しました。顔をパーツで分割すると、パーツの境界線が見えてしまうのです。NEA ちゃんはそんな境界線見えてないのに、、、

分割したオブジェクトの境界線を消す - WELD EDGE NORMALS

境界線が見えてしまうのは、分割後、重なっている頂点の「法線の向き」が違うからです。


この法線の向きを均一に保ってくれる機能は Blender にはありませんが、あのツールにオプションとして実装されていたのです、、、そう Avastar です。それが Weld Edge Normals オプションです。

英語ですが、なぜ線がでるのか、どうやって直すのか、というのを Avastar の開発者の Gaia さんが YouTube で解説しています。



この分割線対応は「ばけもの屋」のこんじょさんも工夫して対応しています。
こんじょさんはある理由から Avastar を使うことができずに、独自で目立たなくする方法を見つけて、ブログで公開されています。

http://conjoh.blogspot.jp/2013/10/wyvern-5.html

あと、Nea ちゃんが発売されてすぐ購入して、Neaちゃんでビデオ作った関係で、その後スノラビのうさぎちゃんとお友達になったのですが、うさぎちゃんが使っているツールは Maya で、Maya にはこの法線を均一にする機能が最初からあるそうです。なので、Maya ユーザーは普通に消しているとのこと(泣



そして、もう一つ重要だったのは頂点をうまく選択し、分割すると Shape Key が有効のままオブジェクトを分割できることでした。

Shape Key 有効のままオブジェクト分割

これは試行錯誤するしかないのですが、分割するための頂点の選択に失敗すると Shape Key によるモーフでオブジェクトがぐちゃぐちゃになります。

Shape Key を有効にしたまま分割するための方法は私の経験上、分割するエリアの「材質名を変える」、そして「材質名で分割する」で分割する方法が良いようです。(それでもたまにぐちゃくちゃになる場合があります。その時は試行錯誤します。)

Shape Key を有効にしたままで目元や口元、眉といった「モーフで形状変化するパーツ」のベースとなるオブジェクトを作成して、そのオブジェクトから表情パーツを作成していきます。

この時「パラパラ漫画」の手法をとります。まばたきを表現するのであれば、まぶたを閉じるまでの中間の形状を入れます。口パクの場合は、「あ」「い」「う」「え」「お」などをそれぞれ別形状として保存します。この時、それぞれのオブジェクトの「材質名」はすべて連番などをつけて違う名前にします。最終的には1オブジェクトに統合するためです。

1つのオブジェクトに統合する際、そのオブジェクトは最大8つの材質(面)を持つことができます。顔は結果的に2つ以上の分割されたオブジェクトから構成されますが、そのままセカンドライフにアップすると、セカンドライフでは「リンク オブジェクト」とみなされます。セカンドライフ内のリンク解除で再度わけることが可能です。


アップしたオブジェクトにスクリプトを組み込むことで、パラパラ漫画による「疑似モーフ」を実装することができます。このお話はすでに以下のブログでご紹介しています。

まばたきを実装せよ
http://snumaw.blogspot.jp/2014/09/blog-post.html

モーフ/Shape Keyではありませんが、手の形状変化も同じ方法でそれぞれの形状変化後のパーツをつくり、1つのオブジェクトにまとめて、スクリプトで変化させます。

オブジェクトがちらつく

最後に、この透明・不透明切り替えのスクリプトをいれるパーツでセカンドライフへのアップロードの際のオプションで「ジョイント」を入れると、セカンドライフ内で変な挙動(ちらつきのような動き)を起こすことがあります。ジョイントは関節(ボーン)の位置を修正したパーツでは必須ですが、そうでなければジョイントを入れる必要はありません。ジョイントを入れないことでちらつきを防ぐことができました。


以上、セカンドライフ技術系 Advent Calender 2014 12/15 分でした。
みなさま、良いお年を~