メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.630) DX13 マップを描画  2006/01/13


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第630回 DX13 マップを描画
 発行    2006年1月13日(金曜日)
 発行数   約2500

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは、あゆしゃです。

 前回、緊急告知したこのページですが、

http://www.geocities.jp/jugongordie/

 ツマミちゃんがとてもかわいく、

 やわらか戦車は一家に1台という感じで、いい感じです。

 もう、歩くときは口ずさんで頭を離れません。


 ・・・さて。

 大晦日のK1の曙、やっぱり負けましたか。

 ボビーに負けては、もう引退しかないですよねぇ。

 というか、プライドに格下げ?

 もっとこう、エドモンド的な戦い方はできないものでしょうか?

{magclick}
/*========================================================*/
 今回のお題  << DX13 マップを描画 >>
/*========================================================*/

 DirectXに話を戻しましょう。

 ポリゴンが1枚表示できるようになりましたので、今度は、
ポリゴンをたくさんつなげて、マップを表示しましょう。

 とりあえず、32*32の大きさでマップを作りましょう。

 32*32ということは1024なので、

 頂点数は1024となります。

 ポリゴン数は31*31*2になりますから、1922です。

 1マスに2つ割り付けてるので*2、

 端にはポリゴンがないため32−1で31ということです。

 ポリゴン数と頂点数を、1と3から変更します。

// メッシュを作成
if( FAILED( D3DXCreateMeshFVF( 1922, 1024, // ポリゴン数、頂点数
    D3DXMESH_MANAGED, D3DVERTEX::FVF, pDev, &pMesh ) ) ) break;

 ということですね。

 頂点を設定するところも、とりあえずその数だけ埋めるように
とりあえずのループを組みましょう。

/*========================================================*/

// バッファを取得
D3DVERTEX* pVert; // 頂点情報
DWORD *pData; // ポリゴンの集合番号
WORD *pPoli; // 頂点の連番=ポリゴン
pMesh->LockVertexBuffer( D3DLOCK_DISCARD, ( void** )&pVert );
pMesh->LockAttributeBuffer( D3DLOCK_DISCARD, &pData );
pMesh->LockIndexBuffer( D3DLOCK_DISCARD, ( void** )&pPoli );
// マップデータを設定する
D3DVERTEX* pVert2 = pVert;
DWORD *pData2 = pData;
WORD *pPoli2 = pPoli;

32*32のループを入れます。

for( int i = 0; i < 32; i++ ) {
    for( int j = 0; j < 32; j++, pVert2++ ) {

原点を中心として、前後左右に配置します。

        float x = ( float )i - 16;
        float z = ( float )j - 16;
        // 頂点の法線ベクトル
        DLM_SET_NXYZ( *pVert2, 0, 1.0f, 0 );
        // 頂点の座標
        DLM_SET_XYZ( *pVert2, x, 0, z );

1マスにつき、ポリゴンを2枚分設定します。

        if( i < 31 && j < 31 ) {
            int l = ( i * 31 + j ) * 2;
            // ポリゴンにマテリアル番号を設定
            pData2[ 0 ] = 0;
            pData2[ 1 ] = 0;
            // ポリゴンに頂点を時計回りに関連付ける
            int k = i * 32 + j;

頂点番号が
01
23
という場合、0→1→3 と 0→3→2 に割り振ります。

            DLM_SET_012( pPoli2 + 0, k, k + 1, k + 32 + 1 );
            DLM_SET_012( pPoli2 + 3, k, k + 32 + 1, k + 32 );
            pData2 += 2;
            pPoli2 += 6;
        }
    }
}

/*========================================================*/

 これを実装した結果です。

http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060113.png

 ・・・カメラ位置が近すぎるので、少し遠ざけましょう。

修正前
// カメラの位置を設定
D3DXVECTOR3 ViewFrom( 0, 100, -20 ); // カメラの位置

修正後
D3DXVECTOR3 ViewFrom( 0, 100, -100 ); // カメラの位置

http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060113_2.png

 全体が見渡せるようになりましたが、

 法線ベクトルが同じなので、単なる緑色しか表示されません。

 法線ベクトルをランダムにしてみましょう。

 rand関数の最大値は32767なので、最大値で1.0弱と
なるように、32768で割ります。

        // 頂点の法線ベクトル
        DLM_SET_NXYZ( *pVert2, 0, ( float )rand() / 32768, 0 );

http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060113_3.png

 おぉぅ、なかなかかっこよくなりました。

/*========================================================*/

 今回のソースです。

http://ayusya.hp.infoseek.co.jp/Source/DX9Sample_060113.cpp

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 今後の予定です。

 1月 9日月曜日 第628回 2006年 済
 1月11日水曜日 第629回 マグクリック報告 済
 1月13日金曜日 第630回 DX13 マップを描画 済
 1月16日月曜日 第631回 DX14 回転演算
 1月18日水曜日 第632回 DX15 マップを移動する
 1月20日金曜日 第633回 DX16 太陽を回す
 1月23日月曜日 第634回 乱数生成アルゴリズム

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は1月16日(月曜日)に、第631回をお送りします。
 お題は「DX14 回転演算」

 マップを表示したからには、その中を移動したいですよね。

 それにはまず、回転演算を克服しなければなりません。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
ママが人間で〜 なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。