Matrix 将三维点投影到二维屏幕位置问题

Matrix 将三维点投影到二维屏幕位置问题,matrix,3d,geometry,computational-geometry,sharpdx,Matrix,3d,Geometry,Computational Geometry,Sharpdx,我试过4种方法,但都不管用。在我的代码工作的任何地方,相机都可以正常移动,对象也可以正常移动 我使用的是SharpDX,我的投影矩阵是透视投影矩阵 我试图获得3d点的屏幕位置,以便将光标定位在该点上 以下是我尝试过的4种方法: public Vector2 WorldPosToScreenPos1(Vector3 p) { Vector3.Transform(ref p, ref View, out p); Vector3.Transform(ref p, ref Project

我试过4种方法,但都不管用。在我的代码工作的任何地方,相机都可以正常移动,对象也可以正常移动

我使用的是SharpDX,我的投影矩阵是透视投影矩阵

我试图获得3d点的屏幕位置,以便将光标定位在该点上

以下是我尝试过的4种方法:

public Vector2 WorldPosToScreenPos1(Vector3 p)
{
    Vector3.Transform(ref p, ref View, out p);
    Vector3.Transform(ref p, ref Projection, out p);

    return new Vector2(
        RenderForm.ClientSize.Width * (p.X + 1) / 2,
        RenderForm.ClientSize.Height * (1 - (p.Y + 1) / 2)
        );
}

public Vector2 WorldPosToScreenPos2(Vector3 p)
{
    Vector3.Transform(ref p, ref View, out p);
    Vector3.Transform(ref p, ref Projection, out p);
    p.X /= p.Z;
    p.Y /= p.Z;
    p.X = (p.X + 1) * RenderForm.ClientSize.Width / 2;
    p.Y = (p.Y + 1) * RenderForm.ClientSize.Height / 2;

    return new Vector2(p.X, p.Y);
}

public Vector2 WorldPosToScreenPos3(Vector3 p)
{
    Viewport viewport = new Viewport(0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height);
    viewport.Project(ref p, ref ViewProj, out p);

    return new Vector2(p.X, p.Y);
}

public Vector2 WorldPosToScreenPos4(Vector3 p)
{
    Vector3.Project(p, 0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height, 1, 10000, ViewProj);
    return new Vector2(p.X, p.Y);
}

在所有四种给出不同结果的方法中,我得到的2d位置都是错的,通常相差很大。我做错了什么?

结果证明第四个方法是正确的,它所缺少的只是检索Vector3.Project返回的值

其他三种方法仍然给出了显著不同的结果,我仍然不知道它们为什么不起作用。如果有人知道,我很乐意知道