etjon 稍嫌羞澀的路人
註冊時間: 2011-09-28 文章: 1
45.48 果凍幣
|
發表於: 2011-9-28, AM 8:53 星期三 文章主題: 再次請問 如何讓滑鼠正確的點在我所指的三角型上的一點 |
|
|
利用以上的範例將 pickmap 再修改如下,我想修改當滑鼠點選到某一個共用點或某一點時,程式會停在我選取的點上,我利用公式
IntersectPoint = V1 + U*(V2-V1) + V*(V3-V1) ;
但為什麼沒有反應是不能這樣寫嗎?
在
bool ZCamera::pickmap(LPD3DXMESH pMesh,D3DXVECTOR3 v0,D3DXVECTOR3 v1,D3DXVECTOR3 v2,D3DXMATRIX matWorld,BOOL b_moxing)
{
D3DXVECTOR3 vPickRayDir;
D3DXVECTOR3 vPickRayOrig;
BOOL pHit=NULL;
DWORD *pFaceIndex=NULL;
FLOAT *pU=NULL;
FLOAT *pV=NULL;
FLOAT *pDist=NULL;
LPD3DXBUFFER *ppAllHits=NULL;
DWORD *pCountOfHits=NULL;
D3DXMATRIX matProj;
FLOAT fBary1, fBary2, fDist;
g_pMyd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );
POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( hwnd, &ptCursor );
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / 1440) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) /900) - 1 ) / matProj._22;
v.z = 1.0f;
RECT wndRect;
GetClientRect( hwnd, &wndRect );
v.x = ( ( ( 2.0f * ptCursor.x ) / wndRect.right) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) /wndRect.bottom) - 1 ) / matProj._22;
v.z = 1.0f;
static bool b = false;
//if(!b)
{
////FILE *fp = fopen("C:\\1.txt","at+");
//fprintf(fp,"x:%d y:%d,x:%d y:%d\n",ptCursor.x,ptCursor.y,wndRect.right,wndRect.bottom );
//fclose(fp);
//b = true;
}
D3DXMATRIX matView, m;
g_pMyd3dDevice->GetTransform( D3DTS_VIEW, &matView );
matView=matWorld*matView;
D3DXMatrixInverse( &m, NULL, &matView);
vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
/*
HRESULT D3DXIntersect(
LPD3DXBASEMESH pMesh,
CONST D3DXVECTOR3 *pRayPos,
CONST D3DXVECTOR3 *pRayDir,
BOOL *pHit,
DWORD *pFaceIndex,
FLOAT *pU,
FLOAT *pV,
FLOAT *pDist,
LPD3DXBUFFER *ppAllHits,
DWORD *pCountOfHits
);
l pMesh指向一?ID3DXBaseMesh的?象,最??的方式是?.x文件?得,描述了要?行相交??的三角面元集合的信息,具体?范??direct9 SDK
l pRayPos 指向射??出?
l pRayDir 指向前面我?辛辛苦苦求出的射?方向的向量
l pHit ???到相交?元?,指向一?true,不与任何?元相交??假
l pU 用于返回重心坐?U分量
l pV返回重心坐?V分量
l pDist 返回射??出?到相交?的?度
注意:以上?色字体部分均指最近的一?返回?果(即*pDist最小)
l ppAllHits用于如果存在多?相交三角面返回相交的所有?果
l pCountOfHits 返回共有多少?三角形与?射?相交
*/
if (b_moxing)
D3DXIntersect(pMesh,&vPickRayOrig,&vPickRayDir,&pHit,pFaceIndex,pU,pV,pDist,ppAllHits,pCountOfHits);
else
pHit=IntersectTriangle(vPickRayOrig,vPickRayDir,v0,v1,v2,&fDist,&fBary1,&fBary2);
if( pHit==true)
{
D3DXVECTOR3 point,t;
// 依公式 IntersectPoint = V1 + U*(V2-V1) + V*(V3-V1) ;
point = v0 + fBary1*(v1-v0) + fBary2*(v2-v0); << 依公式加的處理程式
int a;
if( point == v0 ) // 若有點選到 v0 則停在這
{
a = 1;
}else if( point == v1 ) // 若有點選到 v1 則停在這
{
a = 2;
}else if( point ==v2)// 若有點選到 v2 則停在這
{
a = 3;
}
}
return pHit;
}
描述: |
|
下載 |
檔名: |
GAME.zip |
附件大小: |
4.1 KB |
下載次數: |
共 643 次 |
|
|