透视投影矩阵变换,如正交

时间:2020-08-15 21:27:49

标签: c# math matrix

假设我有一个不在(0,0,0)中的点和一个在(0,0,0)处的透视相机。 据我了解,如果我沿z轴移动透视相机,则屏幕上的点也应移动。相机距离越远,该点应越靠近屏幕坐标中的(0,0)。

在我的C#程序中,摄像机的移动根本不影响屏幕坐标(x,y)。就像正交相机一样,它仅更改z坐标。这是最小的示例:

        Vector3 v = new Vector3(3.0f);
        // Move camera z to  -10 from the center
        Matrix4x4 viewMatrix = Matrix4x4.CreateLookAt(new Vector3(0.0f, 0.0f, -10.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
        Matrix4x4 projectionMatrix = Matrix4x4.CreatePerspectiveFieldOfView((float)Math.PI / 3.0f, 1.0f, 0.1f, 100.0f);
        Vector3 v1 = Vector3.Transform(v, viewMatrix * projectionMatrix);
        Console.WriteLine(v1); //<-5.1961527, 5.1961527, 12.912912>
        // Move camera z to -1 from the center
        viewMatrix = Matrix4x4.CreateLookAt(new Vector3(0.0f, 0.0f, -1.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
        Vector3 v2 = Vector3.Transform(v, viewMatrix * projectionMatrix);
        Console.WriteLine(v2); //<-5.1961527, 5.1961527, 3.903904>

我的推理有什么问题?

1 个答案:

答案 0 :(得分:2)

也许预计坐标的W不是1。

在顶点着色器中,返回的W表示点或向量。如果为1,则为点。但是由于某种原因,顶点着色器自动将XYZ除以W。因此,顶点着色器无需将W显式设置为1,几乎3D数学库都将W作为除数而不是1。

如果要获得正确的投影坐标,请手动分割。 Vector4.Transform()并将XYZ除以W。