題名の通り、ミクさんと散歩するために、
MMDforUnityで読み込んだモデルにモーションをつける
モーションデータ(VMDファイル)を変換・読み込ませる
まず、↓のサイトからモーションデータをダウンロード。
今回は【MMD】歩行モーション 配布編【みんなでおさんぽ】を選択。
http://www6.atwiki.jp/vpvpwiki/pages/389.html#id_2379dbb7
上メニューの[Plugins>MMD Loader>VMD Loader]から、
前回PMDを変換した際に生成されたPrefabと、
使用するVMDファイルを選択してコンバート。
そして、出来たファイルをInspecterのAnimationの所に入れると…
動いた! が、足が動かない…
MMDIKBakerを使ってみる
原因は足のIKらしいので、MMDIKBakerを使ってIKを取り除くことに
http://terasur.blog.fc2.com/blog-entry-94.html
まず、MMDIKBaker.slnをVS2010で開いてソリューションのビルドを実行
エラーが一つ出てますが、XNA関係らしいのでスルー。
Debugフォルダに変換したいファイルをリネームして、exeを実行。
上のサイトにもありますが、実行中などの表示がされないので、
信じて数分待ちます。(「警告:ファイル末尾移行に不明データ」って出てたけど大丈夫かな…)
そして、生成されたVMDファイルを先程と同じ順序でAnimationに登録すると…
キタ━━━━(゚∀゚)━━━━!!
これでお散歩でき…あれ?
あとは、てきとーに自分(カメラ)の方に向いて移動するスクリプトを組んで入れて完成だ!
ムーンウォーク!?
どうやら、MMDの座標系とUniyの座標系が違うせいらしい。よく見りゃ確かにそうだ。
http://d.hatena.ne.jp/acey014/20130628/1372425393
せっかくなので、スクリプトで何とかしてみる
void Update () { if( null != target ){ // ターゲットの位置取得 var targetPosition = target.gameObject.transform.position; targetPosition.y = this.transform.position.y; // 浮かないように // 座標系をUnityにあわせる this.transform.Rotate( 0, 180, 0 ); // ターゲットの方に向かせる this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation( targetPosition - this.transform.position ), 0.07f); // 座標系をMMDに戻す this.transform.Rotate( 0, 180, 0 ); // 前進 this.transform.position += (Quaternion.Euler( 0, 180, 0 ) * this.transform.forward ) * speed; } }
う、うん…まあ、こうなるよね…
上の参考サイトを元に「MMDFormat.cs」を弄ろうと思ったけど、
該当箇所が見当たらない(更新で別のファイルに移った?)ので、
しばらくはこの糞コードで動かすことに決定。
ようやくお散歩でき…た…あれ?
修正が終わり、実行した所…
キタ━━━━(゚∀゚)━━━━!!
Σ(||゚Д゚)ヒィィィィ
どうやら、MMDの剛体とUnityの剛体の仕様が異なるせいで
当たりが上手くいっていない + モデルの各パーツの位置関係がグチャグチャになるみたい
次は、当たりをどうにかする所からかな~
余談ですが、WebPlayerで公開しようと思ったら、
htmlを開くとエラーメッセージが表示されるだけで
肝心のゲーム部分は表示されず…OculusRift部分が引っかかってるのかな?