对于使用BasicEffect 的3D 内容(以及其他实现IEffectMatrices 的效果,如here 所述),您可以使用适当的成员来设置您喜欢的世界、视图和投影矩阵.
那么在你的 OpenGL 代码中你有这个:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(FieldOfView, Width / Height, 1, 1000);
在XNA中相当于是在效果上设置一个投影矩阵,像这样:
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
FieldOfView, Width / Height, 1, 1000);
现在,对于 2D。以下是您在 OpenGL 中可能拥有的内容:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
如果您使用效果(即使使用SpriteBatch,如here 所解释的那样),基本思想与使用 3D 相同:
effect.Projection = Matrix.CreateOrthographicOffCenter(
0, width, height, 0, 0, 1);
现在,如果您使用的是SpriteBatch没有自定义效果(如果您实际上不需要自定义效果,我会推荐这个),您必须记住,默认情况下,SpriteBatch 使用的投影相当于:
effect.Projection = Matrix.CreateTranslation(-0.5f, -0.5f, 0)
* Matrix.CreateOrthographicOffCenter(0,
GraphicsDevice.Viewport.Width,
GraphicsDevice.Viewport.Height, 0, 0, 1);
它给出了一个“客户空间”(左上角是 (0,0))坐标系,与像素中心对齐。
如果你想调整那个空间,你可以传入一个变换矩阵到SpriteBatch.Begin (this overload)。
所以为了获得你想要的效果(固定数量的世界单位出现在屏幕上,无论屏幕大小),你可以通过这个转换来抵消来自客户端空间的内置投影:
Matrix.CreateScale(GraphicsDevice.Viewport.Width / 640f,
GraphicsDevice.Viewport.Height / 480f, 1f);
(假设您希望您的可见世界空间为 640 x 480。)
我建议您查看XNA's Matrix on MSDN 的文档,看看您可以创建什么样的矩阵。