Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XNA将矩形装配到屏幕中_C#_Xna_Xna 4.0 - Fatal编程技术网

C# 使用XNA将矩形装配到屏幕中

C# 使用XNA将矩形装配到屏幕中,c#,xna,xna-4.0,C#,Xna,Xna 4.0,我正在用XNA绘制一个带有基本体的矩形。宽度为: width = GraphicsDevice.Viewport.Width 高度是 height = GraphicsDevice.Viewport.Height 我试图将这个矩形放在屏幕上(使用不同的屏幕和设备),但我不确定将相机放在Z轴的何处。有时相机太近,有时太远 这是我用来获取相机距离的方法: //Height of piramid float alpha = 0; float beta = 0; float gamma = 0;

我正在用XNA绘制一个带有基本体的矩形。宽度为:

width = GraphicsDevice.Viewport.Width 
高度是

height = GraphicsDevice.Viewport.Height
我试图将这个矩形放在屏幕上(使用不同的屏幕和设备),但我不确定将相机放在Z轴的何处。有时相机太近,有时太远

这是我用来获取相机距离的方法:

//Height of piramid
float alpha = 0;
float beta = 0;
float gamma = 0;

alpha = (float)Math.Sqrt((width / 2 * width/2) + (height / 2 * height / 2));
beta = height / ((float)Math.Cos(MathHelper.ToRadians(67.5f)) * 2);
gamma = (float)Math.Sqrt(beta*beta - alpha*alpha);

position = new Vector3(0, 0, gamma);

你知道把相机放在Z轴的什么位置吗?

这样做的诀窍是直接在光栅空间中绘制矩形。这是GPU在实际渲染内容时工作的空间

通常,模型在其自己的模型空间中启动,然后应用世界变换将其转换到世界空间中。然后应用视图变换以围绕摄影机移动世界中的点(以获得摄影机围绕世界移动的效果)。然后应用投影矩阵,将所有这些点放入GPU用于绘图的空间

碰巧的是,无论屏幕大小,该空间总是从视口左下角的(-1,-1)到右上角的(1,1)(以及Z轴上的0到1表示深度)

因此,诀窍是将所有矩阵(世界、视图、项目)设置为
Matrix.Identity
,然后从(-1,-1,0)到(1,1,0)绘制一个矩形。您可能还需要设置
DepthStencilState.None
,这样它就不会影响深度缓冲区



另一种方法是只使用
SpriteBatch
并绘制一个与
视口大小相同的矩形

哪些场景离得太近,哪些场景离得太远?您的代码看起来应该产生一致的结果。另外,您使用的投影是透视还是平行/正交?我使用的是fov:PiOver4透视。只是想让我在加载游戏时绘制的基本矩形适合屏幕(因为它的大小与屏幕相同),你能发布“太近”和“太远”案例的屏幕截图吗?假设矩形是红色的。在windows机器上,整个屏幕变成红色,我必须缩小很多,以便能看到背景。在windows phone上则相反。矩形看起来更小,所以我看到了背景,我必须放大以填充屏幕。目的是什么?全屏效果?我要试试。但问题是,为什么SpriteBatch的行为应该与原语不同?它没有
SpriteBatch
具有覆盖屏幕的隐式正交投影矩阵(正确对齐像素和所有内容)。它将客户机空间转换为光栅空间。变换后,
SpriteBatch
创建的四元体应落在坐标处,就像您将其直接放在坐标上一样。我之所以提到金字塔,是因为它可以更容易地组合在一起(特别是如果你已经在做2D工作的话)。金字塔是一种错误的方法。我只是用了棕褐色皮肤,效果很好。还测试了您的解决方案,它可以正常工作。