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

查看:20
本文介绍了在 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.

世界空间随心所欲.

假设您使用 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 工作(尽管如果您制作自己的顶点着色器,不推荐用于精灵,您将需要一个投影矩阵).

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),宽度和高度是视口的大小)并为您处理投影.(实际上它比这更高级 - 它会为您应用偏移量,以便精灵像素与屏幕像素对齐.)

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.)

如果您想绘制精灵以便世界在视口中显示为 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天全站免登陆