游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1590|回复: 4

拾取问题

[复制链接]

4

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2008-8-28 16:34:00 | 显示全部楼层 |阅读模式
想实现用鼠标点击一个球体,球体被选中的功能,代码如下:
if( GetCapture() )
{

//计算拾取射线相关变量声明
POINT        ptCursor;  //鼠标位置
D3DXMATRIX   matWorld, matView, pmatProj, m;
D3DXVECTOR3  vPickRayOrig, vPickRayDir;

GetCursorPos( &ptCursor );
ScreenToClient( g_Wnd, &ptCursor );


RECT rect;
GetClientRect(g_Wnd,&rect);

int width,height;
width=rect.right ;
height=rect.bottom ;

D3DXVECTOR3 v;
v.x =  ( ( ( 2.0f * ptCursor.x ) / width  ) - 1 ) / pmatProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / height ) - 1 ) / pmatProj._22;
v.z =  1.0f;

//获取当前设备的变换矩阵
pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
pd3dDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );

//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMatrixInverse( &m, NULL, &mWorldView );

//计算拾取射线的方向与原点
D3DXVECTOR3 vTemp;
vTemp.x =  ((( 2.0f * ptCursor.x ) / width  ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * ptCursor.y ) /height ) - 1 ) / pmatProj._22;
vTemp.z =  1.0f;

vPickRayDir.x  = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
vPickRayDir.y  = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
vPickRayDir.z  = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;

vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;


D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp;

BOOL bHit;
DWORD dwFace;
FLOAT fBary1, fBary2, fDist;
D3DXIntersect(g_mesh, &vPickRayOrig_tmp, &vPickRayDir_tmp, &bHit,&dwFace, &fBary1, &fBary2, &fDist, NULL, NULL);//g_mesh为模型球的mesh指针


}

程序运行有错误,执行完D3DXIntersect后,bHit为空,表明鼠标没有选中球体,但我明明点在了球体上,是不是哪里出问题了,请指教!

还有,以下是我写Pick_Triangle函数的位置:
VOID Render()
{
   Pick_Triangle(g_pd3dDevice,g_mesh);//写在这里有问题吗????????????
   //清空后台缓冲区
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );

   //开始在后台缓冲区绘制图形
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {

                SetupWorldMatrice();

                //设置观察和投影矩阵
                SetupViewandProjMatrices();

                //设置视区
                SetupViewPort();

        g_mesh->DrawSubset(0);
               
                //结束在后台缓冲区渲染图形
        g_pd3dDevice->EndScene();
    }

        //将在后台缓冲区绘制的图形提交到前台缓冲区显示
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}

希望高手赐教,不胜感激!

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2008-8-31 21:32:00 | 显示全部楼层

Re:拾取问题

一个矩阵不等于是一个实体,只是空间里的一个点;你的光线拾取的是一个点,你能准确拾取吗?

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2008-8-31 21:35:00 | 显示全部楼层

Re:拾取问题

没看清,对不起

4

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2008-9-2 12:39:00 | 显示全部楼层

Re:拾取问题

有知道的吗?急!

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2008-9-3 22:26:00 | 显示全部楼层

Re:拾取问题

我把sdk里的例子贴到自己的程序里都不行。自己按照相机的位置左一条射线就可以。

那个 “GetCapture() ”是用来检测鼠标是否按下的,最好先去掉。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 11:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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