幼生(おさなま)ちゃん -プロ生ちゃん幼女化-
プロ生ちゃん Advent Calendar 2016、4日目の記事となります。
やること
以前、むにむに教授の動画でユニティちゃんを幼くする、というものを見ました。
この動画を見た時点では、自力での実装は無理だなと思っていたのですが、
最近になってメッシュの頂点を直接移動させる技も覚えてきたので、プロ生ちゃんを対象に挑戦してみることにしました。
題して「幼生(おさなま)ちゃん」。
では早速やっていきたいと思います。
顔の実装
動画では、変化後のメッシュの頂点位置が片対数グラフみたいになっていました。
(ユニティちゃんの顔がやばい)
変化させたい座標軸の始点の座標を0、終点の座標を1として、途中の点の座標を全体の長さの割合として見立てた場合に、以下の数式で変化させたら上手く行くかな、と思ってまずはそれで実装してみました。
b=a^n
もともとの座標(割合)をa、変更後の座標(割合)をbとする
nは可変パラメータ
nが大きくなるほど、座標は始点側に近づいていく。
この実装でnを変化させてみた場合、このような動きになりました。
・キューブの座標に適用してみた場合
・メッシュに適用してみた場合
これが幼女化の第一歩です。
で、顔のメッシュに適用させてみた場合。
なるほど幼くなりました!
体の実装
これができれば、あとは体を小さくさせていくだけ。
体型変化についてはネットでググるといろいろとデータが出てくるので、今回はここのデータを参考にさせていただきました。
子供の年齢別・平均体重と平均身長・座高データ(年度別平均表):スクスクのっぽくん | :スクスクのっぽくんスクスクのっぽくん
サイトのデータを参考に、座高を上半身、身長-座高を下半身の変化と見立てて、変化させていきます。
顔と同じようにメッシュの頂点操作をまずは考えたのですが、腕の角度やら何やらを考えるのが大変だったので、ボーンのスケール変更でやってみることにしました。
親ボーンのスケールを変更すると、子ボーンも同様にスケールが変化しますが、この時親ボーンに対して子ボーンに角度がついてると偏った変形になります(Y方向を半分のスケールにしたいのに、子は親に対して垂直についているため、X方向が半分になってしまう、みたいな)。
なので、親ボーンのスケール変更→子ボーンのスケールを一旦戻す→子ボーンのスケール変更…みたいな感じで実装しました。
これに関しては、テラシュールブログさんを参考に、lossyScaleを利用して対応しています。
で、出来上がったのがこれ。
体の発育データを参考にしているため、変化は一様ではなく、15歳くらいからゆるやかになります。
(体の発育をデータ打ち込みしてるとき、なんか妙に変態な感じがしたんですが気のせいだろう。)
単純に全体のスケールを一様に小さくした場合との比較。
ただ小さくなっているだけの左とは違い、ちゃんと幼くなっている感じがします。
問題点
一連の実装法の場合、ポーズの変更をしなければとりあえず破綻しません。
ただ、ポーズを変えると妙な具合になります…。
(頭が歪んでいる…)
先述の、親ボーン・子ボーンの関係と三軸のバラバラスケーリングのせいです。
これに関しては、スケール(年齢)を変更する前にポーズを決定し、そのポーズでスケールを変更すればきれいになります。
なので、とりあえず今回は観賞用の幼女といった実装になりますでしょうか…。
この辺を上手くクリアして、揺れものの設定とかもサイズに即したものに変化するようにすれば、ゲームとかでも使えるかもしれません。
実際はこうやってモデル側にボーンモーフ・頂点モーフ的に組み込むのが楽そうな気がします。
以上、プロ生ちゃん幼女化でございました。
最後に年齢変化のシーンと今回作ったスクリプトを公開しておきます。
シーンはUnityPackage、スクリプトは単体で同梱しています。
プロ生ちゃんの3Dモデルは含んでおりませんので、プロ生ちゃんの3Dモデルを含むプロジェクトに本UnityPackageをインポートすると、動くはずです。
最新のUnity5.5でエクスポートしたので、Unity5.4以前にうまくインポートできるかは不明です。