【发布时间】:2014-02-03 21:25:07
【问题描述】:
我创建了一个顶点缓冲区,它保存半径为 2.5 的 (0, 0) 处的圆的顶点。
我想在鼠标所在的任何地方绘制这个圆圈,所以我捕获了WM_MOUSEMOVE 并将鼠标的位置存储在点 P 中。我已经在创建窗口时按世界、视图和投影进行了设置(我的外观at 很好)。
在创建窗口时我做了:
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)绘制。
任何想法为什么我的转换没有被应用?
【问题讨论】:
-
您是否在调试器中检查了您的鼠标位置
P包含您当前位置的有效数据?您可以尝试将 P 设置为任意值,以测试问题所在 - 绘图代码或位置跟踪。 -
是的,我检查了 P 的值是否包含有效数据。它在开始时包含 (0, 0) 并且当我移动鼠标时它会更新良好..
-
我看到的一个问题(尽管我认为这不是根本原因;只是一个促成因素)是从像素到世界单位的映射。我猜,
P以像素为单位。对于跟随鼠标的圆圈,您需要将这些值转换为世界单位(基于透视变换)。你画圆的深度是多少?也许它会移动,但太小以至于你无法认出它?你确定要重绘场景吧?