Я пытался заставить эту штуку работать 2 часа, но не повезло.
BOOL Directx::Picking(HWND hWnd, AnimatedMesh *entity)
{
D3DXMATRIX matProj;
POINT pt;
D3DVIEWPORT9 vp;
D3DXMATRIX matWorld;
D3DXMATRIX matView;
GetCursorPos(&pt);
ScreenToClient(hWnd, &pt);
d3ddev->GetTransform(D3DTS_PROJECTION, &matProj);
d3ddev->GetViewport(&vp);
d3ddev->GetTransform(D3DTS_VIEW, &matView);
d3ddev->GetTransform(D3DTS_WORLD, &matWorld);
// Use inverse of matrix
D3DXVECTOR3 rayPos((float)pt.x, (float)pt.y,0); // near-plane position
D3DXVECTOR3 rayDir((float)pt.x, (float)pt.y,1); // far-plane position
D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,&matWorld);
D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,&matWorld);
rayDir -= rayPos; // make a direction from the 2 positions
D3DXVec3Normalize(&rayDir,&rayDir);
float distanceToCollision;
BOOL hasHit = 0;
if(FAILED(D3DXIntersect(entity->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL)))
{
PostQuitMessage(0);
};
if(hasHit!=0)
{
PostQuitMessage(0);
}
return hasHit;
}
Я думаю, что проблема с matWorld
, потому что я получаю преобразование мира вместо преобразования объекта, но это только предположение. Я узнал что-то новое, я загружаю 2 анимированных сетки: первая - куб, а вторая - просто плоскость. У меня нет проблем с их рендерингом, но когда я проверяю процесс выбора куба, он скажет, что он был выбран, даже если его не было. но для самолета, когда вы нажимаете на него, он говорит, что нет
т был нажат.
EDIT
Итак, я сделал больше отладки, и я получил некоторый результат о проблеме. Итак, я попытался нарисовать свой луч! Когда я рисую свой луч, я предполагаю нарисовать точку, в которой я щелкнул. Но когда я нарисовал свой луч, точка была нарисована близко к началу координат (0,0,0), я снова щелкнул мышью, затем немного сдвинулся и продолжал подниматься и опускаться.
Вот как я рисую свой луч
............
D3DXVec3Normalize(&rayDir,&rayDir);
Program::mesh1->FillInTransformation(0, 0, 0, 0, 0, 0, rayPos.x, rayPos.y, Program::z, true, false, false); //HERE I TOOK X AND Y OF rayPos AND DRAW DOT ON IT'S POSITION
float distanceToCollision;
BOOL hasHit = 0;
if(FAILED(D3DXIntersect(entity->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL)))
{
PostQuitMessage(0);
};
........