Archive for 2008年3月17日

初音ミク XAML化計画

2008年3月17日

六角大王スーパーには、モーフィングという機能が付いていて、次のようにいろいろなモーフィングを登録することができる。

image

なんとキオ式ミクには驚くほどのモーフィングが登録されており、たとえばウィンクや、笑うなどがボタン一発でできるようになっている。恐るべし・・・。

image

この WPFデータを作ることはできるので、うまく使えば・・・あんなことや・・・こんなことが・・・

広告

初音ミク XAML化計画

2008年3月17日

いろいろ試してみたが、マテリアルの色がうまく乗らない。たとえば、髪飾りのピンクと目の色が同じマテリアルにマップされており、髪飾りをピンクにすると、白眼もピンクになってしまう。しょうがないので、六角上でさらに細かく分割しました。あまり細かくすると、ZAM 3D へのインポートが大変になるので、顔(目、上の歯、下の歯、口の中)、ヘッドセットや、髪飾りは、各1つにグループ化しました。imageようやくこれで ZAM 3D上で色が重ならずに、着色ができた。imageということで、現在のデータ(六角、ZAM 3D、Visual Studio 2005) をまとめてアップしておきます。http://uchukamen.com/WPF/MikuData/Miku%20Kio%20V5.zipあとは、ZAM 3D でアニメーション機能があるので、下の図のように時間ごとにパーツを動かして、アニメーションを作成する。アニメーションが作成できたところで、Export to XAML で Visual Studio 20005 のプロジェクトに書き出す。このときに、アニメーションは、OnLoaded の ストーリーボードとして作成されます。したがって、このままVS 2005 でコンパイル&実行してあげると、そのまま踊りだします。imageZAM 3Dでは、左下にある球体でトラックボールのようにオブジェクトの方向を変更することができ、かなり簡単にアニメーションを作成することができます。ただし、ZAM 3D の制限として、1つのアニメーションしか作成できないので、ちょっと不便です。複数のアニメーションを設定できると楽なんですけど・・・それから、ちょっとまえのデータですが、MikuMikuDance のスクリーンショットと実行ファイルをさらしておきますw。imageなお、うしろのビデオは、WMV を WPF でリアルタイムに変形&再生するように、Expression Blend で追加したものです。WPFすげー。それから、これはカメラのパン、ズーム、それから回転を行うデモ。http://uchukamen.com/WPF/MikuData/KioVS.exeimageimageimageコード的には、ズームはとても簡単。FieldOfView の値を変更してあげればよい。private void sliderZoom_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    this.Target_CameraOR20.FieldOfView = this.slider.Value;
}

マウスホィールを使うのであれば、マイナスとか大きすぎる場合のリミッターを入れて、たとえば次のようにすればよい。

private void ZAM3DViewport3D_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
    this.Target_CameraOR63.FieldOfView += e.Delta / 100;
    if (this.Target_CameraOR63.FieldOfView < 10)
        this.Target_CameraOR63.FieldOfView = 10;
    else if (this.Target_CameraOR63.FieldOfView > 100)
        this.Target_CameraOR63.FieldOfView = 100;
}

カメラの方向を変更するのは、こんな感じ。

private void SliderH_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Transform3DGroup tg = new Transform3DGroup();
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), this.SliderH.Value)));
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), this.SliderV.Value)));    this.Target_CameraOR20.Transform = tg;
}
private void SliderV_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Transform3DGroup tg = new Transform3DGroup();
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), this.SliderH.Value)));
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), this.SliderV.Value)));    this.Target_CameraOR20.Transform = tg;
}もう少しスマートにするには、ZAM 3D のトラックボールのようなインターフェースがよいでしょう。これはもう一人のオヤジから展開されると思いますw