2009年4月18日土曜日

XNAで初音ミクを動かしたい!

なんか、突然そんな気分になりました。でもって思いつきで作業すること数時間。
鏡音リンのモデルを表示することができましたー。もう疲れた・・・今日はここまでだ


作業工程を忘れそうなのでメモしておく。
最初にして最大の問題点・・・モデルデータが無い。特にコレ使って公開する気も無いのでネットで誰かが作ってるデータを拝借しようとうろうろしてみたら、有名な「ミクミクダンス」ってソフトがあることに気づいた。そんなわけでミクミクダンスに収録されてるモデルデータならクォリティも高いし骨も入ってるはずだから楽しいに違いない!というわけで、このデータをXNAで表示させてみることに。
まずはMikuMikuDance (Multi-Model Edition)をダウンロード。いろんなモデルがあった方が楽しいよね!
データ形式を調べると .pmd という形式らしい。こいつをXNAで使える形式にコンバートしてやればOKのはずなので、コンバータを探す。
PMDEditorなるものがあるらしい。早速ダウンロードっとおもいきやどうも最近アップローダーがお亡くなりになったらしくファイルがゲットできないorz
ミラーを探してようやくちょっと古いバージョンを動かしてみるも、なんか初期化エラーとかで起動しない・・・DirectX 9.0cと.net Framework2.0が必要らしいがちゃんと入れてるつもりなんだがなぁ
やっぱりVista64Bitは色々問題か・・・あきらめて別のコンバートパスを探す。
PMDImporterを使ってメタセコイヤ経由で.xに挑戦。フリーのメタセコイヤを落としてプラグインはどこに置くのかな~と調べてみると、シェアウェア版のメタセコイヤしかプラグイン機能を使えないと発覚・・・またも断念。
結局BlenderにPMDImpoterを使ってそこから.fbx形式で吐き出すという方式に落ち着いた。
まずはBlenderをダウンロード。プラグインの動作に必要なPythonをインストール。最初は最新版のVer2.6.2を入れたがうまく認識されず、1つ古い2.5.4をインストールした。
次に、Blender用PMDImpoertプラグインのインストール。これもまた例のアップローダーが死亡してて仕方なくミラーを探してきた。.pyファイルが3つほど入ってたのでコレをscriptフォルダに放り込む。scriptフォルダはどうもOSによって場所が違うらしい・・・がBlenderでファイルを開くって選ぶと表示されるデフォルトのパスのところの相対パス付近にあるのでその辺をさがせばOK
BlenderのWindowでScriptWindowを開いてメニューのアップデートってやるとImport可能なリストが更新される。ミクミクダンスのフォルダにある.pmdファイルを選択。ここであらかじめファイル名は英語に変えておいてそれをインポート(どうもBlenderが英語のソフトなせいか日本語と相性が悪い)
あと、インポータのマテリアル数対応が16とからしく、初音ミクはインポートできなかった。仕方ないので鏡音リンをインポート。
そしてExport。最初は.xファイルで吐き出したが何故かマテリアル情報が消えてしまって?真っ黒になってしまった。仕方ないので.fbx形式で吐き出し。
吐き出されたファイルをVisualStudioのContentフォルダに放り込んでやると勝手に認識してくれる。

    // 定義
    //モデル変数を追加
    Model model;

    //LoadContent()
    //モデルデータをロード
    model = Content.Load("rin");

    //Draw()
    // キャラクタ描画コード
    // spriteBatchを使うとDepthBufferEnable = false になるので、3D描画前は毎回フラグを設定
    GraphicsDevice.RenderState.DepthBufferEnable = true;
    // デフォルトの設定をbasicEffectに設定しておく。この辺はなんかしっくりこない
    basicEffect.World = Matrix.CreateTranslation(0.0f, -10.0f, 0.0f) * Matrix.CreateRotationX(pos.Y * 0.01f) * Matrix.CreateRotationY(pos.X * 0.01f);
    basicEffect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, -30.0f), new Vector3(0.0f, 0.0f, 0.0f), Vector3.Up);
    basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView
                (MathHelper.ToRadians(45),
                GraphicsDevice.Viewport.AspectRatio,
                0.1f, 100.0f);
   //各メッシュに対してBasicEffectの設定とDrawの呼び出し(マテリアルごと?)
    foreach (var item in model.Meshes)
    {
        //BasicEffectで受ける 各種設定はbasicEffectの設定をコピってやれば計算が楽?
        foreach (BasicEffect effect in item.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = basicEffect.World;
            effect.View = basicEffect.View;
            effect.Projection = basicEffect.Projection;
        }
        item.Draw();
    }

なんかどっと疲れた・・・なにやってんだか

0 件のコメント: