如何使用三维渲染缩放二维世界

How to scale 2d world with 3d rendering?

本文关键字:缩放 二维世界 何使用 三维      更新时间:2023-10-16

我使用3d模式渲染我的2d游戏,因为相机的旋转和放大/缩小比2d模式容易得多。

现在我遇到了一个我似乎无法思考如何解决的问题:

  • 如何使我的世界的二维平面适合屏幕,使1个纹理像素与屏幕上的1个像素匹配?换句话说:我如何计算相机的z位置来实现这一点

我的纹理坐标从0开始,到1结束,所以我可以在GL_NEAREST纹理过滤器模式下看到一个瓦片中的所有像素。

我的窗口可以调整大小,因为我的瓷砖总是正方形的,但可视区域会根据我调整窗口大小的方式而扩展。

编辑:我的视图端口正在使用透视模式,而不是等轴测模式。但如果在透视模式下不可能,我愿意改为等轴测。

使用将眼睛空间单位映射到像素的正交投影:

glViewport(0,0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);

因问题更新:

纹素→使用透视投影可以进行视口像素匹配,但仅在特定约束条件下:纹理四边形必须与透视平截头体近/远平面共面。

怎么做?对于Z=near的glFrustum(left, right, bottom, top, near, far),XY眼睛空间范围[left,right]×[bottom,top]映射到NDC XY[-1,1]²,NDC XY[1,1]²映射到视口范围。这些都是遵循定律的仿射变换

y(x) = to_lower_bound + (x - from_lower_bound) * (to_upper_bound - to_lower_bound) / (from_upper_bound - from_lower_bound)

你所要做的就是将视口映射到NDC到近平面,如果你是Z=/=按近/Z缩放。