Примитив DirectX не перемещается на экране при вращении камеры - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь разместить куб на экране, используя вершины ... у меня есть камера, которая вращается и переводит команды мыши и клавиатуры ... во время выполнения, однако, квадратная поверхность куба лежит наэкран и не движется, когда камера вращается ... другие элементы на экране появляются за квадратной поверхностью ... кто-нибудь может объяснить процесс рендеринга примитива?Заранее спасибо за любую помощь ... это очень ценится!

#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 );
}

Ответы [ 2 ]

0 голосов
/ 23 августа 2012

Где матрицы камеры чувак? Вы устанавливаете только мировую матрицу. Перед вызовом 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);

Где-то вы можете найти матрицы камеры.

0 голосов
/ 13 января 2012

Это все матрица математики. Ваш куб будет вращаться до тех пор, пока его вершины преобразуются с помощью обратного преобразования камеры (или камеры или матрицы просмотра) в вершинном шейдере (также он должен быть преобразован своей собственной матрицей преобразования мира и так называемой матрицей проекции, которая отвечает за для эффекта перспективы).

Предполагая, что у вас есть вершинный шейдер (конвейер с фиксированными функциями немного устарел), все что вам нужно сделать, это убедиться, что эти преобразования применяются. Обычно это делается с помощью одного умножения с матрицей проекции * мировоззрения *, и я уверен, что вы где-то это делаете, и это просто не правильно.

Есть много хороших источников в конвейере рендеринга, но какой из них правильный, зависит от используемого вами уровня DirectX / аппаратного обеспечения (хотя есть красная линия, которую они все разделяют, и basic идея о том, как отдельные примитивы появляются на экране, не сильно изменилась за последние 15 лет).

Поскольку вы новичок в 3D-графике, как я полагаю, предупреждаю вас: DirectX и OpenGl могут быть хитрыми / неинтуитивными, а математика 3D-графики в целом не совсем тривиальна, и то и другое вместе довольно часто дает вам ощущение, что что-то просто не движется или даже не появляется на экране. Просто продолжайте отладку, дважды проверяйте свой код с помощью учебных пособий или примеров кода ... ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...