2011-04-21 80 views
0

所以我正在处理我的拣选功能。我已经阅读了几个教程,并阅读了一些帖子,我已经到了这一步。但它仍然不起作用。
我的代码有什么问题?我在采摘吗?

BOOL Directx::Picking(HWND hWnd, AnimatedMesh *entity) 
{ 
    POINT pt; 
    D3DVIEWPORT9 vp; 
    D3DXMATRIX matWorld, matView, matProj; 

    GetCursorPos(&pt); 
    ScreenToClient(hWnd, &pt); 
    d3ddev->GetTransform(D3DTS_PROJECTION, &matProj); 
    d3ddev->GetViewport(&vp); 
    d3ddev->GetTransform(D3DTS_WORLD, &matWorld); 
    d3ddev->GetTransform(D3DTS_VIEW, &matView); 

    // Use inverse of matrix 
    D3DXVECTOR3 rayPos(pt.x, pt.y,0); // near-plane position 
    D3DXVECTOR3 rayDir(pt.x, pt.x,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); 
    // Transform ray origin and direction by inv matrix 

    BOOL hasHit; 
    float distanceToCollision; 

    if(FAILED(D3DXIntersect(entity->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL))) 
    { 
     PostQuitMessage(0); 
    }; 

    if(hasHit!=0) 
     PostQuitMessage(0); 
    else 
    { 
     s=rayPos; 
    } 

    return hasHit; 
} 
+0

你要挑在屏幕中间的对象? (在屏幕中心开始的射线 – 2011-04-21 18:05:34

+0

嗯,我想在屏幕的任何位置选择物体 – Mike 2011-04-21 18:20:00

+0

@Tiago您想使用远程访问,以便您访问我的笔记本电脑并查看正在发生的事情并查看整个项目? – Mike 2011-04-27 02:20:46

回答

0

那么试试这个:

BOOL Directx::Picking(HWND hWnd, AnimatedMesh *entity) 
{ 
    POINT pt; 
    D3DVIEWPORT9 vp; 
    D3DXMATRIX matProj, matView; 

    GetCursorPos(&pt); 
    ScreenToClient(hWnd, &pt); 

    float w = (float)backBufferWidth; 
    float h = (float)backBufferHeight; 

    d3ddev->GetTransform(D3DTS_VIEW, &matView); 
    d3ddev->GetTransform(D3DTS_PROJECTION, &matProj); 
    d3ddev->GetViewport(&vp); 

    //Transform cursor position to view space 
    float x = (2.0f*pt.x/w - 1.0f)/matProj(0,0); 
    float y = (-2.0f*pt.y/h + 1.0f)/matProj(1,1); 


    D3DXVECTOR3 rayOrigin(0.0f, 0.0f,0.0f); // near-plane position 
    D3DXVECTOR3 rayDir(x, y, 1.0f); // far-plane position 

    D3DXMATRIX matInvView; 

    D3DXMatrixInverse(&matInvView, 0, &matView); 

    D3DXVECTOR3 rayOriginW, rayDirW; 

    // Transform picking ray to world space. 
    D3DXVec3TransformCoord(&rayOriginW, &rayOrigin, &invView); 
    D3DXVec3TransformNormal(&rayDirW, &rayDdir, &invView); 
    D3DXVec3Normalize(&rayDirW, &rayDirW); 

    BOOL hasHit; 
    float distanceToCollision; 

    if(FAILED(D3DXIntersect(entity->pDrawMesh, &rayOriginW, &rayDirW, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL))) 
    { 
     PostQuitMessage(0); 
    }; 

    s=rayPos; 

    return hasHit; 
} 
+0

没有任何改变。 – Mike 2011-04-28 01:47:01