|
/*========================================================*/ <<<あゆしゃの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 |