LoginSignup
6
5

More than 5 years have passed since last update.

MMDモデルを使用したデスクトップユーティリティの開発 その3 三角形の表示

Last updated at Posted at 2016-09-28

前: その2
次: その4

今回やること

  1. 三角形の表示
  2. 四角形の表示
  3. とりあえずPMDモデルを表示してみる

今回のソース: 三角形, PMDモデル表示

三角形の表示

細かいことはこちらを参照してください。

前回でDirectXを使用する準備が整ったので、描画の基本となる三角形を表示します。
三角形にする理由は、MMDで使用されるモデルデータは、下の図のように三角形の集合で表されるからです。
MMDでモデルを表示し、「表示」→「ワイヤフレーム表示」を選択することで、確認できます。
(モデル: えと式チルノ)
cirno_wire.jpg

DirectXで三角形を表示するためには、以下の4つを生成しなければなりません。
1. 頂点や色などの情報を格納するBuffer
2. Bufferに格納されたデータの解釈方法を定義するInputLayout
3. 影や色合いなどをつけたり決めたりするEffect
4. 描画範囲を決めるViewport

さらに、Effectでの動作(どのように描画するか)を定義するために、HLSL言語を使います。
これの実行ファイルと同じフォルダに、以下のHLSL言語で書かれたエフェクトファイルを追加して実行します。

effect.fx
float4 myVertexShader(float4 position: SV_Position) : SV_Position {
    return position;
}

float4 myPixelShader() : SV_Target {
    return float4(1, 1, 1, 1);
}

technique10 myTechnique {
    pass myPass {
        SetVertexShader(CompileShader(vs_5_0, myVertexShader()));
        SetPixelShader(CompileShader(ps_5_0, myPixelShader()));
    }
}

成功すれば下の画像のようになるはずです。
描画領域は、中心を原点とし、x軸y軸共に-1.0~1.0の範囲です。
tri.png

Triangle.csの new Vector3(0, 0.5f, 0), new Vector3(0.5f, 0, 0), new Vector3(-0.5f, 0, 0) 部分で、頂点バッファに送る頂点の座標を定義しているので、ここを変えることで表示される三角形の形も変わります。
また、エフェクトファイルのピクセルシェーダ部分の返り値を変更することで、色を変えることもできます。
下図左: new Vector3(0, 0.5f, 0), new Vector3(0.5f, 0, 0), new Vector3(0, 0, 0)に変更
下図右: return float4(1, 0, 1, 1);に変更
tri_edit.pngtri_shader.png

四角形の表示

三角形が表示できれば、少しコードを変えることで四角形の表示が可能です。
Triangle.csの頂点バッファに送る頂点の座標を定義している部分にnew Vector3(0, 0.5f, 0), new Vector3(0.5f, 0, 0), new Vector3(0, -0.5f, 0)を加えます。
頂点の数が3から6に増えたので、device.ImmediateContext.Draw(3, 0);の3を6にして実行すると、下の図のようになります。
square.png

PMDモデルの読み込みと表示

PMDファイルから読み込んだ情報を元に、三角形の表示をたくさん行うことで、モデルの表示ができるはずです。

こちらを使って頂点座標を取得し、頂点バッファに送り、描画させるだけです。
頂点のリストはpmdLoader.Vertex.Select(x => x.Position).ToArray()で取得、
頂点の数はpmdLoader.Vertex.Lengthで取得できます。

描画する領域は、x軸y軸共に-1.0~1.0の範囲なので、何もせずに描画しようとすると、「足しか見えない」となるかもしれません。
今回は、PMDEditorでモデルを1/20に縮小したものを使用しています。

実際に読み込んで表示させた結果がこちらです。
cirno_vertonly.png

なんとなく羽のようなものがあるのは見えますが、変なことになってますね。
実は、読み込んだ頂点データだけではモデルを表示するのには不十分です。
三角形の三点の頂点を指定する頂点インデックス(面頂点)というものが必要になります。

おわりに

次回は頂点インデックスとカメラを扱います。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5