我在 MFC 窗口中有一个 direct3d 环境,我想在屏幕的一角绘制坐标系轴,就像任何 3d 软件一样。我认为这不会有问题,但是当我开始移动相机时出现了问题。无论我如何平移、缩放或旋转相机,我都需要对象出现在同一个位置。
但似乎我做错了什么,我希望有人能指出我正确的方向,因为我正在绘制的对象在我缩放时没有相应地缩放,但在平移或旋转时它工作得很好。
我还发布了一个 youtube 视频向您展示症状:http ://www.youtube.com/watch?v=gwM0m8nbLts&feature=youtu.be
这是我绘制对象的代码:
void CDEMView::DrawSomeBox()
{
// Define the needed matrices - object world, view and project
D3DXMATRIX matObjectWorld;
D3DXMatrixIdentity (&matObjectWorld); // object world matrix
D3DXMATRIX matView;
D3DXMatrixIdentity (&matView); // view matrix
D3DXMATRIX matProjection;
D3DXMatrixIdentity (&matProjection); // projection matrix
// Get the needed matrices
_device->GetTransform(D3DTS_VIEW, &matView);
_device->GetTransform(D3DTS_PROJECTION, &matProjection);
// Get the viewport
D3DVIEWPORT9 viewport;
_device->GetViewport(&viewport);
// Get the center point of the object
D3DXVECTOR3* p_centerPoint = BoxCenterVector; // this is from an external variable
// Get the point on the creen that is the screen projection of the object
D3DXVECTOR3 projectPoint;
D3DXVec3Project(&projectPoint, p_centerPoint ,&viewport, &matProjection, &matView, &matObjectWorld);
// choose the screen point where the object is to be drawn, relative to the Viewport's dimensions
D3DXVECTOR3 screenPoint;
screenPoint.x = 0.1*viewport.Width; // x position (horizontal) is 10% of the width of the screen (0% is left, 100% is right)
screenPoint.y = 0.9*viewport.Height; // y position (vertical) is 90% of the height of the screen (0% is top, 100% is bottom)
screenPoint.z = projectPoint.z; // 1-projectPoint.z*60/(-zoom);
//transform the screen position to a world position
D3DXVECTOR3 worldPoint;
D3DXVec3Unproject( &worldPoint, &screenPoint, &viewport, &matProjection, &matView, &matObjectWorld );
// now define how much to translate the box in order to get it to the point we want it to be (WorldPoint)
float transX, transY, transZ;
transX = worldPoint.x;
transY = worldPoint.y;
transZ = worldPoint.z;
// define a mesh to store the object into and create the object
ID3DXMesh* _SomeBox;
float boxSize = 2.0f;
D3DXCreateBox(_device,boxSize,boxSize,boxSize,&_SomeBox,NULL);
// define a material and set its color
D3DMATERIAL9 mat;
// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 255;
mat.Diffuse.g = 0;
mat.Diffuse.b = 0;
mat.Diffuse.a = 0.5;
_device->SetMaterial(&mat);
_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); // D3DFILL_SOLID
// apply the translation matrix
D3DXMatrixTranslation(&matObjectWorld, transX, transY, transZ);
_device->SetTransform(D3DTS_WORLD, &matObjectWorld);
// draw the object
_SomeBox->DrawSubset(0);
// release the mesh
_SomeBox->Release();
}