And write a program.
The problem is that when the picking ray go through multi object,it may hit a object far from the camera first,but not the near one!
this is my code:
static bool clickOnce = true;
static bool clickAgain = true;
D3DXVECTOR3 originW(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 dirW(0.0f, 0.0f, 0.0f);
if( gDInput->mouseButtonDown(0) )
{
if(clickAgain == clickOnce)
{
clickAgain = clickOnce;
clickOnce = false;
getWorldPickingRay(originW, dirW);
}
}
else
{
clickOnce = true;
}
for(int x = 0; x < 32; x++)
{
for(int y = 0; y < 32; y++)
{
for(int z = 0; z < 32; z++)
{
//x,y,z means objects position and there are all box
if(mMapClass->GetPosID(x, y, z))//check texture ID
{
D3DXMATRIX T;
D3DXMatrixTranslation(&T, x, y, z);
D3DXMATRIX toWorld = T;
AABB box;
mChunkBox.xform(toWorld, box);
if(D3DXBoxBoundProbe(&box.minPt, &box.maxPt, &originW, &dirW) )
{
//destroy the box
}
//and then draw object in position (x, y, z)
}
}
}
}
void getWorldPickingRay(D3DXVECTOR3& originW, D3DXVECTOR3& dirW)
{
POINT s;
GetCursorPos(&s);
ScreenToClient(mhMainWnd, &s);
float w = (float)md3dPP.BackBufferWidth;
float h = (float)md3dPP.BackBufferHeight;
D3DXMATRIX proj = gCamera->proj();
float x = (2.0f*s.x/w - 1.0f) / proj(0,0);
float y = (-2.0f*s.y/h + 1.0f) / proj(1,1);
D3DXVECTOR3 origin(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 dir(x, y, 1.0f);
D3DXMATRIX invView;
D3DXMatrixInverse(&invView, 0, &gCamera->view());
D3DXVec3TransformCoord(&originW, &origin, &invView);
D3DXVec3TransformNormal(&dirW, &dir, &invView);
D3DXVec3Normalize(&dirW, &dirW);
}
Is there any problems in my code?And sorry for my poor english