Xna 将三维矢量投影到二维屏幕坐标

Xna 将三维矢量投影到二维屏幕坐标,xna,3d,2d,project,vertex,Xna,3d,2d,Project,Vertex,我正在使用XNA4.0,并尝试获取一个矢量3,然后将其转换为一个矢量2,该矢量表示屏幕上的坐标。 我知道你们可以使用Viewport.Project,这给了我完美的结果,但我需要制定自己的方法来实现这一点。 我必须在CPU而不是GPU上,将每个顶点转换为每帧2D坐标。 使用提供的项目方法比我想要的慢一点。 它还返回一个“z”值,我甚至不使用它。我只想用最简单的方法返回a(x,y) 这是我到目前为止得出的结论,它给出了几乎正确的结果。但现在还没有 private Vector2 Scree

我正在使用XNA4.0,并尝试获取一个矢量3,然后将其转换为一个矢量2,该矢量表示屏幕上的坐标。 我知道你们可以使用Viewport.Project,这给了我完美的结果,但我需要制定自己的方法来实现这一点。 我必须在CPU而不是GPU上,将每个顶点转换为每帧2D坐标。 使用提供的项目方法比我想要的慢一点。 它还返回一个“z”值,我甚至不使用它。我只想用最简单的方法返回a(x,y)

这是我到目前为止得出的结论,它给出了几乎正确的结果。但现在还没有

    private Vector2 ScreenCoords(Vector3 v)
    {
        return new Vector2(
            viewProj.M11 * v.X + viewProj.M21 * v.Y + viewProj.M31 * v.Z + viewProj.M41,
            viewProj.M12 * v.X + viewProj.M22 * v.Y + viewProj.M32 * v.Z + viewProj.M42);
    }
viewProj只是(viewMatrix*ProjectionMatrix)

屏幕中心的顶点似乎总是返回为(0,0),但随着顶点改变屏幕坐标(当我移动相机时),我会得到稍微混乱的结果 顶点向左移动时,投影结果的X减小,顶点向下移动时,投影结果的Y增大。 所以,至少我是对的,但它们的变化速度是不正确的,也不一致的

编辑:这是如何完成的,可能是最快的方法(注意,这将返回[-1,1]范围内的坐标)

下面是使用Viewport.Project获取二维坐标的比较-
带项目的FPS-81
带屏幕坐标的FPS-143
无任何一个的FPS-152

因此,我向每帧进行大量投影的其他人推荐类似的方法。

你应该意识到透视投影需要均匀坐标,你应该分割

由homegeneus系数W确定的组件

这就是数学:

Vector4 position = new Vector4(pos3, 1);
Vector4.Transform(ref position, ref worldViewProjection, out position);
position /= position.W;

你也可以在这里找到更多信息:

这让我得到了我需要的东西,谢谢!我试图避免使用像转换和项目这样的东西,并用我自己的数学得到答案,但这让我做到了。在顶部张贴新方法,以防任何人想要它。很高兴知道背后的数学原理,但我认为在着色器中使用此变换会更有效。是的,该变换还可以在z缓冲区中获取该像素的值,这是我剪切的一部分,因为我不需要它。希望我能在着色器中实现我的整个算法,这样我甚至不需要在CPU上找到2D屏幕坐标,速度会快得多
Vector4 position = new Vector4(pos3, 1);
Vector4.Transform(ref position, ref worldViewProjection, out position);
position /= position.W;