在XNA中使用CreateOrthographicOffCenter [英] Using CreateOrthographicOffCenter in XNA

查看:144
本文介绍了在XNA中使用CreateOrthographicOffCenter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to figure out how to draw graphics in XNA, and someone else suggested this. But before I attempt to use this...

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

If I create and use this camera, and set LEFT,TOP to 0 and WIDTH=256 and HEIGHT=240, anything I render to the screen will use these coordinates? So a box with a width and height of 1, if set to 0,0 will take up space from 0,0 to 1,1?

推荐答案

您要引用的函数是: Matrix.CreateOrthographicOffCenter(left,right,bottom,top,zNearPlane,zFarPlane)

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

This returns a projection matrix that can be used to transform a point in world space to a point in projection space.

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

Projection space goes from (-1,-1) in the bottom left corner of the viewport to (1,1) in the top right corner. This is the coordinate space that the GPU actually works in when rasterising.

世界空间是你想要的东西。

World space is whatever you want it to be.

因此,假设您使用 Matrix.CreateOrthographicOffCenter(0,256,240,0,-10,10)创建一个矩阵,投影矩阵用BasicEffect来绘制一个立方体的模型。让我们假设立方体的模型以原点为中心,大小为1(长度,宽度和高度)。

So let's say you create a matrix with Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10), and you used that matrix as your projection matrix with BasicEffect to draw a model of a cube. Let's say the model of the cube is centered at the origin and is of size 1 (length, width and height).

以及 basicEffect .Projection ,您将设置 basicEffect.View = Matrix.Identity (因为我们不想要一个额外的相机转换)和 basicEffect.World = Matrix.CreateTranslation(0.5f,0.5f,0)来翻译你的模型,使它在世界空间中从(0,0)到(1,1)。然后使用BasicEffect绘制您的模型。

As well as basicEffect.Projection, you would set basicEffect.View = Matrix.Identity (because we don't want an additional camera transformation) and basicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0) to translate your model so that it exists from (0,0) to (1,1) in world space. Then draw your model using that BasicEffect.

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

The top face of your cube (orthographic projection means that there is no perspective) will be drawn at the top left corner of the viewport. It will take up 1/256th of the width and 1/240th of the height of the viewport (see also GraphicsDevice.Viewport).

(PS:我不记得背面剔除是如何受到这种投影的影响的,如果你看不到任何东西,试试把它关闭或切换绕组顺序。)

(PS: I can't remember how backface culling is affected by this kind of projection. If you see nothing try turning it off or switching the winding order.)

现在,这是说 - 我从一个感觉,从你的其他问题(和你想做一个正交矩阵的事实),你想做2D精灵工作。 BasicEffect主要用于做3D工作(虽然如果你制作自己的顶点着色器,不推荐使用sprite,你需要一个投影矩阵)。

Now, this being said - I get a sense from your other questions (and the fact you want to make an orthographic matrix) that you want to do 2D sprite work. BasicEffect is designed primarily for doing 3D work (although if you make your own vertex shader, not recommended for sprites, you will need a projection matrix).

你可能想要使用XNA的SpriteBatch - 不是最重要的,因为它是为绘图精灵优化的 SpriteBatch.Begin 会将 Matrix transformMatrix 作为参数。这相当于上面的世界和视图矩阵,不是投影矩阵。

You probably want to use XNA's SpriteBatch - not least of all because it's heavily optimised for drawing sprites. SpriteBatch.Begin will take a Matrix transformMatrix as an argument. This is equivalent to the World and View matrix, above, not the Projection matrix.

SpriteBatch假设你的世界空间与客户空间相同(左上角是(0,0),width和height是视口的大小),并为您处理投影。 (实际上它比这更先进 - 它会为你应用一个偏移,使sprite像素与屏幕像素排列。)

SpriteBatch assumes your world space is the same as client space (top left is (0,0), width and height are the size of the viewport) and handles the projection for you. (Actually it is more advanced than this - it will apply an offset for you so that sprite pixels line up with screen pixels.)

如果你想画sprite,世界在视口中显示256个单位宽和240个单位高,您可以将这样的矩阵传递给 SpriteBatch.Begin

If you want to draw sprites so that world appears 256 units wide and 240 units high in the viewport, you could pass a matrix like this to SpriteBatch.Begin:

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

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

It is worth noting that in the new XNA 4.0 you can use SpriteBatch to draw with custom vertex shaders and so you may use arbitrary world-view-project matrices.

这篇关于在XNA中使用CreateOrthographicOffCenter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