MikuMikuDance for XNA を IronPython から使う


予想外に簡単でした。

手順

1. MikuMikuDance for XNA を入手

をダウンロードして解凍する。そして Demo1 フォルダに入って MikuMikuDanceXNADemo.exe を実行してみる。実行できないならば XNA を使う環境が整っていないので適当にググって揃える。

あたりが動くなら大丈夫なはず。

2. IronPython 2.6.1 を入手

から IronPython 2.6.1 for .NET 2.0 SP1.msi をダウンロードしてインストールする。(IronPython 2.6.1 for .NET 4.0.msi ではないので注意)
スタートメニューに

というのが追加されるので実行してみる。XNA が動くならこちらも問題なく動くはず。

3. IronPython を Demo1 フォルダにコピー

その IronPython Console のあるフォルダ(普通は C:\Program Files\IronPython 2.6\ipy.exe)を開き、そこにあるファイルとフォルダを全て選択して Demo1 フォルダの中にコピーする。(本当は全部必要では無いけれども説明の簡略化のためご容赦を)

4. demo1.py を作る

以下の Python スクリプトをメモ帳なりにコピーして demo1.py という名前で文字コードを「UTF-8」にして保存する。

# -*- coding: utf-8 -*-
u"""MikuMikuDance for XNA Demo1

MikuMikuDance for XNA を IronPython 2.6 から使う。
"""
import clr
clr.AddReference('System')
clr.AddReference('System.Core')
clr.AddReference('Microsoft.Xna.Framework')
clr.AddReference('Microsoft.Xna.Framework.Game')
clr.AddReference('MikuMikuDanceXNA')

from System import *
from System.Collections.Generic import *
from System.Linq import *
from Microsoft.Xna.Framework import *
from Microsoft.Xna.Framework.Audio import *
from Microsoft.Xna.Framework.Content import *
from Microsoft.Xna.Framework.GamerServices import *
from Microsoft.Xna.Framework.Graphics import *
from Microsoft.Xna.Framework.Input import *
from Microsoft.Xna.Framework.Media import *
from Microsoft.Xna.Framework.Net import *
from Microsoft.Xna.Framework.Storage import *
from MikuMikuDance.XNA.Model import *
from MikuMikuDance.XNA import *
from MikuMikuDance.XNA.Motion import *
from MikuMikuDance.XNA.Model.ModelData import *


class Game1(Game):

    def __init__(self):
        self.Content.RootDirectory = 'Content'
        self.graphics = GraphicsDeviceManager(self)
        MikuMikuDanceXNA.InitialSetup(self, self.graphics, True)
        
    def Initialize(self):
        Game.Initialize(self)

    def LoadContent(self):
        self.mmd = MikuMikuDanceXNA(self)
        self.model = self.mmd.LoadModel('Miku', self, QuatTransform.Identity)
        self.motion = self.mmd.LoadMotion('TrueMyHeart')
        self.model.Player.SetMotion(0, self.motion, True)
        
    def UnloadContent(self):
        pass
    
    def Update(self, gameTime):
        if ((GamePad.GetState(PlayerIndex.One).Buttons.Back
             == ButtonState.Pressed) or
            Keyboard.GetState().IsKeyDown(Keys.Escape)):
            self.Exit()
        if (Keyboard.GetState().IsKeyDown(Keys.Enter) or
            GamePad.GetState(PlayerIndex.One).Buttons.A == ButtonState.Pressed):
            if not self.model.Player.IsPlay(0):
                self.model.Player.Reset(0)
                self.model.Player.Start(0, False)
        Game.Update(self, gameTime)

    def Draw(self, gameTime):
        self.graphics.GraphicsDevice.Clear(Color.CornflowerBlue)
        Game.Draw(self, gameTime)


if __name__ == '__main__':
    with Game1() as game:
        game.Run()
5. demo1.py を ipy.exe にドラッグアンドドロップ

これで実行されるはず。
失敗するなら

ipy.exe demo1.py
pause

てな感じのバッチファイルを作ってそこから実行するとエラーが表示されると思うので参考になるかも。



別のモデルやモーションを使う場合は XNA Game Studio と MikuMikuDance for XNA の開発環境を使って xnb ファイルに作らなくてはならないので面倒ですが、とりあえず再生するだけなら簡単ですね。

参考
IronPython で XNA - つちのこ、のこのこ。(はてな番外地)