【问题标题】:Stop 3D objects moving when windows is resized [XNA/WinForms/C#]调整窗口大小时停止 3D 对象移动 [XNA/WinForms/C#]
【发布时间】:2015-02-23 22:18:20
【问题描述】:

我在一个窗口窗体中有一个 XNA 窗口,当我调整窗口大小时遇到​​了问题。

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

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

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

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 示例。当窗口被调整大小时,设备被重置,并且后台缓冲区的宽度和高度被设置为 xna 窗口的宽度和高度。

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

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

【问题讨论】:

    标签: c# winforms 3d xna projection


    【解决方案1】:

    这是因为 XNA 对您的 Windows 窗体窗口一无所知。这意味着它不知道如何缩放它,所以它自然会缩放到 1x1

    完成您所要求的最简单的方法是将所有内容渲染到 1920x1080 的 RenderTarget,然后使用当前窗口宽度/高度绘制该 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 纹理一样使用它。这也意味着您可以将其绘制到屏幕上,并根据需要进行转换(在您的情况下,将其压缩到 800x600,如果这是您当前的 WinForms 大小);

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多