游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2684|回复: 9

滑鼠?o法正?的?在我所指的三角型上面

[复制链接]

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-9-14 09:21:00 | 显示全部楼层 |阅读模式
???1.???是那??地?]??好???槭颤N我的滑鼠?o法正?的?在我所指的三角型上面,此?例是我?木W路上取得的?K梢加修改,但是滑鼠?撰的位置都??钅屈N一?,越往上差越多,是否可以?兔Ω嬷?蛐薷囊幌?

???2.有? D3DXMatrixLookAtLH 的函式,?例中 eye 使用了 -800.0f ,700.0f ,-200.0f ?槭颤N要?如此大,是根??颤N原理,lookat 的向量也是,我看??系墓?例都是 0~1 之?,但看有些其它的?例也是如此?定,是要依??颤N去做?定??
ZCamera::ZCamera(HWND hWnd,LPDIRECT3DDEVICE9 pDevice)
{
        D3DXVECTOR3        eye(-800.0f,700.0f,-200.0f);
        D3DXVECTOR3        lookat(-800.0f,700.0f,0.0f);
        D3DXVECTOR3        up(0.0f,1.0f,0.0f);
        D3DXMatrixIdentity( &m_matView );
        SetView( &eye, &lookat, &up );
        g_pMyd3dDevice = pDevice;
        hwnd = hWnd;
}

/// ?定用於??建?z像?C矩?的基本向量值.
D3DXMATRIX*        ZCamera::SetView( D3DXVECTOR3* pvEye,D3DXVECTOR3* pvLookat,D3DXVECTOR3* pvUp)
{
        m_vEye                = *pvEye;
        m_vLookat        = *pvLookat;
        m_vUp                = *pvUp;
        /*D3DXVec3Normalize( &m_vView, &( m_vLookat - m_vEye ) );
        D3DXVec3Cross( &m_vCross, &m_vUp, &m_vView );*/

        D3DXMatrixLookAtLH( &m_matView, &m_vEye, &m_vLookat, &m_vUp);
        return &m_matView;
}

http://upload.gameres.com/20119/sf_1492058_8047.rar 

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2011-9-14 09:30:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

问题2:eye的值大小关系不大,eye 与 lookat用于确定出Camera Z vector(简单说就是摄像机的朝向)

下面是DX9文档里的描述,你可以参考参考

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
   
xaxis.x           yaxis.x           zaxis.x          0
xaxis.y           yaxis.y           zaxis.y          0
xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2011-9-16 13:29:00 | 显示全部楼层

Re: 滑鼠?o法正?的?在我所指的三角型上面

???巧系幕卮?但??绊?到到?z影?C看到?|西的?热???

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2011-9-18 17:28:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

当然会影响到,eye就是你的摄像机在世界空间的位置。
假设有一个物体object1在(0,0,0),摄像机的位置eye( 0, 0, 800 )同时far clip plane 只有100的话,你是看不到object1,从物体到摄像机的距离超过了far clip plane

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2011-9-18 21:09:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

???第一?????是否有人能告知我,help me 一下,是那???目????造成指?说奈恢盟沐e了???娜?切?

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2011-9-19 10:28:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

第一个问题:

        // ZCamera.cpp, 大约在line 60, 按以下代码修改     
        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;

        // 你用的1440 * 900的常数,这个是你创建整个window的尺寸,而不是client area的尺寸
        // PickRay需要用到是viewport的width & height, 因此你直接使用整个window的尺寸是不对的
        // 要去掉window的non client area的信息才符合你当前程序的需求

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2011-9-20 20:37:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

Dear playerwing ??您花?r??臀铱丛创a.
真是如您?的,是???????]?,可以再???一下???我?⑺?某扇??幕?r,它又跑掉了,越高的地方滑鼠差越大,
我依您所提的想???质窍嗤????,所以?⑺?指幕 1440及 900 但效果?是相同,另外我想?是不是以下????也改了1440/900 但?是相同,是不是全?幕的判?嘤胁煌?

再改回?
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;


}


HRESULT Game::InitD3D()
{
    m_pD3D=Direct3DCreate9(D3D_SDK_VERSION);

        D3DPRESENT_PARAMETERS d3dpp;
        D3DDISPLAYMODE                        d3ddm;
        m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);
        memset(&d3dpp,0,sizeof(d3dpp));
        d3dpp.Windowed = false;                //全屏模式 << ?次改成 false

.........
}
//
void Game::SetupProj()
{
        D3DXMATRIX* matView=Keyboard->GetMatrix();
        m_pD3DDevice->SetTransform( D3DTS_VIEW, matView );

//        RECT wndRect;
//        GetClientRect( hwnd, &wndRect );
//        FLOAT fAspect = ((FLOAT)wndRect.right) /wndRect.bottom;
           FLOAT fAspect = ((FLOAT)1440) /900;                  

        D3DXMATRIX matProj;
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, fAspect, 1.0f, 50000.0f);
    m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2011-9-20 22:17:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

自回帖:
依 playerwing 告知因?槿〉靡?窗的???鞘?∈??所在,於是一直?y?的?果,才??原?碓谌??幕?r,只需要直接取得滑鼠的座?思纯?不用在? ScreenToClient( hwnd, &ptCursor ); ??Q,所以取消掉 ScreenToClient( hwnd, &ptCursor );,修改原始程式?如下,即可,


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;
               
        }

PS: ?? playerwing 告知我????念,己?案.

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2011-9-21 09:50:00 | 显示全部楼层

Re:滑鼠?o法正?的?在我所指的三角型上面

客气客气~

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2011-9-26 17:23:00 | 显示全部楼层

再次??? 如何?滑鼠正?的?在我所指的三角型上的一?

利用以上的?例? pickmap 再修改如下,我想修改?滑鼠??到某一??共用?或某一??r,程式??T谖疫x取的?上,我利用公式
IntersectPoint = V1 + U*(V2-V1) + V*(V3-V1) ;
但?槭颤N?]有反??遣荒苓@?????



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 ?t停在?
                {
                        a = 1;
                }else if( point == v1 ) // 若有??到 v1 ?t停在?

                {
                        a = 2;
                }else if( point ==v2)// 若有??到 v2 ?t停在?

                {
                        a = 3;
                }

               

        }
        return pHit;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 11:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表