Direct3Dの解説 3 ポリゴンの移動
2までの説明でわかった人はなんとなくわかったと思いますが、ポリゴンをどうやっていいどうさせるか、試してみます。コードは簡単で、早い話がポリゴンの頂点の座標を変更してやれば良いだけです。以下のようにコードを追加&編集します。頂点座標は、それぞれ変数としてべつにもたせます。このコードは今回しか使わないので別なプロジェクトにコピーしてテストしてください。変更するのは青い部分です。
float sx1 = 160;
float sy1 = 50;
float sx2 = 240;
float sy2 = 200;
float sx3 = 120;
float sy4 = 240;
/*-------------------------------------------
ウィンドウ処理
--------------------------------------------*/
LRESULT CALLBACK MainWndProc(HWND hWnd,UINT msg,UINT wParam,LONG lParam)
{
switch(msg){
case WM_KEYDOWN:
switch(wParam){
case VK_ESCAPE:
case VK_F12:
DestroyWindow(hWnd);
break;
case VK_UP:
sy1--;
sy2--;
sy3--;
break;
case VK_DOWN:
sy1++;
sy2++;
sy3++;
break;
case VK_RIGHT:
sx1++;
sx2++;
sx3++;
break;
case VK_LEFT:
sx1--;
sx2--;
sx3--;
break;
default:
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0L;
}
/*--------------------------------------------
アイドル時の処理
--------------------------------------------*/
int AppIdle(void)
{
D3DTLVERTEX v[3];
DDBLTFX fx;
// 背景を塗りつぶす
ZeroMemory(&fx,sizeof(fx));
fx.dwSize = sizeof(fx);
pBackBuffer->Blt(NULL,NULL,NULL,DDBLT_WAIT | DDBLT_COLORFILL,&fx);
// ドライバ名などの文字を書き込む
HDC hdc;
char Data[256];
wsprintf(Data, "%s, [%s]", szDevice, szDDDeviceName);
if(pBackBuffer->GetDC(&hdc) == DD_OK){
TextOut(hdc,0,0,Data,strlen(Data));
pBackBuffer->ReleaseDC(hdc);
}
// DrawPrimitiveを使ってポリゴンを描画する
pD3DDevice->BeginScene();
v[0].sx = sx1;
v[0].sy = sy1;
v[0].sz = 0;
v[0].rhw = 1;
v[0].color = RGB_MAKE(255,0,0);
v[0].specular = D3DRGB(0,0,0);
v[0].tu = 0;
v[0].tv = 0;
v[1].sx = sx2;
v[1].sy = sy2;
v[1].sz = 0;
v[1].rhw = 1;
v[1].color = RGB_MAKE(0,255,0);
v[1].specular = D3DRGB(0,0,0);
v[1].tu = 0;
v[1].tv = 0;
v[2].sx = sx3;
v[2].sy = sy3;
v[2].sz = 0;
v[2].rhw = 1;
v[2].color = RGB_MAKE(0,0,255);
v[2].specular = D3DRGB(0,0,0);
v[2].tu = 0;
v[2].tv = 0;
実行してみましょう。予想通りポリゴンが上下左右に動きましたか?
上のコードではそれぞれ同じ向きに座標を変更したので移動しましたが、それぞれ違う方向に座標を移動すると、ポリゴンが変形します。ためしに以下のように変更して見てください。醜いので赤部分にしました。
case VK_UP:
sy1++;
sy2--;
sy3--;
break;
case VK_DOWN:
sy1--;
sy2++;
sy3++;
break;
case VK_RIGHT:
ポリゴンが変形しましたか?
つまりこのポリゴンをたくさん描画して頂点の座標を変更してやると、3Dのものを表示できるというわけですね。
実際には回転したり変形するのは3次元のなかでやらなければならないのでこれほど簡単ではありませんが。
でもできそうな気がしてきたでしょ?