D言語でDXライブラリを使ってD言語くんを降臨させる

みなさん、今日は何の日かご存じですか？
そう、イエス・キリストがこの世に降誕したと言われるクリスマスです。
それに因んでクリスマスまでのカウントダウンカレンダーをAdvent（降臨） Calendarと呼ぶ風習がキリスト教国で出来ました。
そして、その風習がエンジニアに見つかっ<del>てしまっ</del>た結果、12月は色々なもの[[1]](http://qiita.com/advent-calendar/2013)[[2]](http://www.adventar.org/calendars)が降臨する月となりました。
この[D言語 Advent Calendar](http://qiita.com/advent-calendar/2013/dlang)もその一つです。
最終日となる今日は、D言語を書いてD言語くんを降臨させましょう

# D言語くんとは
D言語の公式マスコットです。
こんな形をしています。
![D](http://dlang.org/images/d3.png)

ちなみに日本語訳版サイトだとトゲトゲしい粗い画像になってます。
![D言語くん](http://www.kmonos.net/alang/d/images/d3.gif)

D言語くんはD Ver.0.x時代から存在しているので、おそらく後から本家の方がハイレゾに差し替わったんだと思います。
下のD言語くんが日本で広く知られている方のD言語くんの姿ですね。

# 三次元と化したD言語くん
D言語くんの二次元画像は昔から存在していましたが、
ポリゴンモデルは長い間ありませんでした。
ですが先週唐突に3Dモデルが誕生しました。
<blockquote class="twitter-tweet" lang="en"><p>ボーンを入れて、例のポーズ取らせて出来上がり！&#10;<a href="https://twitter.com/search?q=%23D&amp;src=hash">#D</a> 言語 <a href="http://t.co/8aTkaIMbbt">pic.twitter.com/8aTkaIMbbt</a></p>&mdash; ｲ五 (@fifth_tea) <a href="https://twitter.com/fifth_tea/statuses/413167874757246976">December 18, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
![D言語くん](https://pbs.twimg.com/media/Bbvd_jfCQAAuSH5.png)

モデルもMetasequoiaフォーマット(.mqo)とMiku Miku Dance用フォーマット(.pmd)で公開されています。[skydrive](https://skydrive.live.com/?cid=F7E340CFC6666A27&id=F7E340CFC6666A27%21109#cid=F7E340CFC6666A27&id=F7E340CFC6666A27%21574)

今回はこれを使ってD言語くんを降臨させます。

# 使用ライブラリ
## 最初の課題
[Derelict3](http://qiita.com/yasei_no_otoko/items/ae23b681a47d9a16f4c6)に含まれている[Open Asset Import Library(Assimp3)](http://assimp.sourceforge.net/index.html)と[GLFW3](http://www.glfw.org)を使って実装しようかと思いましたが、非常に大きな問題がありました。

1. .mqoと.pmdに対応していない  
なんとAssimp3は日本で圧倒的なアマチュア人気を誇るMetasequoiaとMiku Miku Danceに対応していません。  
Blender等でCOLLADAかFBXにエクスポートしてやれば使えますが、 **ただただ面倒くさい**（フォーマット変換が万能というわけでもないし）
2. Assimp3→GLFW3変換が面倒  
Assimp3は多くのモデルファイルを読み込めますが、読み込むだけでOpenGL等で表示するためには更に一手間蓋手間必要となります。  
そうなるとAssimp3とGLFW3のコード量が増えD言語の記事では無くなるので今回はやめにしました。  
**この記事を書こうと決めたこと自体たった5日前だし**

なので今回は

1. メタセコイア形式もMiku Miku Danceモデルも読める
2. 高機能APIなのでサンプルコードがシンプル

な[DXライブラリ](http://homepage2.nifty.com/natupaji/DxLib/)を使ってD言語くんを表示します。
**D言語はC言語とバイナリ互換なので** 、C言語製のライブラリをちゃっちゃと弄ればD言語プログラムの中で関数や変数や構造体を使うことも出来ます。
今回は[羽流布さん](http://dzware.com)が公開しているD言語版DXライブラリ3.11を用います。[vector](http://www.vector.co.jp/soft/win95/prog/se491774.html)

# コードを書く
初めてDXライブラリを書いたので良く分かってませんがこういうコードでMMDモデルを表示できるみたいです。
PMDファイルとVMDファイルは事前に用意したものを置いておけば[1行で読み込めるみたいです](http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R1N1)。

```d:main.d
module main;
import dx4d;
import string;
import std.file;

void main()
{
  int count, x, y;

  try
  {
    int mHandle;
    VECTOR Camera;
    dx_ChangeWindowMode(TRUE);
    
    if (dx_DxLib_Init() < 0 )
    {
      throw new Exception("DXライブラリの初期化に失敗");
    }

    if ((mHandle = dx_MV1LoadModel("data/Mr_D.pmd")) == -1)
    {
      throw new Exception("モデルの読み込みに失敗");
    }

    Camera.x = 0.0f;
    Camera.y = 10.0f;
    Camera.z = -20.0f;

    dx_SetBackgroundColor(0, 0, 255);
    dx_ClearDrawScreen();
    dx_SetCameraNearFar(1.0f, 150.0f);
    dx_SetCameraPositionAndTarget_UpVecY(Camera, dx_VGet(0.0f, 10.0f, 0.0f));

    if (dx_MV1AttachAnim(mHandle, 0, -1, FALSE) == -1)
    {
      throw new Exception("アニメーションの再生に失敗");
    }
    dx_MV1SetAttachAnimTime(mHandle, 0, 0.0f);

    if (dx_MV1DrawModel(mHandle) == -1)
    {
      throw new Exception("モデルの描画に失敗");
    }

    dx_WaitKey();
  }
  catch( Exception e )
  {
    std.file.write( "error.log", e.msg );
  }
  finally
  {
    dx_DxLib_End();
  }
}
```

できました。
![スクリーンショット 0025-12-25 22.35.13.png](https://qiita-image-store.s3.amazonaws.com/0/11166/85f95d3c-fa47-59cc-6bf3-5e4d7be96ffd.png)

くぅ～疲れましたw これにて完結です！

# まとめ
[DXライブラリってスゴイ。初めてそう思った。](http://dic.nicovideo.jp/id/3199661)