Monochrome Model

Windows8.1 でハードディスク上の X-FILE(頂点座標+法線)を入力して描画します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

概説

  1. 今回はハードディスク上の任意のフォルダーに格納されている X-FILE を選択して描画するプログラムを作成します。
    Windwos8 の String^ は機能が低くて使い物になりません。
    そこで Windwos8 の String^ と STL の string を使い分けます。
  2. X-FILE 描画の基本は、次のページを参照して下さい。
  3. File Picker を使うとハードディスクに格納されている X-FILE に自由にアクセス出来ます。
    File Picker は DirectXPage.xaml にボタンを張り付けて起動します。
    X-FILE(text model) では、一般的に Shift_JIS でタイプされています。
    実行プログラムと同じフォルダーであれば Shift_JIS をそのまま入力出来るのですが、Picker では自動的に UTF-8 に変換して入力されます。
    このとき全角文字(漢字,かな)が含まれていると、エラーで中断します。
    必要ならば Text Editor の開発 を参照して UTF-8 に変換して下さい。
    DirectXPage.xaml で入力したテキストを X-FILE を描画する Sample3DSceneRenderer に渡します。
    String^ のリレーは Text Picker を参照して下さい。

X-FILE Viewew

  1. Sample3DSceneRenderer.h で定義されている X-FILE を解析する主な領域の説明です。
            //★ X-FILE の領域
            std::wstring    m_x;                //X-FILE TEXT
            vector<wstring> VT;                 //X-FILE を行で切り分け
            int             VT_size;            //VT の大きさ
            vector<DirectX::XMFLOAT3> m_pos;    // 頂点座標
            vector<DirectX::XMFLOAT3> m_norm;   // 法線ベクトル
            vector<unsigned short> m_idxP;      // 頂点 Index の並び(角付)
            vector<unsigned short> m_idxN;      // 法線 Index の並び(角付)
            vector<unsigned short> m_idxP3;     // 頂点 Index(3P) の並び
            vector<unsigned short> m_idxN3;     // 法線 Index(3P) の並び
            int     m_Line, m_Col, m_Top;
            wstring Word;
    
  2. Sample3DSceneRenderer.h で定義されている X-FILE 関係のメソッドと説明です。
            void SetText(Platform::String^ text);
            bool Search(String^ key);
            void Token();
            bool SetXMFLOAT3(String^ key, vector<DirectX::XMFLOAT3> *f3);
            bool SetShort(vector<unsigned short> *val);
            void PX_P3(vector<unsigned short> PX, vector<unsigned short> *P3);
            void ComputeNorm(VertexPosition *Vertices, int siz);
    
  3. このプログラムは DirectX9 などで自動生成される標準?の[頂点座標+法線]で構成するモデルを描画します。
    "Mesh " で始まる頂点座標と "MeshNormals " で始まる法線のみ処理しています。
    従って、色モデルやテクスチャを張り付けたモデルもモノクロで描画できることが期待できます。
  4. X-FILE 上で "Mesh " は次のように記述されています。
    Mesh {
     8;
     -0.5;0.5;0.5;,
     -0.5;0.5;-0.5;,
       ・・・
     -0.5;-0.5;-0.5;;
     12;
     3;1,0,2;,
       ・・・
     3;4,6,7;;
    }
    
  5. X-FILE 上で "MeshNormals " は次のように記述されています。
     MeshNormals {
      24;
      -0.000000;1.000000;0.000000;,
      -1.000000;0.000000;0.000000;,
        ・・・
      0.000000;-1.000000;0.000000;;
      6;
      4;0,3,6,9;,
        ・・・
      4;23,17,14,20;;
     }
    
  6. 頂点データの形式は[頂点座標+法線]なので、これに合わせて入力レイアウトとシェーダーを設定しなければなりません。
    入力レイアウトは次のようになります。
    static const D3D11_INPUT_ELEMENT_DESC vertexDesc [] =
    {   { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };
    
    シェーダーは 法線ベクトル を参照して下さい。
    X-FILE のポリゴンをそのまま描画すると、裏向きになるようです。
    カリングモードを反転(D3D11_CULL_FRONT)して描画しています。

超初心者のプログラム入門(DirectX Store)