Title: MikuMikuDance for XNA利用及び開発に関するメモ
From: Wilfrem

このメモはMikuMikuDance for XNAの利用者及び開発者用に作られたものです。
利用者はこのメモを参考に利用をお願いします。
開発者はこのメモに自由に追記できます。これを利用して利用者に通知をしてください。

・使い方、リファレンス等
SourceForgeさんのMikuMikuDance for XNAに整備する予定ですが
ウィルフレムとしては分からないところは自分でソース読んでね(はあと)という感じでｗ
解り易いソースにしたつもりですので、頑張ってください。

・デモ用のプログラムに関する注意点
デモ用のプログラムではmikuモデルを読み込むコードがついていますが
モデルデータはまささんの著作物で、ミクはクリプトン社の著作物であるため、デモには入れていません
その為、デモはそのままでは動作しません。
各自本家MikuMikuDanceをダウンロードしていただき、付属しているモデルデータをお使いください。
なお、ミクそのものの利用に関してはクリプトン社のキャラクター利用のガイドライン(http://piapro.jp/license/character_guideline)を参考にしてください
ちなみに、デモのソースコードはライブラリと同じくMITライセンスです。
ライセンスに関しては最後を御覧下さい

・現在の実装状況
実装済み
・MMD用のモデルファイルの読み込み
・モーションファイルの読み込み
・アニメーション(補完ルーチン込)
・スフィアマップ(モデルのみ)
・ライト
・アクセサリの読み込み
・アンチエイリアス
・トゥーンレンダリング(エッジ及びトゥーンテクスチャ)
・アクセサリのスフィアマップ
・screen.bmpの置き換え機能
・影・セルフシャドウ
未実装・実装途中
・高速化
・XNA4.0への対応

ライブラリに文句がある人へ
・提案大歓迎！
・参加していじってみない？(人数が少ないとできることは限られますので……)

・MMD for XNAに関するメモ
一部のモーションファイルの読み込み不具合があるっぽい
ただ、一度MMDに読み込ませた上で、全フレームを改めて出力するとうまく直るっぽい

・Visual C# Express Editionを使用する方へ
ソリューションファイルを開くと「Solution Items」フォルダが開けません。とか出てきますが
無視して結構です。
(ソリューションルートにこのreadme.txtを入れて見れるようにしてあるのですが、Express版では開けないというのが理由で、ぶっちゃけて無害ｗ)

・XNAに関するメモ
ゲームループ中にヒープオブジェクトをnewしないこと
理由はXBox360のGCがマーク・アンド・スウィープ方式であるため。
この方式のGCは一定のメモリ数を消費するごとにGCが発生する。
そのため、ゲームループ中でオブジェクトをnewすると、GCが1フレームあたり1〜数回発生することになり、処理速度の問題が発生する
回避方法はオブジェクトプールを使用するか、structを利用してスタックオブジェクトにするか
unsafeコードのstackallocを利用するといい

・マテリアルパレットについて
(1.3aまでのデフォルト)
マテリアルパレットとはMMDXにおいてモデル描画を高速化するためのテクニックです。
複数のマテリアルをモデルの表示状態を変えずに少ないMeshMaterialにまとめることにより、XNAでの高速化を図ってます。
ただし、モデルの材質ごとの描画順番が変わってしまうため、半透明モデルが正しく表示されない問題があります。(レア様お立ち台で確認)
その場合はプロセッサの設定でマテリアルパレットを使用しないようにして下さい。

・パーツ中心Zソートについて(仮仕様)
材質ごとに中心点を算出し、それを元にZソートする方法です。
どうしても半透明が上手く表示されない場合にうまく行くかもしれない。
仮仕様なんでちゃんと動かないかも。

・大きなモデル及びアクセサリについて(レア様お立ち台、ゲキド街等)
デフォルトの設定ではFar Planeが小さな値になっているので全部表示できません。
カメラのFar Planeの位置調整を各自でお願いします。

・Demo7及びMMDBuilderの使用に関して
Demo7及びMMDBuilderはXNAのSDK下でしか動作しません(つまり配布用のXNAインストーラーでは動きません)
その点はご注意ください
注)MMDXWinFormsExpantion機能は配布用XNAでも動作します。

