3d 在XNA中使用CreateOrthographic偏心

3d 在XNA中使用CreateOrthographic偏心,3d,xna,camera,render,orthographic,3d,Xna,Camera,Render,Orthographic,我正试图弄清楚如何在XNA中绘制图形,有人提出了这个建议。 但是在我尝试使用这个之前 如果我创建并使用这个相机,并将LEFT、TOP设置为0,WIDTH=256,HEIGHT=240,那么我渲染到屏幕上的任何东西都将使用这些坐标?因此,宽度和高度为1的框,如果设置为0,0,将占用0,0到1,1之间的空间。您所指的函数是:Matrix.createOrthographic Offcenter(左、右、下、上、zNearPlane、zFarPlane) 这将返回可用于将世界空间中的点转换为投影空间中

我正试图弄清楚如何在XNA中绘制图形,有人提出了这个建议。 但是在我尝试使用这个之前


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

您所指的函数是:
Matrix.createOrthographic Offcenter(左、右、下、上、zNearPlane、zFarPlane)

这将返回可用于将世界空间中的点转换为投影空间中的点的投影矩阵

投影空间从视口左下角的(-1,-1)到右上角的(1,1)。这是GPU在光栅化时实际工作的坐标空间

世界空间是你想要的

假设您使用
matrix.createOrthographicalOffcenter(0,256,240,0,-10,10)
创建一个矩阵,然后使用该矩阵作为投影矩阵,使用BasicFect绘制立方体模型。假设立方体模型以原点为中心,大小为1(长度、宽度和高度)

除了
basicfect.Projection
,您还可以设置
basicfect.View=Matrix.Identity
(因为我们不需要额外的摄影机变换)和
basicfect.World=Matrix.CreateTranslation(0.5f,0.5f,0)
来转换模型,使其在世界空间中从(0,0)存在到(1,1)。然后使用基本效果绘制模型

立方体的顶面(正交投影意味着没有透视)将在视口的左上角绘制。它将占据视口宽度的1/256和高度的1/240(另请参见
GraphicsDevice.viewport

(注:我不记得这种投影是如何影响背面消隐的。如果你看不到任何东西,试着关闭它或切换缠绕顺序。)


现在,这么说吧——我从你的其他问题(以及你想要制作正交矩阵的事实)中得到了一种感觉,你想要做2D精灵的工作。BasicFect主要是为进行3D工作而设计的(尽管如果您制作自己的顶点着色器,不推荐用于精灵,您将需要一个投影矩阵)

您可能想使用XNA的SpriteBatch,尤其是因为它对绘制精灵进行了大量优化
SpriteBatch.Begin
将采用
矩阵转换矩阵
作为参数。这相当于上面的世界和视图矩阵,而不是投影矩阵

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

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

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


值得注意的是,在新的XNA 4.0中,您可以使用任意的世界视图项目矩阵。

嘿,安德鲁!谢谢你的回答。我一下子就接受了。不管怎样,我以前试过使用SpriteBatch,但它在屏幕上绘制精灵时会窒息而死。我更喜欢一次画一个像素的精灵,或者至少我正在尝试这样做。有人建议我这么做。。。。我尝试的所有其他工作都是使用SpriteBatch,所以我很清楚该类是如何工作的。谢谢你!不客气。我仍然高度怀疑您是否正确使用了SpriteBatch,如果它只是令人窒息的话。没有比SpriteBatch更快的方法来绘制真实的精灵。您是否在一个批次中绘制所有内容,以尽可能少的纹理(尝试sprite sheets?)并按纹理顺序绘制?(顺便说一句:我的计算表明SpriteBatch可以以60FPS的速度获得20k左右的精灵-如果你仍在尝试疯狂的每像素一个精灵的话,这是不够的。)我至少花了一天的时间尝试将3D原语渲染到2D空间,非常感谢你的回答+1表示“投影空间从视口左下角的(-1,-1)到右上角的(1,1)。这是GPU在光栅化时实际工作的坐标空间。”非常有用。你知道有一个集中的资源可以解释XNA的“一切”吗?文档是有效的,但它只是列出了它拥有的东西,而不是预期用途或所有东西是如何组合在一起的。