|
|
发表于 2005-8-10 12:00:00
|
显示全部楼层
Re: 场景的改变与鼠标的拾取(请教)
我是做好了把代码拷出来的,应该不可能不行的。
//g_pd3dDevice->SetTransform( D3DTS_WORLD, &g_pTheMap->MapMat );
D3DXMATRIX m_ManTranslate;
char buffer[256];
HRESULT hr;
DIMOUSESTATE2 dims2; // DirectInput mouse state structure
POINT *pt=NULL; //用于获取鼠标位置
D3DXMATRIX m_ProjMatrix; //投影矩阵
D3DXMATRIX m_ViewMatrix; //观察矩阵
D3DXMATRIX M;
pt=new POINT;
if(bUsingDI)
{
//键盘
hr = g_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if FAILED(hr)
{
hr = g_lpDIDevice->Acquire();
while(hr == DIERR_INPUTLOST )
hr = g_lpDIDevice->Acquire();
return; //is this right?
}
if (KEYDOWN(buffer, DIK_W))
{
//MessageBox(hWnd,"请编写键盘事件(W)","无事件",MB_OK);
GetCursorPos(pt);
ScreenToClient(hWnd,pt); //把相对于全屏幕的鼠标坐标转换成相对于本视窗的坐标
char a[100];
sprintf(a,"Cursor.x=%ld Cursor.y=%ld",pt->x ,pt->y);
MessageBox(hWnd,a,NULL,MB_OK);
}
if( KEYDOWN(buffer,DIK_ESCAPE ))
{
bUsingDI = FALSE;
g_lpDIDevice -> Unacquire();
g_lpDIMouse -> Unacquire();
}
//鼠标(拾取过程)
ZeroMemory( &dims2, sizeof(dims2) );
hr = g_lpDIMouse->GetDeviceState( sizeof(DIMOUSESTATE2),(LPVOID)&dims2 );
if(FAILED(hr) )
{
hr = g_lpDIMouse->Acquire();
while( hr == DIERR_INPUTLOST )
hr = g_lpDIMouse->Acquire();
return ;
}
if(dims2.rgbButtons[1])
{
//MessageBox(hWnd,"请编写鼠标事件","你点击了鼠标右键",MB_OK);
char a[100];
GetCursorPos(pt);
ScreenToClient(hWnd,pt); //把相对于全屏幕的鼠标坐标转换成相对于本视窗的坐标
sprintf(a,"Cursor.x=%ld Cursor.y=%ld",pt->x ,pt->y);
MessageBox(hWnd,a,NULL,MB_OK);
}
else if(dims2.rgbButtons[0])
{
g_pd3dDevice->GetTransform (D3DTS_PROJECTION,&m_ProjMatrix); //获取投影矩阵;
char a[100];
GetCursorPos(pt);
ScreenToClient(hWnd,pt); //把相对于全屏幕的鼠标坐标转换成相对于本视窗的坐标
//sprintf(a,"Cursor.x=%ld Cursor.y=%ld",pt->x ,pt->y);
//MessageBox(hWnd,a,NULL,MB_OK);
D3DXVECTOR3 m_viewPt;
D3DXVECTOR3 m_world;
D3DXVECTOR3 m_OriginWorld;
m_viewPt.x=(((2.0f * pt->x)/m_d3dsdBackBuffer.Width) -1)/m_ProjMatrix._11;
m_viewPt.y=-(((2.0f * pt->y)/m_d3dsdBackBuffer.Height) -1)/m_ProjMatrix._22;
m_viewPt.z=1.0f;
g_pd3dDevice->GetTransform(D3DTS_VIEW,&M);
D3DXMatrixInverse(&m_ViewMatrix,NULL,&M);
m_world.x=m_viewPt.x * m_ViewMatrix._11 + m_viewPt.y * m_ViewMatrix._21 + m_viewPt.z * m_ViewMatrix._31;
m_world.y=m_viewPt.x * m_ViewMatrix._12 + m_viewPt.y * m_ViewMatrix._22 + m_viewPt.z * m_ViewMatrix._32;
m_world.z=m_viewPt.x * m_ViewMatrix._13 + m_viewPt.y * m_ViewMatrix._23 + m_viewPt.z * m_ViewMatrix._33;
// m_world.z=1.0f;
m_OriginWorld.x=m_ViewMatrix._41;
m_OriginWorld.y=m_ViewMatrix._42;
m_OriginWorld.z=m_ViewMatrix._43;
D3DXMATRIXA16 MatWorld,MatWorldInverse;
g_pd3dDevice->GetTransform(D3DTS_WORLD,&MatWorld);
D3DXMatrixInverse(&MatWorldInverse,NULL,&MatWorld);
//m_OriginWorld 是眼睛的位置位置
D3DXVec3TransformCoord(&m_OriginWorld,&m_OriginWorld,&MatWorldInverse);
//m_world 是眼睛看的方向,所以和上面的不同。
D3DXVec3TransformNormal(&m_world,&m_world,&MatWorldInverse);
//先多看看dx的帮助吧。把基础打好。
BOOL *pHit=NULL;
float *pU=NULL,*pV=NULL,*pDist=NULL;
LPD3DXBUFFER *ppAllHits=NULL;
DWORD *pCountofHits=0,*pFaceIndex=0;
pHit=new BOOL;
pU=new float;
pV=new float;
pDist=new float;
ppAllHits=new LPD3DXBUFFER;
hr=D3DXIntersect(g_pTheMap->m_pMesh,&m_OriginWorld,&m_world,pHit,pFaceIndex,pU,pV,pDist,ppAllHits,pCountofHits);
sprintf(a,"用于断点,以监视前面的局部变量(pHit),人工判断拾取结果");
if((*pHit)==TRUE)
{
static int iIndex=0;
iIndex++;
sprintf(a,"iIndex=%d\n",iIndex);
OutputDebugStr(a);
}
}
} |
|