如何解决透视投影矩阵变换,如正交
假设我有一个不在(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),1.0f,0.0f));
Matrix4x4 projectionMatrix = Matrix4x4.CreatePerspectiveFieldOfView((float)Math.PI / 3.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,-1.0f),0.0f));
Vector3 v2 = Vector3.Transform(v,viewMatrix * projectionMatrix);
Console.WriteLine(v2); //<-5.1961527,3.903904>
我的推理有什么问题?
解决方法
也许预计坐标的W不是1。
在顶点着色器中,返回的W表示点或向量。如果为1,则为点。但是由于某种原因,顶点着色器自动将XYZ除以W。因此,顶点着色器无需将W显式设置为1,几乎3D数学库都将W作为除数而不是1。
如果要获得正确的投影坐标,请手动分割。 Vector4.Transform()
并将XYZ除以W。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。