你指的函数是:Matrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane)。
这将返回一个投影矩阵,可用于将世界空间中的一个点转换为投影空间中的一个点。
投影空间从视口左下角的 (-1,-1) 到右上角的 (1,1)。这是 GPU 在栅格化时实际工作的坐标空间。
世界空间是你想要的任何东西。
假设您使用Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10) 创建了一个矩阵,并使用该矩阵作为投影矩阵,使用 BasicEffect 绘制立方体模型。假设立方体的模型以原点为中心,大小为 1(长度、宽度和高度)。
除了basicEffect.Projection,您还可以设置basicEffect.View = Matrix.Identity(因为我们不需要额外的相机转换)和basicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0) 来转换您的模型,使其从(0,0) 存在到(1, 1)在世界空间中。然后使用 BasicEffect 绘制模型。
立方体的顶面(正交投影意味着没有透视)将绘制在视口的左上角。它将占据视口宽度的 1/256 和高度的 1/240(另请参见 GraphicsDevice.Viewport)。
(PS:我不记得背面剔除是如何受这种投影影响的。如果你什么也没看到,请尝试将其关闭或切换缠绕顺序。)
现在,话虽如此 - 我从您的其他问题(以及您想要制作正交矩阵的事实)中了解到您想要进行 2D 精灵工作。 BasicEffect 主要是为进行 3D 工作而设计的(尽管如果您制作自己的顶点着色器,不推荐用于精灵,您将需要一个投影矩阵)。
您可能想要使用 XNA 的 SpriteBatch - 尤其是因为它高度针对绘制精灵进行了优化。 SpriteBatch.Begin 将采用 Matrix transformMatrix 作为参数。这相当于上面的 World 和 View 矩阵,不是 Projection 矩阵。
SpriteBatch 假设您的世界空间与客户空间相同(左上角是 (0,0),宽度和高度是视口的大小)并为您处理投影。 (实际上它比这更高级 - 它会为您应用偏移量,以便精灵像素与屏幕像素对齐。)
如果您想绘制精灵,使世界在视口中显示为 256 单位宽和 240 单位高,您可以将这样的矩阵传递给 SpriteBatch.Begin:
Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)
值得注意的是,在新的 XNA 4.0 中,您可以use SpriteBatch to draw with custom vertex shaders,因此您可以使用任意的世界观投影矩阵。