在XNA中使用CreateOrthographicOffCenter

Jef*_*ern 3 3d xna camera render orthographic

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

如果我创建并使用此相机,并将LEFT,TOP设置为0,WIDTH = 256和HEIGHT = 240,我渲染到屏幕的任何内容都将使用这些坐标?所以一个宽度和高度为1的盒子,如果设置为0,0将占用0,0到1,1的空间?

And*_*ell 14

你指的功能是: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.BeginMatrix transformMatrix作为一个论点.这相当于上面的World和View矩阵,而不是 Projection矩阵.

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

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

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

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