游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2545|回复: 8

请看代码,为什么无法拾取子模型?

[复制链接]

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2008-1-20 16:28:00 | 显示全部楼层 |阅读模式
                //获取后台缓冲区的宽度和高度
                iWidth=800;
                iHeight=600;
                //获取当前鼠标在窗口客户区中的位置
                GetCursorPos( &ptCursor );
        //        ptCursor.x=sbhcq.lX;
        //        ptCursor.y=sbhcq.lY;
        //        ScreenToClient( DXUTGetHWND(), &ptCursor );
                ScreenToClient( ckjb, &ptCursor );
        //        ScreenToClient( DXUTGetHWND(), &ptCursor );
                //获取当前设备的变换矩阵
                dx->GetTransform( D3DTS_WORLD, &matWorld );
                dx->GetTransform( D3DTS_VIEW, &matView );
                dx->GetTransform( D3DTS_PROJECTION, &pmatProj );
                //计算世界观察矩阵的逆矩阵
                D3DXMATRIX mWorldView = matWorld * matView;//
                D3DXMatrixInverse( &m, NULL, &mWorldView);
                //计算拾取射线在视图空间的方向
                D3DXVECTOR3 vTemp;
                vTemp.x =  ((( 2.0f * ptCursor.x ) / iWidth  ) - 1 ) / pmatProj._11;
                vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 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;
                //计算被拾取到的三角形, 得到拾取到三角形的索引
                BOOL               bHit;
                LPD3DXBUFFER       pBuffer = NULL;
                for(i=0;i<5;i++){
                        sjxsl=0L;
                        D3DXIntersectSubset( mesh,i, &vPickRayOrig, &vPickRayDir, &bHit,
                                                                 NULL, NULL, NULL, NULL,
                                                                &pBuffer, &sjxsl );
                        if(sjxsl>0)
                        {
                                shiqubz=1;
                        }
                        else{shiqubz=0;}
                }

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-1-21 22:14:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

还有很多工作没做哦
计算拾取三角形之前加上这几句
vPickRayOrig += vPickRayDir;
D3DXMATRIX matInv;
D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp;
D3DXMatrixInverse(&matInv, NULL,matWorld);
D3DXVec3TransformCoord(&vPickRayOrig_tmp, &vPickRayOrig, &matInv);
D3DXVec3TransformNormal(&vPickRayDir_tmp, &vPickRayDir, &matInv);

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-1-21 22:15:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

拾取子集的话,模型需要Optimize一下

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2008-1-23 13:01:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

加上后还是不行,请看加的位置是否正确?


//获取后台缓冲区的宽度和高度
iWidth=800;
iHeight=600;
//获取当前鼠标在窗口客户区中的位置
GetCursorPos( &ptCursor );
// ptCursor.x=sbhcq.lX;
// ptCursor.y=sbhcq.lY;
// ScreenToClient( DXUTGetHWND(), &ptCursor );
ScreenToClient( ckjb, &ptCursor );
// ScreenToClient( DXUTGetHWND(), &ptCursor );
//获取当前设备的变换矩阵
dx->GetTransform( D3DTS_WORLD, &matWorld );
dx->GetTransform( D3DTS_VIEW, &matView );
dx->GetTransform( D3DTS_PROJECTION, &pmatProj );
//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;//
D3DXMatrixInverse( &m, NULL, &mWorldView);
//计算拾取射线在视图空间的方向
D3DXVECTOR3 vTemp;
vTemp.x =  ((( 2.0f * ptCursor.x ) / iWidth  ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 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;
//计算被拾取到的三角形, 得到拾取到三角形的索引

//================================================================================
vPickRayOrig += vPickRayDir;
D3DXMATRIX matInv;
D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp;
D3DXMatrixInverse(&matInv, NULL,&matWorld);
D3DXVec3TransformCoord(&vPickRayOrig_tmp, &vPickRayOrig, &matInv);
D3DXVec3TransformNormal(&vPickRayDir_tmp, &vPickRayDir, &matInv);
//================================================================================


BOOL               bHit;
LPD3DXBUFFER       pBuffer = NULL;
for(i=0;i<5;i++){
sjxsl=0L;
D3DXIntersectSubset( mesh,i, &vPickRayOrig, &vPickRayDir, &bHit,
NULL, NULL, NULL, NULL,
&pBuffer, &sjxsl );
if(sjxsl>0)
{
shiqubz=1;
}
else{shiqubz=0;}
}

1

主题

7

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2008-1-23 16:38:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

/*
D3DXMATRIX mWorldView = matWorld * matView;//
D3DXMatrixInverse( &m, NULL, &mWorldView);
//计算拾取射线在视图空间的方向
D3DXVECTOR3 vTemp;
vTemp.x =  ((( 2.0f * ptCursor.x ) / iWidth  ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 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;
*/
改成
D3DXMATRIX mVP = matView * matProj;//
D3DXMatrixInverse( &mInvVP, NULL, &mVP);
D3DXVECTOR3 vTemp;
vTemp.x =  ((( 2.0f * ptCursor.x ) / iWidth  ) - 1 );
vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 1 );
vTemp.z =  1.0f;
vPickRayDir = vTemp * mInvVP;
D3DXVec3Normalize(&vPickRayDir,&vPickRayDir);

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-1-24 19:06:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

D3DXIntersectSubset( mesh,i, &vPickRayOrig_tmp, &vPickRayDir_tmp......
另外D3DXMATRIX mWorldView = matWorld * matView,这个乘法貌似是多余的

这个是我的做法,和书上有点不一样,不知道你可以用不,反正书上那个代码我是没法用的..

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2008-1-25 21:45:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

楼上可有示例代码看一下。

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-1-26 16:47:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

   D3DXVECTOR3 vPickRayDir;
    D3DXVECTOR3 vPickRayOrig;

    D3DXMATRIX pmatProj;
        m_pD3DDevice->GetTransform(D3DTS_PROJECTION,&pmatProj);

    POINT ptCursor;
        GetCursorPos( &ptCursor );
        ScreenToClient( m_hWnd, &ptCursor );

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

    D3DXMATRIX matView,m;
        m_pD3DDevice->GetTransform(D3DTS_VIEW,&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;

        vPickRayOrig += vPickRayDir;
        D3DXMATRIX matInv;
        D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp;
        D3DXMatrixInverse(&matInv, NULL,&model->m_matworld);
        D3DXVec3TransformCoord(&vPickRayOrig_tmp, &vPickRayOrig, &matInv);
        D3DXVec3TransformNormal(&vPickRayDir_tmp, &vPickRayDir, &matInv);

        BOOL bHit;
        DWORD dwFace;
    FLOAT fBary1, fBary2, fDist;
        D3DXIntersect(m_pMesh, &vPickRayOrig_tmp, &vPickRayDir_tmp, &bHit,&dwFace, &fBary1, &fBary2, &fDist, NULL, NULL);

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2008-1-27 22:09:00 | 显示全部楼层

Re:请看代码,为什么无法拾取子模型?

还是不懂,分成单个模型算了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 23:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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