在Directx11中选择点

Select Points in Directx11

本文关键字:选择 Directx11      更新时间:2023-10-16

我使用DirectX11和DXUT来显示点云,现在要使用鼠标移动交互选择点。特别是当我拖动鼠标绘制一个矩形时,这个矩形中的点将被选中。我的方法是首先将鼠标位置转换为一个方框,范围(-1,1)。然后用mvp矩阵将这些点变换到投影空间。最后,将这些点的x和y与方框进行比较。如果在方框中,则选中该点。以下是我的一些代码片段:

CModelViewerCamera  g_Camera;
XMMATRIX mView = g_Camera.GetViewMatrix();
XMMATRIX mProj = g_Camera.GetProjMatrix();
XMMATRIX mvp= mWorld * mView * mProj;
XMFLOAT4 p_ext( p.x,p.y,p.z, 1 );
XMVECTOR tmp_p = XMLoadFloat4(&p_ext);
tmp_p = XMVector4Transform( tmp_p, XMMatrixTranspose(mvp) );
XMStoreFloat4( &p_ext, tmp_p );
float x = p_ext.x;
float y = p_ext.y;
if ( x > bottom_left.x && x < up_right.x &&
        y > bottom_left.y && y < up_right.y )
{
    //In box, Mark using other color
}

然而,当我运行我的代码时,我发现转换到投影空间的点不在范围(-1,1)内。谁能指出我的错误,或者给我另一种实现目标的方法。谢谢你!

假定mvp矩阵按此顺序应用模型变换、视图变换和投影变换。对于mvp矩阵,它需要这样计算:

mvp = mProj * mView * mWorld

第二,为什么你要转置矩阵mvp ?DirectX使用行主要矩阵,XMMatrix也是行主要的,所以不应该有理由转置mvp矩阵。