・物理演算について
Bullet Physics物理エンジンを移植したものを使用しています。
一部デモではシングルスレッドで動かしていますが、マルチスレッド推奨です。
マルチスレッドの方法はDemo8に記述しましたので、そちらを参照してください。
なお、物理演算は非常に重いです。なので、ゲームによっては演算を切ることも検討してください。

・モデルのボーン数について
現在のところボーン最大数は255までとなります

・モデルに付いてのメモ
MMDでエラーとならないけど、MMDXでエラーとなるモデルの中に
ごくまれにモデルの構造的にエラーとなっているものがあります。(しかも見た目的には問題ない)
こういう場合、MMDではエラーを吐かずに何もなかったかのように表示します。(表示優先のためと思われる)
しかし、MMDXでは厳密に判定しますので、エラーとなります(バグfix優先)

・[FAQ]アクセサリを表示するとアクセサリが表示されず、MMDモデルも消える
アクセサリに用いるxファイルのプロセッサが「モデル: XNA Framework」となっていないでしょうか？
プロセッサの設定を「MikuMikuDanceアクセサリ: MikuMikuDance for XNA」としないと
シェーダのパラメータ設定がうまくいかずに両方表示されなくなります

・[バグ]マルチスレッド時デバッグ用ワイヤーフレームが物理演算と競合する
物理演算が剛体に計算結果を適応するときに、デバッグ用ワイヤーフレーム描画が剛体情報を読みだそうとすると衝突する(かも)
今のところ、衝突で停止または異常動作は見られない。
排他がきちんとできていないのはデバッグ用ワイヤーフレームだけなので、切れば問題ない。
単に1変数を読みに行くのと書きに行くだけだから、衝突しないか？（ちょっとそこがよく分かってない)


・ライセンスについて
MITライセンスです。
English ver
Copyright (c) 2010 Wilfrem.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

However, MIT License is applied only for source code.
Multimedia files is not provided MIT License
If you use them, please contact creators.

Copyright (c) 2010 ウィルフレム

以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル（以下「ソフトウェア」）の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。
これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。

上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。

ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。
ここでいう保証とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるものではありません。 
作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。

なお、このライセンスはソースコードのみに適応されます。
マルチメディアファイルには適応されません。(あにまさ氏より提供して頂いた各種モデルなどが相当します)
もし、マルチメディアファイルを利用したい場合はそのファイルの製作者にお問い合わせください

更新履歴
v1.10a
モデルモーション
-IKのソルブ計算の調整。足回りの動作を改良
-AnimationPlayer設定方法の修正。
-AnimationPlayerクラスをModel-namespaceからMotion-namespaceに移行
-モーションのベイク機能実装。パイプラインベイクとリアルタイムベイクの2種が可能
-モーションの回転の補完を間違えてX軸の補完にしていたのを修正
-モーションのベジェ曲線を用いた補完計算のニュートン法にミスがあったため、安全装置も追加して修正
-ループ再生時のモーションを利用したモデル座標系修正機能追加
-モーションの最大フレーム数を弄れるようにした。
-表情計算の修正。
-GPU表情アニメーション計算ルーチンを追加(CPUが弱い環境(XBox360)等向け)

アクセサリ
-アクセサリのモデル及びアクセサリのWorldマトリックスをいじった際に正しい位置にきていない問題を修正
-VACによるアクセサリの固定に座標変換ミスがあったので修正

ライト、カメラ
-ライティングをMMDに近づけた(スポットライトだけ未実装)
-カメラ、ライトモーションの追加
-カメラにワールド座標系を追加。位置修正を可能に

その他
-処理の高速化(XBoxやWindowsVista-Core2Quad32bit3GBメモリならモデル10体でFPS30-40ぐらい)
-デモにマルチメディアファイル追加
-新たに4つのデモ追加

v1.2a
グラフィック
-トゥーンとエッジを実装
-アンチエイリアスを実装

モデルモーション
-膝IKが90度までしか動かない問題を修正
-IKの動作を改善(IK値2周り)

その他
-アンチエイリアスの追加に伴い、CheckDeviceの引数変更
-マテリアル分割を減らしてGPU命令発行数を削減(高速化)

