当 windows 调整大小时停止移动 3D 对象 [XNA/WinForms/C#]

Stop 3D objects moving when windows is resized [XNA/WinForms/C#]

我在 windows 表单中有一个 XNA windows,当我调整 window.

大小时我 运行 遇到了问题

我想要的行为是让渲染的立方体完全不动。因此,如果右侧屏幕外有第二个立方体,并且用户将 window 的大小调整到右侧,那么第二个立方体就会出现。所以基本上调整 window 的大小对渲染的元素根本没有影响。

但是当我调整 window 的大小时,例如向右拖动它,立方体也会向右移动 sad.png 当我向下拖动 window 时,立方体会慢慢放大。

这是我为立方体的每个四边形绘制的代码:

GraphicsDevice dev = Core.Device;

dev.BlendState = BlendState.Opaque;
dev.DepthStencilState = DepthStencilState.Default;

dev.SetVertexBuffer(_vb);
dev.Indices = _ib;

effect.View = Matrix.CreateLookAt(new Vector3(0, 0, 150), Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, dev.Viewport.AspectRatio, 0.1f, 10000.0f);
effect.World = Matrix.Identity;

effect.EnableDefaultLighting();
effect.Texture = Texture;

effect.CurrentTechnique.Passes[0].Apply();
dev.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);

我正在使用来自 xna 网站的 winforms/xna 样本。调整 window 大小时,设备将重置,后缓冲区宽度和高度设置为 xna windows 宽度和高度。

这意味着 Viewport.AspectRatio 得到更新并且 3d 立方体没有被拉伸。现在我只需要他们的立场不变。

有人知道我还能尝试什么吗?

这是因为 XNA 对您的 Windows 表单 window 一无所知。这意味着它不知道如何缩放它,所以它自然会把它缩放为 1x1

完成您所要求的最简单方法是将所有内容渲染到 1920x1080 的 RenderTarget,然后使用当前 Window width/height.[=11 绘制该 RenderTarget =]

伪代码:

public void Draw(params)
{
    RenderTarget2D renderTarget = new RenderTarget2D(GraphicsDevice, 1920, 1080); // Might want some parameters, dunno
    GraphicsDevice.SetRenderTarget(renderTarget);

    // Render stuff as usual

    GraphicsDevice.SetRenderTarget(null); // Resets it

    spritebatch.Begin();
    spritebatch.Draw(renderTarget.GetTexture(), new Rectangle(0, 0, WindowWidth, WindowHeight), params...);
    spritebatch.End();
}

我不记得这些是否是确切的方法名称,但大概是这样。

说明:您实际上是在将所有内容渲染到内存中的临时缓冲区(类似于 photoshop 中的绘图)。然后在这样做之后,您可以像处理任何其他 2D 纹理一样处理它。这也意味着您可以将其绘制到屏幕上,并根据需要进行转换(在您的情况下,如果这是您当前的 WinForms 大小,请将其压缩到 800x600);