如何用3d渲染来缩放2d世界?

Roo*_*kie 5 c++ opengl

我正在使用3D模式渲染我的2D游戏,因为相机旋转和放大/缩小比使用2D模式更容易.

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

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

我的texcoords从0开始并结束为1,因此我可以在GL_NEAREST纹理过滤器模式中看到来自一个图块的所有像素.

我的窗口可调整大小,使得我的图块始终是正方形,但可见区域会根据我调整窗口的大小而扩展.

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

dat*_*olf 2

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

\n\n
glViewport(0,0, width, height);\nglMatrixMode(GL_PROJECTION);\nglLoadIdentity();\nglOrtho(0, width, 0, height, -1, 1);\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于问题更新而更新:

\n\n

纹理元素 \xe2\x86\x92 视口像素匹配可以通过透视投影进行,但仅在一定的约束下:纹理四边形必须与透视平截头体近/远平面共面。

\n\n

怎么做?对于glFrustum(left, right, bottom, top, near, far)Z=near,XY 眼空间范围 [left, right]\xc3\x97[bottom, top] 映射到 NDC xy[-1, 1]\xc2\xb2 和 NDC xy[-1, 1]\xc2\ xb2 映射到视口范围。所以这些都是遵循规律的仿射变换

\n\n
y(x) = to_lower_bound + (x - from_lower_bound) * (to_upper_bound - to_lower_bound) / (from_upper_bound - from_lower_bound)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您所要做的就是将视口映射到 NDC 到近平面,并且如果您是 Z ==/= 近比例 by 近/Z。

\n

  • 如果您想要从屏幕像素到世界单位的 1:1 映射,为什么要使用透视图矩阵? (4认同)