透视投影矩阵变换类似于正交变换



假设我有一个不在(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>

我的推理错在哪里?

也许投影坐标的W不是1。

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

如果你想得到正确的投影坐标,手动分割。CCD_ 1并用W.除XYZ

最新更新