2012-01-12 11 views
1

頂点を使って画面に立方体を配置しようとしていますが、マウスやキーボードのコマンドで回転して変換するカメラがあります。キューブの正方形の面は、画面上にフラットに配置され、カメラが回転している間は動きません...画面上の他の項目は、四角い面の後ろに表示されます...誰もプリミティブをレンダリングするプロセスを説明できますか?事前にお手伝いをしていただきありがとうございます。カメラを回転させるとDirectXプリミティブが画面上を移動しない

#define SQUAREFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE) 

struct SQUARE { 
    float x, y, z; 
    DWORD color; 
}; 

SQUARE vert[] = 
{ 
    // 1 
     { -64.0f, -64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)}, 
     { -64.0f, 64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)}, 
     { 64.0f, 64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)}, 
     { 64.0f, -64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)}, 
}; 
bool CGraphics::TerrainTwo(D3DXVECTOR3 minB, D3DXVECTOR3 maxB, int numCellsW, int numCellsL) 
{ 
    HRESULT hr; 
    void* pVoid; 

    hr = m_d3ddev->CreateVertexBuffer(sizeof(SQUARE)*sizeof(vert),0, 
     CUSTOMFVF,D3DPOOL_DEFAULT,&m_terrainVertexBuffer,NULL); 
    if(FAILED(hr)){ 
     MessageBox(NULL, L"Could not Create Vertex Buffer", L"ERROR", MB_OK); 
     return false; 
    } 
    hr = m_terrainVertexBuffer->Lock(0, 0, (void**)&pVoid, NULL); 
    if(FAILED(hr)){ 
     MessageBox(NULL, L"Could not Lock Vertex Buffer", L"ERROR", MB_OK); 
     return false; 
    } 
    memcpy(pVoid, &vert, sizeof(vert)); 
    m_terrainVertexBuffer->Unlock(); 

    /*hr = m_d3ddev->CreateIndexBuffer(sizeof(DWORD)*sizeof(indices),0, 
     D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_terrainIndexBuffer, NULL); 
    if(FAILED(hr)){ 
     MessageBox(NULL, L"Could not Create Index Buffer", L"ERROR", MB_OK); 
     return false; 
    } 
    hr = m_terrainIndexBuffer->Lock(0, 0, (void**)&pVoid, 0); 
    if(FAILED(hr)){ 
     MessageBox(NULL, L"Could not Create Vertex Buffer", L"ERROR", MB_OK); 
     return false; 
    } 
    memcpy(pVoid, indices, sizeof(indices)); 
    if(FAILED(hr)){ 
     MessageBox(NULL, L"Could not Create Vertex Buffer", L"ERROR", MB_OK); 
     return false; 
    } 
    m_terrainIndexBuffer->Unlock();*/ 

    return true; 
} 
void CGAME::Update() 
{ 

if(m_graphics){ 
     //m_graphics->UpdateSkyBox(); 
     D3DXMATRIX matRotX, matRotY, matRotZ, matTrans; 

     D3DXMatrixRotationX (&matRotX, 0); 
     D3DXMatrixRotationY(&matRotY, 0); 
     D3DXMatrixRotationZ(&matRotZ, 0); 
     // Calculate a translation matrix 
     D3DXMatrixTranslation(&matTrans,5.0,1.0,5.0); 
     D3DXMATRIX matWorld = (matRotX*matRotY*matRotZ)*matTrans; 
     m_graphics->RenderTerrain(matWorld); 
    } 
} 

void CGraphics::RenderTerrain(D3DXMATRIX matW) 
{ 
    m_d3ddev->SetTransform(D3DTS_WORLD, &matW); 
    m_d3ddev->SetTexture(0, NULL); 
    m_d3ddev->SetStreamSource(0, m_terrainVertexBuffer, 0, sizeof(SQUARE)); 

    m_d3ddev->SetFVF(CUSTOMFVF); 

    m_d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); 
} 

答えて

0

すべての行列演算です。キューブは、頂点シェーダのインバースカメラ変換(別名カメラまたはビューマトリックス)によって頂点が変換される限り回転します(また、独自のワールド変換マトリックスといわゆる投影マトリックスによって変換される必要があります。視点効果のために)。

頂点シェーダ(固定機能パイプラインが少し古くなっています)を持っていると仮定すると、これらの変換が適用されていることを確認するだけです。通常、これはワールド*ビュー*投影行列を使った単一の乗算によって行われ、私はあなたがどこかでそれを行うと確信しており、それは正しいものではありません。

ありレンダリングパイプラインに多くの良い情報源がありますが、その一つで正しいものは、あなたが使用しているDirectXの/ハードウェアレベルに依存しますが(そこにかかわらず、赤い線彼らはすべての共有だし、基本考え方単一のプリミティブが画面にどのように表示されるかは、過去15年間であまり変化していません)。

DirectXとOpenGlは3Dグラフィックスの背後にある数学では一般的には些細なことではないので、何かが動かない、あるいはスクリーンに現れないという気持ち。デバッグを続けたり、チュートリアルやサンプルコードでコードをダブルチェックしたりしてください。

0

カメラの行列の行列はどこですか?あなたは世界の行列だけを設定しています。 DrawPrimitiveを呼び出す前に、以下のようなカメラ行列を設定する必要があります。

m_d3ddev->SetTransform(D3DTS_WORLD, &matW); // This line is already in your code. 
m_d3ddev->SetTransform(D3DTS_VIEW, &camera.m_viewMatrix); 
m_d3ddev->SetTransform(D3DTS_PROJECTION, &camera.m_projMatrix); 

カメラのマトリックスはどこかにあります。

関連する問題