游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3133|回复: 1

D3D 右手坐标系 Pick

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2012-3-23 10:52:00 | 显示全部楼层 |阅读模式
如题,D3D Pick,在网上找了一下资源,是可以用,但拷到自己的代码中就是不工作,找了好久的原因,原来是 D3D 默认坐标系是左手的,而由于需要,我特地设置成了右手坐标系,所以才会出现问题。

我的问题就是,如何在右手坐标系的情况下实现 D3D Pick,代码都大同小异,比如下面这个,在左手坐标系下工作正常,如何转换成 右手坐标系下的代码:


        //客户区坐标->投影坐标->摄像机坐标
        // Compute the vector of the pick ray in screen space
        D3DXVECTOR3 v;
        v.x = ( ( ( 2.0f * ptCursor.x ) / m_Width ) - 1 ) / matProj._11;
        v.y = -( ( ( 2.0f * ptCursor.y ) / m_Height ) - 1 ) / matProj._22;
        v.z = 1.0f;

        //摄像机变换的逆变换
        // Get the inverse view matrix
        D3DXMATRIXA16 matView, m;
        g_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;
        //观察点从摄像机坐标系(0,0,0,1)变换到世界坐标系
        vPickRayOrig.x = m._41;
        vPickRayOrig.y = m._42;
        vPickRayOrig.z = m._43;
    }

     D3DXIntersect(g_pMesh, &vPickRayOrig, &vPickRayDir, &bHit, &dwFace, &fBary1, &fBary2, &fDist,
     NULL, NULL);

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2012-3-23 13:49:00 | 显示全部楼层

Re:D3D 右手坐标系 Pick

解决了,理解的不深刻导致的

左手坐标系和右手坐标系的转换,只是 Z 的方向反一下就可以了,上面的代码的话,另  v.z = -1.0f;

就可以了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 15:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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