スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Xファイルを読み込む時の注意点!

【リンク】 ◆解説系TOP◆

今日は、Xファイルを読み込むときの注意点を書こうと思います。

で、「Xファイルを読み込む」というのは
D3DXLoadMeshFromX関数を使う場合、と言う意味ではなく、
自力でXファイルの内部データを読み込む場合と言う意味です。

まず、プログラム内で 四角ポリゴンを表示させる方法を確認しましょう。

まず、頂点フォーマット構造体を定義します。

-----------------------------------------------------------------
    #define FVF_VERTEX   (D3DFVF_XYZ | D3DFVF_DIFFUSE) //頂点フォーマット
typedef struct
{ D3DXVECTOR3 p; // 頂点座標
DWORD diffuse; // 頂点色
} D3DVERTEX;
-----------------------------------------------------------------

次に、構造体の具体的な値を設定します。
---------------------------------------------------------
D3DVERTEX v[4];
v[0].p.x = -1;
v[0].p.y = 1;
v[0].p.z = 0;
v[0].diffuse = 0xffff0000; //赤
v[1].p.x = 1;
v[1].p.y = 1;
v[1].p.z = 0;
v[1].diffuse = 0xff00ff00; //緑
v[2].p.x = -1;
v[2].p.y = -1;
v[2].p.z = 0;
v[2].diffuse = 0xff0000ff; //青
v[3].p.x = 1;
v[3].p.y = -1;
v[3].p.z = 0;
v[3].diffuse = 0xffffffff; //白
---------------------------------------------------------

で、値を入れたらBeginScene()とEndScene();の間で描画。
-------------------------------------------------------------------------
if (SUCCEEDED(Device->BeginScene()))
{
Device->SetFVF(D3DFVF_VERTEX); //頂点フォーマット設定 
Device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,v,sizeof(D3DVERTEXCOR)); //描画
Device->EndScene();
}
-------------------------------------------------------------------------
※DrawPrimitiveUPの補足
左から順に、プリミティブタイプ三角ポリゴンの数値を入れた配列構造体の大きさ
です。
DPRIMITIVETYPE 列挙型←"プリミティブタイプ"の詳細

上記の例で言うと、こんな四角ポリゴンが表示されます。↓
四角ポリゴン
※本当はもっと綺麗に色が混ざるのですが、手書きなので察してください。
また、分かりやすく頂点を書いたので、実際は○は表示されません。

この図を見ても分かるように、D3DPT_TRIANGLESTRIPというプリミティブタイプは、
頂点をジグザグになぞるような順番 にしなければなりません。
(こんな感じ↓)
ジグザグ

で、Xファイルの頂点の順番は? というと、
上記の例で言うならば、
v[0]、v[1]、v[3]、v[2]という順番で定義されてます。
非ジグザグ
なんと、 ジグザグになっていない。

当然、この順番のまま描画しようとすると正常に描画されません。

なので、Xファイルから四角ポリゴンの情報を読み取るときは、
必ず描画前に、
3番目と4番目の要素をひっくり返してください。
そして、頂点以外の頂点に依存する情報があればそれも全てひっくり返してください。
(頂点に依存する情報は 法線頂点色UV座標の3つ・・・!)

※入れ替える時は、とりあえず構造体の配列に全ての情報を格納した後に、
構造体ごと入れ替えたほうが簡単&間違いにくいです。
【参考画像】
入れ替える

構造体の名前がMY_VERTEXだとすると、プログラムではこんな感じになります。
----------------------------------
MY_VERTEX temp;

temp = v[3];
v[3] = v[2];
v[2] = temp;

----------------------------------
構造体は、同じ型であれば代入が利くので、約3行でいっぺんに中身をひっくり返せます。

と言うわけで、四角ポリゴンの定義がある場合は、
3番目と4番目の要素をひっくり返さなければならないことに気をつけてください。
(三角ポリゴンの場合は特に問題なし)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。