破碎的拾取坐标 Directx11

Broken Picking Coordinates Directx11

一段时间以来,我一直在尝试将基于点击的模型插入到我的游戏编辑器中,但 运行 遇到了很多问题。最近的是模型放置的偏移。到目前为止,我已经得到了这段代码:

    D3DXVECTOR3 vPickRayDir;
    D3DXVECTOR3 vPickRayOrig;

    float width = (float)d3d->scd.BufferDesc.Width;
    float height = (float)d3d->scd.BufferDesc.Height;

    const D3DXMATRIX* pmatProj = &d3d->matProjection;

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

    D3DXVECTOR3 v;
    v.x = (((2.0f * ptCursor.x) / (d3d->viewport.Width)) - 1.0f) / pmatProj->_11;
    v.y = -(((2.0f * ptCursor.y) / (d3d->viewport.Height)) - 1.0f) / pmatProj->_22;
    v.z = -1.0f;

    const D3DXMATRIX matView = d3d->matView;
    const D3DXMATRIX _matWorld = matWorld;

    D3DXMATRIX matRotateX, matRotateY, matRotateZ, matTranslate;

    D3DXMatrixTranslation(&matTranslate, 0, 0, 0);
    D3DXMatrixRotationX(&matRotateX, 0);
    D3DXMatrixRotationY(&matRotateY, 0);
    D3DXMatrixRotationZ(&matRotateZ, 0);

    matWorld = (matRotateX * matRotateY * matRotateZ) * matTranslate;

    D3DXMATRIX mWorldView = matWorld * matView;
    D3DXMATRIX m;
    D3DXMatrixInverse(&m, NULL, &mWorldView);

    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;

    ModelInstance mi(GetDocument()->GetModel(m_wndModels.m_nodeTree.selectID));

    mi.Translation.at(0).x = (1 * vPickRayDir.x + vPickRayOrig.x);
    mi.Translation.at(0).y = (1 * vPickRayDir.y + vPickRayOrig.y);
    mi.Translation.at(0).z = (1 * vPickRayDir.z + vPickRayOrig.z);
    mi.Translation.at(0).z *= -1;

为什么会有偏移,我该如何删除它?

P.S。 Here's a link the complied program。单击打开并打开随附的 fbx 文件。打开后,双击模型列表中的模型,然后单击视图 space 以插入。

我找到了解决方案 here。最后一个 post 显示了所需的一切,我需要做的就是更改变量以适应 DirectX-10。