翻译VertexBuffer

时间:2014-01-31 23:29:12

标签: c++ directx direct3d9

我创建了一个顶点缓冲区,用于保存半径为2.5的(0,0)圆的顶点。

我想在鼠标所在的任何地方绘制这个圆圈,所以我抓住了WM_MOUSEMOVE并将鼠标的位置存储在P点。我已经在创建窗口时按世界,视图和投影设置了(我看看很好。)

创建窗口后,我做了:

D3DXMATRIX World, View, Projection;
D3DXVECTOR3 Camera = {0.0f, 0.0f, 10.0f};
D3DXVECTOR3 LookAt = {0.0f, 0.0f, 0.0f};
D3DXVECTOR3 UpVector = {0.0f, 1.0f, 0.0f};

D3DXMatrixIdentity(&World);
D3DXMatrixLookAtLH(&View, &Camera, &LookAt, &UpVector);
D3DXMatrixPerspectiveFovLH(&Projection, D3DXToRadian(45), static_cast<float>(WindowWidth) / static_cast<float>(WindowHeight), 1.0f, 100.0f);

d3ddevice->SetTransform(D3DTS_WORLD, &World);
d3ddevice->SetTransform(D3DTS_VIEW, &View);
d3ddevice->SetTransform(D3DTS_PROJECTION, &Projection);

要绘制顶点缓冲区,我会这样做:

void DrawFilledCircle(float mx, float my, float r, D3DCOLOR colour)
{
    if (!vertexbuffer)
    {
        CreateVertexBuffer_FilledCircle(mx, my, r, colour, 10); //perfectly fine.
    }

    d3ddevice->SetFVF(VERTEX_FVF_TEX);
    d3ddevice->SetStreamSource(0, vertexbuffer, 0, sizeof(D3DVertex));
    d3ddevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 10 - 2);
}

void RenderD3D()
{
    d3ddevice->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 40, 100, 255), 1.0f, 0);
    d3ddevice->BeginScene();

        D3DXMATRIX World;
        D3DXMatrixIdentity(&World);
        D3DXMatrixTranslation(&World, P.x, P.y, 0);
        d3ddevice->SetTransform(D3DTS_WORLD, &World);

        DrawFilledCircle(P.x, P.y, 2.5, D3DCOLOR_RGBA(0xFF, 0x00, 0x00, 0xFF));

    d3ddevice->EndScene();
    d3ddevice->Present(nullptr, nullptr, nullptr, nullptr);
}

但是,转变并没有发生。我的圆圈正在绘制,但它仍然在(0, 0)绘制。

为什么我的转换没有被应用的任何想法?

1 个答案:

答案 0 :(得分:0)

我不确定你的d3ddevice-&gt; SetTransform是做什么的,但如果你要翻译世界矩阵然后在DrawFilledCircle方法中进行额外的翻译,那么这两个都将取消。要么不翻译世界,要么不翻译圈子。如果这仍然没有成功,可以给我们更多关于这两种方法的内部运作的细节。