gpt4 book ai didi

c++ - 如何使用 3d 渲染缩放 2d 世界?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:29 31 4
gpt4 key购买 nike

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

现在我遇到了一个我似乎想不出如何解决的问题:

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

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

我的窗口可以调整大小,我的图 block 总是正方形,但可见区域会根据我调整窗口大小的方式扩展。

编辑:我的视口(viewport)使用的是透视模式,而不是等距模式。但如果在透视模式下不可行,我愿意更改为等轴测。

最佳答案

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

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

由于问题更新而更新:

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

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

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

你所要做的就是将视口(viewport)映射到 NDC 到近平面,如果你是 Z =/= near/Z 的近比例。

关于c++ - 如何使用 3d 渲染缩放 2d 世界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298164/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com