使用Matrix.CreatePerspectiveOffCenter在XNA中变换矩阵:消失点到中心

使用Matrix.CreatePerspectiveOffCenter在XNA中变换矩阵:消失点到中心,matrix,3d,xna,translation,transform,Matrix,3d,Xna,Translation,Transform,我试图获得以下观点: 本质上,我是在用一些3D图形做2D游戏,所以我从Matrix.createOrthographicalOffcenter切换到Matrix.CreatePerspectiveOffCenter 我画了一个原语,通过减小它的z指数,它会走得更远,但它总是在(0,0)(左上角)的方向消失,而消失点应该是中心 我的变换设置现在看起来像这样((640360)是屏幕的中心): 我无法将消失点移到屏幕中央。我设法用CreatePerspectiveView(某种程度上)做到了这一点,但

我试图获得以下观点:

本质上,我是在用一些3D图形做2D游戏,所以我从
Matrix.createOrthographicalOffcenter
切换到
Matrix.CreatePerspectiveOffCenter

我画了一个原语,通过减小它的z指数,它会走得更远,但它总是在(0,0)(左上角)的方向消失,而消失点应该是中心

我的变换设置现在看起来像这样((640360)是屏幕的中心):


我无法将消失点移到屏幕中央。我设法用CreatePerspectiveView(某种程度上)做到了这一点,但我想继续使用CreatePerspectiveOffCenter,因为我可以轻松地将普通像素位置转换到3D空间。我错过了什么

最后,我使用了以下方法。如果您正在寻找一种解决方案来创建具有“2D感觉”的3d视图,这可能会很方便。通过这些平移,z索引0与屏幕的宽度和高度完全匹配,消失点位于屏幕的中心

basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView((float)Math.PI / 2f, 1, 1f / 1000, 1000f);
basicEffect.View = Matrix.CreateLookAt(new Vector3(0, 0, 1f), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
basicEffect.World = Matrix.CreateTranslation(0, 0, 0);

请详细说明为什么要使用
CreatePerspectiveOffCenter
?我可能错了,但我的理解是:CreatePerspectiveOffCenter是一个函数,它将像素坐标(左上角0,0和右下角viewport.width、viewport、height)转换为空间世界点(0,0中心,x-1到1,y-1到1),这对我来说很方便,因为我基本上是在做2D游戏。我说的对吗?有什么理由我应该或不应该使用CreatePerspectiveOffCenter来实现这个目标吗?此外,我认为我几乎成功了,但我做错了什么。现在我有一个完美的平移,当z-Index=0时,我的基本体,它们有完美的位置,我可以使用法线像素坐标绘制它们。但是当我减少x索引时,原语会移到屏幕的左上角,而不是中间。(我改回Matrix.CreateLookAt(新向量3(0,0,1),新向量3(0,0,0),新向量3(0,1,0));)我想问的是,你为什么不使用简单的方法
CreatePerspectiveFieldOfView
来创建一些偏离中心的东西呢?看起来你需要一个简单的视角。此外,您描述这些方法的方式是反向的。他们将3d坐标转换成屏幕空间;而不是相反。如果这就是您使用这些方法的原因,那么您以错误的方式处理问题。是的,
CreatePerspectiveFieldOfView
确实是一条路,通过使用该方法实现了这一点。我认为偏离中心的方法对我的目标有用,但现在我放弃了这个想法,我仍然不确定这个方法的用途。谢谢
basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView((float)Math.PI / 2f, 1, 1f / 1000, 1000f);
basicEffect.View = Matrix.CreateLookAt(new Vector3(0, 0, 1f), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
basicEffect.World = Matrix.CreateTranslation(0, 0, 0);