Camera DirectXMath在错误的轴上取消投影

Camera DirectXMath在错误的轴上取消投影,camera,projection,raycasting,directxmath,Camera,Projection,Raycasting,Directxmath,编辑:解决了这个问题,请看我自己的答案 最近我正在开发一个3D世界编辑器,它将使用拾取来升高或降低地形。我使用相机未投影和光线投射来查找鼠标屏幕坐标的世界位置 但是,光线似乎位于错误的轴上。正如我所记得的,应该从未投射出来的光线应该是直接从相机出来的 这是它目前的一个例子 我的问题是,为什么光线在Y轴上,而它应该在Z轴上 XMFLOAT3 D3D11Camera::Unproject(const float& px, const float& py, const float&am

编辑:解决了这个问题,请看我自己的答案

最近我正在开发一个3D世界编辑器,它将使用拾取来升高或降低地形。我使用相机未投影和光线投射来查找鼠标屏幕坐标的世界位置

但是,光线似乎位于错误的轴上。正如我所记得的,应该从未投射出来的光线应该是直接从相机出来的

这是它目前的一个例子

我的问题是,为什么光线在Y轴上,而它应该在Z轴上

XMFLOAT3 D3D11Camera::Unproject(const float& px, const float& py, const float& pz)
{
    const XMFLOAT2& res = D3D11RenderSettings::Instance()->resolution();

    XMVECTOR coords = XMVector3Unproject(XMVectorSet(px, res.y - py, pz, 0.0f), 0.0f, 0.0f, res.x, res.y, near_plane_, far_plane_, projection_, view_, XMMatrixIdentity());

    XMFLOAT3 to_ret;
    XMStoreFloat3(&to_ret, coords);

    return to_ret;
}
这是非投影代码

这就是我使用它的方式

projectRay: function()
{
    var p = Mouse.position(MousePosition.Relative);
    p.x = (p.x + RenderSettings.resolution().w / 2);
    p.y = (p.y + RenderSettings.resolution().h / 2);

    var unprojA = this._camera.unproject(p.x, p.y, 0);
    var unprojB = this._camera.unproject(p.x, p.y, 1);

    var dir = Vector3D.normalise(Vector3D.sub(unprojB, unprojA));
    var ray = Ray.construct(unprojA, dir);

    var p1 = ray.origin;
    var p2 = Vector3D.add(ray.origin, Vector3D.mul(ray.direction, 1000));

    RenderTargets.ui.drawLine(p1.x, p1.y, p1.z, 1, 0, 0, p2.x, p2.y, p2.z, 1, 0, 0);

    return ray;
}

干杯

除了愚蠢之外,我使用的是倒置的Y轴坐标系和默认的非倒置坐标系。它看起来像是一条垂直定向的光线,但实际上它是一条定向为“/”的光线,而它应该定向为“\”。将结果的Y分量乘以-1解决了这个问题