DirectXの板ポリゴンの回転のさせかたについて
Posted: 2010年3月09日(火) 23:11
はじめまして、天空橋と申します。
DirectXの板ポリゴンの回転のさせかたについて質問があります。
2DシューティングゲームをVisual C++2008とDirectXにて作成しようとしています。
そこで、テクスチャを読み込んで、板状のポリゴンに貼り付けて、表示することはできました。
次に、2D描画のスーパーファミコン的な基本として拡大、縮小、回転機能を実装しようとしたのですが、
拡大、縮小は出来たのですが、どうにも、回転だけ巧くできませんでした。
ソースは、以下のようになっています。
///////////////////////////////// ここから
D3DXMATRIX rot;
D3DXMatrixRotationZ(&rot, roll); //回転
// モデル座標
D3DXVECTOR4 vect[4];
vect[0].x = -1; vect[0].y = -1; vect[0].z = 0;
vect[1].x = 1; vect[1].y = -1; vect[1].z = 0;
vect[2].x = -1; vect[2].y = 1; vect[2].z = 0;
vect[3].x = 1; vect[3].y = 1; vect[3].z = 0;
// 回転用の行列を積算
for (int i = 0; i < 4; i++) {
vect.x = (vect.x * rot._11) + (vect.y * rot._21) + (vect.z * rot._31) + rot._41;
vect.y = (vect.x * rot._12) + (vect.y * rot._22) + (vect.z * rot._32) + rot._42;
vect.z = (vect.x * rot._13) + (vect[i].y * rot._23) + (vect[i].z * rot._33) + rot._43;
vect[i].w = (vect[i].x * rot._14) + (vect[i].y * rot._24) + (vect[i].z * rot._34) + rot._44;
}
// 書き込む頂点情報の作成
Vertex v[6] = {
{vect[0].x, vect[0].y, vect[0].z, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 0},
{vect[1].x, vect[1].y, vect[1].z, D3DCOLOR_ARGB(255, 255, 255, 255), 1, 0},
{vect[2].x, vect[2].y, vect[2].z, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 1},
{vect[3].x, vect[3].y, vect[3].z, D3DCOLOR_ARGB(255, 255, 255, 255), 1, 1},
{vect[2].x, vect[2].y, vect[2].z, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 1},
{vect[1].x, vect[1].y, vect[1].z, D3DCOLOR_ARGB(255, 255, 255, 255), 1, 0},
};
pD3DDevice->SetTexture(0, texture);
pD3DDevice->SetFVF(D3DFVF_VERTEX);
pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
// World 座標の設定
D3DXMatrixIdentity(&matWorld);
pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
//View 座標の設定
D3DXMatrixIdentity(&matView);
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0, 0, 30), &D3DXVECTOR3(0, 0, 0), &D3DXVECTOR3(0, -1, 0));
pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
//透視変換の設定
D3DXMatrixIdentity(&matProj);
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI / 4, 800.0f / 600.0f, 0.0f, 100.0f);
pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, v, sizeof(Vertex));
///////////////////////////////// ここまで
なお、上記のソースは、World座標を自前で、計算しているつもりです。
DirectXの場合、DrawPrimitiveの回数を極力減らしたほうが良いと本に書いてありました。
そこで、シューティングゲームとして、弾を沢山描画することになるので、描画処理を速くする必要があると思い、
回転させる都度SetTransform関数にてWorld座標を計算すると、その都度、DrawPrimitiveをするため、
遅くなると思い、上記のようにしているつもりです。
なお、上記の回転処理をSetTransformで計算すると期待通りにきれいな回転をします。
より、詳細なソースと、SetTransformを用いて正しく回転するソース添付いたします。
やりたいことは、基本的な描画機能を高速におこなうことです。
なお、C言語は読むのに困らない程度は理解しているが、書くのはあまり得意ではありません。
また、今回のソースは微妙にC++になっていたりします。
DirectXは、ほぼ未経験となります。
皆様、ご教授おねがいいたします。
DirectXの板ポリゴンの回転のさせかたについて質問があります。
2DシューティングゲームをVisual C++2008とDirectXにて作成しようとしています。
そこで、テクスチャを読み込んで、板状のポリゴンに貼り付けて、表示することはできました。
次に、2D描画のスーパーファミコン的な基本として拡大、縮小、回転機能を実装しようとしたのですが、
拡大、縮小は出来たのですが、どうにも、回転だけ巧くできませんでした。
ソースは、以下のようになっています。
///////////////////////////////// ここから
D3DXMATRIX rot;
D3DXMatrixRotationZ(&rot, roll); //回転
// モデル座標
D3DXVECTOR4 vect[4];
vect[0].x = -1; vect[0].y = -1; vect[0].z = 0;
vect[1].x = 1; vect[1].y = -1; vect[1].z = 0;
vect[2].x = -1; vect[2].y = 1; vect[2].z = 0;
vect[3].x = 1; vect[3].y = 1; vect[3].z = 0;
// 回転用の行列を積算
for (int i = 0; i < 4; i++) {
vect.x = (vect.x * rot._11) + (vect.y * rot._21) + (vect.z * rot._31) + rot._41;
vect.y = (vect.x * rot._12) + (vect.y * rot._22) + (vect.z * rot._32) + rot._42;
vect.z = (vect.x * rot._13) + (vect[i].y * rot._23) + (vect[i].z * rot._33) + rot._43;
vect[i].w = (vect[i].x * rot._14) + (vect[i].y * rot._24) + (vect[i].z * rot._34) + rot._44;
}
// 書き込む頂点情報の作成
Vertex v[6] = {
{vect[0].x, vect[0].y, vect[0].z, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 0},
{vect[1].x, vect[1].y, vect[1].z, D3DCOLOR_ARGB(255, 255, 255, 255), 1, 0},
{vect[2].x, vect[2].y, vect[2].z, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 1},
{vect[3].x, vect[3].y, vect[3].z, D3DCOLOR_ARGB(255, 255, 255, 255), 1, 1},
{vect[2].x, vect[2].y, vect[2].z, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 1},
{vect[1].x, vect[1].y, vect[1].z, D3DCOLOR_ARGB(255, 255, 255, 255), 1, 0},
};
pD3DDevice->SetTexture(0, texture);
pD3DDevice->SetFVF(D3DFVF_VERTEX);
pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
// World 座標の設定
D3DXMatrixIdentity(&matWorld);
pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
//View 座標の設定
D3DXMatrixIdentity(&matView);
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0, 0, 30), &D3DXVECTOR3(0, 0, 0), &D3DXVECTOR3(0, -1, 0));
pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
//透視変換の設定
D3DXMatrixIdentity(&matProj);
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI / 4, 800.0f / 600.0f, 0.0f, 100.0f);
pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, v, sizeof(Vertex));
///////////////////////////////// ここまで
なお、上記のソースは、World座標を自前で、計算しているつもりです。
DirectXの場合、DrawPrimitiveの回数を極力減らしたほうが良いと本に書いてありました。
そこで、シューティングゲームとして、弾を沢山描画することになるので、描画処理を速くする必要があると思い、
回転させる都度SetTransform関数にてWorld座標を計算すると、その都度、DrawPrimitiveをするため、
遅くなると思い、上記のようにしているつもりです。
なお、上記の回転処理をSetTransformで計算すると期待通りにきれいな回転をします。
より、詳細なソースと、SetTransformを用いて正しく回転するソース添付いたします。
やりたいことは、基本的な描画機能を高速におこなうことです。
なお、C言語は読むのに困らない程度は理解しているが、書くのはあまり得意ではありません。
また、今回のソースは微妙にC++になっていたりします。
DirectXは、ほぼ未経験となります。
皆様、ご教授おねがいいたします。