gpt4 book ai didi

java - LWJGL 调整大小时光标出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:20 24 4
gpt4 key购买 nike

我可能有一个简单的数学问题,但我却出乎意料地难以解决。我有一个可调整大小的 LWJGL (OpenGL) 窗口。我正在制作的游戏是 2D 的,但我使用 glFrustum() 来获取 Sprite 的深度。这是我的投影代码的一个(稍微简化的)片段:

double divider = 64.0;
double left = -vw / divider;
double right = vw / divider;
double bottom = vh / divider;
double top = -vh / divider;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left * aspect, right * aspect, bottom, top, 8, 65536);

float zModifier = -256;
float vRatio = Game.HEIGHT / Display.getHeight();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-vw / 2.0f, -vh / 2.0f, zModifier * vRatio);

(我必须承认,我不太了解截锥体,我在互联网上的某个地方找到了这段代码,它对我很有帮助......)

但是,我用 Sprite 渲染自己的光标,并在光标接触窗口边框时切换到 native 光标。在我调整窗口大小之前,这一切都很顺利。

现在我的问题是,当我调整窗口大小时, native 光标与相对于 vRatio 的 Sprite 光标“不同步”。它会“跳跃”一点或更多,具体取决于调整后的窗口大小。

当 Sprite 光标接触边框时,我执行以下操作:

  1. 隐藏 Sprite 光标
  2. 显示 native 光标
  3. 将 native 光标的位置设置为 Sprite 光标的位置(这不再正常工作)

我觉得有一个简单的数学解决方案,但我无法弄清楚(我已经尝试过......但是......)。

我希望我的问题不是太模糊,并且我提供了足够的信息!

最佳答案

首先,您的窗口大小与 OpenGL 的大小相匹配。但是当您调整窗口大小时,投影必须改变。所以至少添加了一个缩放因子。这解释了为什么光标不同步。

如果你想让它们始终保持同步,你必须将窗口坐标映射到世界坐标。这可以通过 gluUnProject OpenGL: gluUnProject 来完成。您已经手动执行此操作,但没有考虑导致问题的分辨率变化。

为了完整起见,从世界坐标到窗口坐标的相反操作也是可能的 OpenGL: gluProject

使用这些函数时,您必须掌握模型矩阵、投影矩阵和视口(viewport)。为此目的,请使用 glGet* 系列的函数。请务必在正确设置的位置加载这些矩阵!

关于java - LWJGL 调整大小时光标出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335973/

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