Перевести VertexBuffer

0

Я создал буфер вершин, который содержит вершины для круга в (0, 0) с радиусом 2.5.

Я хочу нарисовать этот круг везде, где есть мышь, поэтому я захватил 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).

Любые идеи, почему мои преобразования не применяются?

  • 0
    Вы проверили в отладчике, что ваша позиция мыши P содержит действительные данные о вашей текущей позиции? Вы можете попытаться установить P в произвольное значение, чтобы проверить, в чем заключается проблема - код рисования или отслеживание позиции.
  • 0
    Да, я проверил, что значение P содержит действительные данные. Он содержит (0, 0) в начале и, когда я перемещаю мышь, он обновляется нормально ..
Показать ещё 1 комментарий
Теги:
directx

1 ответ

0

Я не уверен, что делает ваш d3ddevice-> SetTransform, но если вы переводите как глобальную матрицу, а затем выполняете дополнительный перевод в методе DrawFilledCircle, то оба из них будут отменены. Либо не переводите мир, либо не переводите круг. Если это все еще не сработает, возможно, мы подробно рассмотрим внутреннюю работу этих двух методов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню