You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX 3D开发:在不改变透视的情况下偏移相机

解决3D场景视口偏移问题

1. 排查glViewport无效的原因

  • 你调用glViewport(0, 100, w, h)没效果,大概率是调用时机不对。必须在绘制任何内容之前调用,且如果用了离屏渲染,要在绑定对应帧缓冲(FBO)之后执行。如果用了渲染框架,得找框架的预绘制回调来放这段代码,避免被框架的自动视口重置覆盖——很多引擎会每帧自动把视口设回窗口大小,要么禁用这个逻辑,要么把你的glViewport调用放在它之后。

2. 用Camera的project参数实现无透视变化的偏移

你看到的project方法里的viewportX/viewportY参数,就是专门用来做这种「透视不变的视口偏移」的,完全符合你要的第二张图效果:

  • 不用手动调glViewport,直接修改Camera的这两个参数:把viewportX设为水平偏移量,viewportY设为垂直偏移量,保持viewportWidth和viewportHeight为窗口实际宽高。
  • 修改后必须调用Camera的投影矩阵更新方法(比如updateProjectionMatrix()),确保新的偏移参数被写入投影矩阵,这样渲染时才会生效。
  • 原理:这两个参数会修改投影矩阵中NDC到屏幕坐标的映射逻辑,相当于整个画面平移,透视关系完全不变。

3. 区分两种偏移需求的实现方式

  • 仅偏移位置(透视不变):除了上面的Camera参数法,还可以在顶点着色器里直接调整最终坐标——比如把gl_Position.xy加上vec2(offsetX/windowWidth*2.0, offsetY/windowHeight*2.0)(因为NDC的范围是[-1,1],要把像素偏移转换成NDC偏移)。
  • 偏移且改变透视:这种不是单纯的视口偏移,本质是修改了Camera的观测角度,需要调整Camera的世界空间位置,或者修改投影矩阵的FOV、近远裁剪面等参数。

4. 备选方案:离屏渲染后平移绘制

如果上面的方法受限于框架无法实现,试试离屏渲染:

  • 先把场景完整渲染到一个和窗口同尺寸的帧缓冲(FBO)中。
  • 然后把FBO的纹理作为2D图像绘制到屏幕上,绘制时给顶点加上偏移量,就能实现整个画面的平移,透视也不会改变。这种方式更灵活,也方便叠加其他后期效果。

内容的提问来源于stack exchange,提问作者yahelck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:10:30