2014-01-31 3 views
0

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

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

+0

Да Я проверил, что значение P содержит действительные данные. Он содержит (0, 0) в начале и по мере того, как я перемещаю мышь, он точно обновляется. – Brandon

+0

Одна из проблем, которые я вижу (хотя я думаю, что это не основная причина, а всего лишь фактор содействия) - это отображение от пикселей к мировым единицам , Я думаю, 'P' измеряется в пикселях. Чтобы круг мог следовать за мышью, вам нужно будет перевести эти значения в мировые единицы (на основе преобразования перспективы). На какой глубине вы рисуете круг? Может быть, он движется, но так мало, что вы не можете его распознать? Вы обязательно переделаете сцену, верно? –

ответ

0

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