游戏开发论坛

 找回密码
 立即注册
搜索
楼主: chengen

场景的改变与鼠标的拾取(请教)

[复制链接]

6

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
 楼主| 发表于 2005-8-8 21:21:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

做了人物的转换之后,结果就不正确了.
不知道是我不会乘还是怎样,乘了反矩阵之后程序结果就不正确了.
还得你指点一下:
设我的人物的转换矩阵是:
D3DXMATRIX        m_mat;
则它的反矩阵是:
D3DXMATRIX mat;
D3DXMatrixInverse(&mat,NULL,&m_mat);
那么,我应该怎样乘以点(哪个点)呢?
是不是这样:
m_world.x=m_world.x * mat._11 + m_world.y * mat._21 + m_world.z * mat._31;
m_world.y=m_world.y * mat._12 + m_world.y * mat._22 + m_world.z * mat._32;
m_world.z=m_world.z * mat._13 + m_world.y * mat._23 + m_world.z * mat._33;

8

主题

182

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
发表于 2005-8-9 10:11:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

D3DXVECTOR3 *WINAPI D3DXVec3TransformCoord(          D3DXVECTOR3 *pOut,
    CONST D3DXVECTOR3 *pV,
    CONST D3DXMATRIX *pM
);

dx里面有呀。

6

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
 楼主| 发表于 2005-8-9 11:31:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

呵呵,刚学dx,还不知道有这么一个好用的函数!
可是在拾取的过程中,有很多个D3DXVECTOR3 啊,
那么,第二个参数我应该用哪个D3DXVECTOR3呢?
(三个D3DXVECTOR3我都试了,但结果不正确啊)

8

主题

182

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
发表于 2005-8-10 10:19:00 | 显示全部楼层

Re: 场景的改变与鼠标的拾取(请教)


                        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的帮助吧。把基础打好。

6

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
 楼主| 发表于 2005-8-10 11:05:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

呵呵,嗯,好的,有时间我一定多看些dx帮助!
哎,没有老师教,学东西真是难哦!

我照着你的方法做了,答案还是不对啊!

8

主题

182

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
发表于 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);
                        }
                }

        }

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-8-10 12:10:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

请问楼上,线和网格相交的判断不用d3dxmesh该怎样做?

6

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
 楼主| 发表于 2005-8-10 18:36:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

如果我要换成
:hr=D3DXIntersect(g_pMan->m_pMesh……);
前面的m_OriginWorld 和m_world应该如何转换?
(设我对g_pMan->m_pMesh做的转换矩阵是:m_mat)

6

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
 楼主| 发表于 2005-8-11 12:23:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

hugp1973师兄,,你有一点很重要的东西没教我!!!!!!!!
就是对物体的拾取过程要放在该物体的Render()之前,这样拾取结果才和我们视觉一致!

可恶的是,我找了许多关于拾取的资料(教材),没有一份有这个提示!就连要用作用于物体的反矩阵计算观察点及其射线方向都没有说到!

就因为这个问题弄得我总做不出对人物的拾取!摸索了几天,现在终于发现了这个规则!

现在!我终于可以宣布我会做了!!!!
(好艰难的学习过程,谢谢hugp1973兄,如果不是你不厌其烦的指点教导,我不知要到何时才学会!)

结贴??。。。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-8-11 12:27:00 | 显示全部楼层

Re:场景的改变与鼠标的拾取(请教)

能不能让hugp1973前辈解完我的问题才结帖.......
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-26 19:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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