v1.3a
モデル
-MMDProcessorに通常のModelProcessorにあるパラメータを一部追加
-エッジのアルファ値が0になっていた問題(見た目は変化なし)を修正
-モデルのアルファ値が無効になってた問題を修正
-1マテリアルにテクスチャとスフィアマップが同時指定されている際に読み込めない問題を修正
-.spaスフィアマップに対応していなかった問題を修正
-各モデルの中間ディレクトリ出力先をContent/extから各モデルのフォルダ/extに変更
-中間ディレクトリにおけるスフィアマップの中間ファイル名を修正
-スフィアマップがビットマップにしか対応していなかった問題を修正
-表情無しモデル及びダミーボーンが読み込めなかった問題を修正
-質感を調整して、MMDと同じ質感が出るようにした
-高速化のためにMMDModelとMMDAccessoryをDrawableGameComponentから継承せずにGameComponentから継承するように変更
-高速化のため、MikuMikuDanceXNAをDrawableGameComponentから継承するように変更
-高速化のためにシェーダを修正
-アンビエント色をあわせて1を超えるときに色がおかしくなる問題を修正
-エッジ無しモデルが読み込めない問題を修正

モーション
-一部のモーションのベイクが上手くいかない問題を修正

アクセサリ
-screen.bmp指定でスクリーン表示に対応
-アクセサリのスフィアマップに対応
-アンビエント色をあわせて1を超えるときに色がおかしくなる問題を修正

その他
-モデル、アクセサリの描画設定処理を別関数にして改良。描画設定処理を手動で呼ぶルーチンを作ったため、命令発行数を減らすことが出来るようになった。
-Lat式ミクが読めないバグは上記修正で解決
-カメラ、ライトマネージャのインターフェイスを作成。それに合わせてカメラ、ライト周りを修正
-BoneManagerクラスをList<Bones>から継承しないようにした(高速化のため)
-他、高速化のためにモデルデータ構造を修正
-IKSolverクラスの修正。入力がList<int>からushort[]に変更(高速化のため)
-MMDModelLibrary及びMMDMotionLibraryの座標系名称が変更(左右を逆に名付けていたため。データ値的な変化は無いが、定数名が変化)
-プログラムからボーンを弄るように、MMDModelにイベント追加

v1.4
モデル
-レア様お立ち台のシャドウが表示されない問題の修正
-マテリアルパレット機能をON/OFFできるようにした
-オリジナルトゥーンテクスチャがコンテントルート以外のフォルダに配置出来ない問題を修正
-モデルの描画を外部から描画出来るように再修正した
-パーツ中心Zソート法(仮)の追加
-AfterBoneManagerUpdateイベントでボーンのWorldTransformを弄ってもモデルが動かない問題を修正
-IKボーンの影響下ボーンが2系列以上あるモデルに対応(レア様他)

アクセサリ
-アクセサリの描画を外部からできるように再修正した

モーション
-BakeMotion用の.xmlファイルの型が変更になりました

その他
通常のWindowsアプリケーションからMMDX及びXNAを扱うヘルパーを用意しました。
ライブラリはMMDXWinFormsExpantionとなります。
また、MMDリソースのオンデマンドビルドも用意しました
ライブラリはMMDBuilderとなります。(こちらはXNA Game Studio SDK下でしか動作しません)
二つを使ったサンプルをDemo7にまとめましたのでぜひご覧下さい

v1.41
その他
-ソースコードをうっかり古い状態のを公開していた問題を修正。
-参照リンクが上手く張れていなかった問題を修正

モデル
-シャドウマップについて指摘があったので修正

モーション
-逆再生及びシーク機能を実装

v1.5
モデル
-モデルの座標指定がMatrix型からQuatTransformに変更。それに伴いWorld→Transform、コンストラクタ引数を変更
--(物理演算時、拡大縮小に関して特殊処理をする必要があるため、モデルの拡大縮小を廃止。要望があれば復活させますが。)

アクセサリ
-モデルに持たせている状態でのトランスフォームを取得できるようにした。

その他
-物理エンジンBulletのXNA移植版の作成
-Bulletの組み込み(但し、動作速度の都合上、XBox360ではFPS30に制限)
-DebugManager及びデバッグ系ユーティリティ追加

v1.51
モデル
-物理エンジンのjointパラメータの修正

