2009年2月9日月曜日

ミクさんを表示してみた


もう何番煎じというレベルではないですが。しかしネタとしてはともかく、スケルトンが超整理されていて3D表示がWPFであるためにプログラミングという観点からはとっても可能性が広がっているのです。

さあ、データを気合入れて作って振り付けをアニメーションするのは職人に任せて、WPFを活かしたコードでのお気楽アニメーションをやってみるぞ!

ちなみに、データは日曜モデリングさまものです。というかデータの準備に、工学ナビの中の人のこのエントリを参考にしたというわけなんだけど。

mqoからxamlの3Dデータの準備の仕方のメモ。Identityを使用して、この記事を参考にした。

1.mqoをメタセコイアで読み込む。一度正方形を適当な大きさで作ってミクさんのフットプリントを確認しておく。今回のデータの場合、およそ100x100の正方形に収まるが、そのうち大半は髪の毛のボリュームなので、プログラムでスケール変換する時にmarkerwidth/50.0を係数とする。(markerwidthはARToolkitPlusの初期化時に渡すマーカのマーカ座標系における幅。)
2.Identityが吐くxamlにはエンコーディング指定がないので、日本語の材質名、物体名などは変更しておく。なお、今回のデータの場合、日本語の名前の材質は全て未使用(製作の過程で一時的に割り当てたっぽい)だったのでざっくり削除した。
3.Identityはインストール先のディレクトリのTexturesディレクトリからのみテクスチャファイルを探す。従って一度テクスチャファイルは全てコピーする。
4.Identityでmqoファイルを開く。ファイル-名前を付けて保存メニューを選択し、xamlをファイルの種類として選び、UV座標と法線にチェックを入れて保存する。この時オリジナルのテクスチャがあるディレクトリに出力すると改めてテクスチャファイルを生成しようとしてエラーが出るが別に問題はない。気になるなら別のディレクトリに出力する。
5.xamlファイルをがんばって書き換えて次のようにする。この時x:Nameは全てx:Keyに書き換える。

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<MaterialGroup x:Key="Material_miku_pose1_face" >
...
<Transform3DGroup x:Key="Transform_Character_miku_pose1_Character_0" >
...
<MeshGeometry3D x:Key="Geometry_miku_pose1_head_0" ... />
...
<Model3DGroup x:Key="ここにプログラムから参照する名前を入れる。今回はmiku_pose1とした">
...
</Model3DGroup>
</ResourceDictionary>
6:ソリューションにMIKUフォルダを作り、xamlとテクスチャファイルを全て入れる。プロパティで``ビルドアクション''を「コンテンツ」に、``出力ディレクトリにコピー''を「新しい場合はコピー」にする(注:xamlもコンパイルせずにこのようにした方が、ユーザがデータを入れ替えられて良いと思うのでそうした)。
7:Window1.xamlに
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MIKU/miku_pose1_resource.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
という記述を追加。これで、コードビハインドのWindow1クラス中で(Model3D)this.Resources["miku_pose1"]としてミクさんのモデルを参照できる。

0 件のコメント: