游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3992|回复: 15

鼠标拾取问题

[复制链接]

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-2-10 16:18:00 | 显示全部楼层 |阅读模式
m_pd3dDevice->GetTransform(D3DTS_VIEW,&ViewMatrix);
    D3DXMatrixInverse(&m,NULL,&ViewMatrix);
在将 视坐标 转换为 世界坐标过程中,总是得不到准确的值。

GetCursorPos(&point);
        //将屏幕坐标转换到客户区坐标
        ScreenToClient(m_hWnd,&point);
       
        //得到屏幕坐标 和 宽
        sWidth = m_d3dsdBackBuffer.Width;
        sHeight = m_d3dsdBackBuffer.Height;

    //将客户区坐标 转换 到投影坐标
        projPt.x = (point.x - sWidth/2) / sWidth*2;
        projPt.y = (point.y - sHeight/2) / sHeight*2;
        projPt.z = 0;

        m_X = point.x;
        m_Y = point.y;
       
        //将投影坐标 转换 到视图坐标
        m_pd3dDevice->GetTransform(D3DTS_PROJECTION,&amprojMatrix);
        DIRView.x = (2*point.x/sWidth-1)/ProjMatrix._11;
        DIRView.y = (2*point.y/sHeight-1)/ProjMatrix._22;
        DIRView.z = 1;

        //将视图坐标 转换到 世界坐标
        D3DXMATRIX m;
   
    m_pd3dDevice->GetTransform(D3DTS_VIEW,&ViewMatrix);
    D3DXMatrixInverse(&m,NULL,&ViewMatrix);

   
        OriginView.x = m._41;
        OriginView.y = m._42;
        OriginView.z = m._43;
看看有什么毛病
我是在默认D3D框架的FrameMove函数里做的。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-10 16:31:00 | 显示全部楼层

Re:鼠标拾取问题

出现里什么毛病?
另外,你还可以对照着d3d的pick例子的代码看看

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-2-10 16:49:00 | 显示全部楼层

Re:鼠标拾取问题

毛病是  OriginView.x = m._41;
OriginView.y = m._42;
OriginView.z = m._43;

这些值根本就是不随着鼠标变化的 我都 GetCursorPos了,经过 ScreenToClient等坐标变换后
输出相应的变量也是变化的 惟独最后 将视坐标变换为 世界坐标一点 都不变。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-10 16:58:00 | 显示全部楼层

Re:鼠标拾取问题

你漏了这段,在获得透视矩阵之后:
D3DXMATRIXA16 matView, m;
        m_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
        D3DXMatrixInverse( &m, NULL, &matView );

        // Transform the screen space pick ray into 3D space
        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;

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-10 16:59:00 | 显示全部楼层

Re:鼠标拾取问题

orig是射线的原点,Dir是方向

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-2-10 17:11:00 | 显示全部楼层

Re:鼠标拾取问题

那么就是说Dir是 需要的坐标吗?
  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;
还不知道结果,的确Pick里确实有这么一段代码

但是它的求逆矩镇是这样的,将视矩阵和世界矩阵作了相乘又求的逆,而我根本没相乘。
D3DXMATRIXA16 matView, matWorld, m;
        m_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
        m_pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
        
        m = matWorld * matView;
        D3DXMatrixInverse( &m, NULL, &m );
我再测试下,希望能出来。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-10 17:14:00 | 显示全部楼层

Re:鼠标拾取问题

我想你一直搞错了,这些都只是鼠标拾取的一部分,这部分叫求射线,得到射线还要和场景相交求出交点
至于求逆等等的运算,照搬pick的就可以了:)

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-2-10 17:31:00 | 显示全部楼层

Re:鼠标拾取问题

我是照这个做的
http://www.gameres.com/Articles/Program/Visual/3D/pick_2004_529.htm

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-10 17:42:00 | 显示全部楼层

Re:鼠标拾取问题

这确实是一篇好文,但不能只看部分,而要全部看完:)

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-2-10 19:14:00 | 显示全部楼层

Re:鼠标拾取问题

它实现的是拾取,而我想实现 用鼠标 点 哪,让Mesh就移动到哪。
得到坐标后 鼠标点击 传给 移动矩阵还是不能  点哪移哪。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 10:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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