3

我试图弄清楚如何在 XNA 中绘制图形,其他人建议这样做。但在我尝试使用它之前...

如果我创建并使用这个相机,并将 LEFT,TOP 设置为 0 并且 WIDTH=256 和 HEIGHT=240,我渲染到屏幕上的任何东西都会使用这些坐标吗?那么宽度和高度为 1 的框,如果设置为 0,0 会占用 0,0 到 1,1 的空间吗?

4

1 回答 1

15

您所指的功能是: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将 aMatrix transformMatrix作为参数。这相当于上面的 World 和 View 矩阵,而不是Projection 矩阵。

SpriteBatch 假设您的世界空间与客户空间相同(左上角是 (0,0),宽度和高度是视口的大小)并为您处理投影。(实际上它比这更先进 - 它会为您应用偏移量,以便精灵像素与屏幕像素对齐。)

如果要绘制精灵,使世界在视口中显示为 256 单位宽和 240 单位高,则可以将这样的矩阵传递给SpriteBatch.Begin

Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)

值得注意的是,在新的 XNA 4.0 中,您可以使用 SpriteBatch 使用自定义顶点着色器进行绘制,因此您可以使用任意世界视图项目矩阵。

于 2010-06-11T04:26:06.383 回答