モデルモーション
-複数のモーションを連続して再生するトラックの追加
-モーションスムーシング処理の追加
-基準ボーンによるモーション補正の追加

その他
-miscメモの追加
-ボーン最大数について追記
-コンテントパイプラインのモーションベイク時に関するトラップをデバッグビルド時にセット

v1.52
モデルモーション
-txt形式で簡単なモーションデータを記述できるようになりました。詳しくはMMDTextMotionImporterのコードを参照
-モーション終了時にイベントがコールされるようになった(上手くイベント登録出来ないバグを修正)
-モーションにUserDataを追加。

物理演算
-高速化(作業途中)
-MikuMikuDanceXNA作成時に地面なしを指定できるようになった。
-細かいバグ修正

その他
-Celeronマシンでベイク処理が失敗する処理を修正。
--ベイク時の高速化のためにマルチスレッドをしていたのだが、Celeronでレースコンディションが発生するようだ。今のところ原因不明
--代わりにベイク処理が最新CPUだと遅くなっています。
--原因が分からないので、とりあえず、シングルスレッド処理でしばらく置いておきます。

v1.53
モーション
-逆再生時にResetをしてもモーションの終端(逆再生時のモーション開始場所)に再生カーソルが移動しない問題を修正
-逆再生&非ループ時に最後まで再生した際、再生が終了しない問題を修正
-通常再生時に終了イベントが毎フレーム呼ばれる問題を修正

アクセサリ
-VACファイルを読み込むときに座標系の修正を忘れていた(プロセッサを追加しました)
-VACファイルで度がラジアンに変換されないバグを修正
-VACファイルでX回転とY回転を取り違えていたバグを修正(v1.53リポジトリ内の時のバグ)

その他
-TimeRulerのDrawOrderが正しく設定されていない問題を修正
-DebugCommandのコンソールが英語キーボードになっていたため、日本語キーボードと切り替えられるようにし、デフォルトを日本語キーボードとした

v1.54
モデル
-Visibleを変更してもモデルが消えないバグを修正。
-Disposeでモデルを破棄できるようにした。(内部参照を削除し、ユーザー側の参照削除でGC回収対象となる)

アクセサリ
-Visibleを変更してもアクセサリが消えないバグを修正。

モーション
-現在のモーションをすべて消す関数追加

その他
-TRACEオプションを外した際にビルドが通らない問題を修正

v1.60
モデル
-MMDReachModelの追加
-MMDModelがMMDHiDefModelに変更
-MMDModelインターフェイスの追加
--Reachの特徴
---スフィア・トゥーン・エッジ・シャドウマップ無し
---ボーン数制限(100本まで。4.0対応時に減るか？)
---メッシュ無しモデル非対応(ダミーボーンは読めません)
---シェーダ2.0対応(……のはず。2.0マシンを持ってないので未チェック)
---.pmd以外の形式のモデルと互換(XNAで通常読み込めるx, fbx等に対応しています)
---XNA4.0対応時にReachに対応予定。(WindowsPhone用シェーダに合わせて作成している)
---雑魚敵とか、機械とか、あまりビジュアル重視じゃなく、材質が少ないモデル向け
---ちなみに、アクセサリのReachはシャドウマップ使わない限りシェーダ2.0対応してるので、今のところ用意はしないつもり。(4.0移行時に用意するとは思うけど)

パイプライン
-MMDReachImporter, MMDReachProcessorを追加
--MMDReachProcessorはMMDReachImporter以外のモデルインポータにも対応。
-プロセッサの追加・名前変更
--今までのプロセッサ「MikuMikuDanceモデル(HiDef) : MikuMikuDance for XNA」
--MMDReachProcessor「MikuMikuDanceモデル(Reach) : MikuMikuDance for XNA」

モーション
-x, fbx等に付属しているモーション情報を読み込むことが可能に
--MMDReachProcessorで処理時に、アニメーション情報をMMDのモーションに変換する。
--MikuMikuDanceXNA.LoadModelにモーション情報出力用の引数を追加。モデル読み込み時にモーション情報を同時に読み込める。

v1.61
パイプライン
-MMDReachProcessorにアニメーション無しモデルを突っ込むとエラーとなる不具合を修正