您所指的功能是: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 - 尤其是因为它heavily针对绘制精灵进行了优化。SpriteBatch.Begin
将需要一个Matrix transformMatrix
作为一个论点。这相当于上面的世界和视图矩阵,not投影矩阵。
SpriteBatch 假设您的世界空间与客户端空间相同(左上角是 (0,0),宽度和高度是视口的大小)并为您处理投影。 (实际上它比这更高级 - 它会为您应用偏移量,以便精灵像素与屏幕像素对齐。)
如果你想绘制精灵,使世界在视口中显示为 256 单位宽和 240 单位高,你可以将这样的矩阵传递给SpriteBatch.Begin
:
Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)
值得注意的是,在新的 XNA 4.0 中您可以使用 SpriteBatch 使用自定义顶点着色器进行绘制所以你可以使用任意的世界观项目矩阵。