调整大小时LWJGL游标出现问题

时间:2012-07-04 22:21:53

标签: java opengl lwjgl

我可能有一个简单的数学问题,我很难搞清楚。我有一个可调整大小的LWJGL(OpenGL)窗口。我正在制作的游戏是2D游戏,但我使用glFrustum()为我的精灵获得深度。这是我的投影代码中的一个(稍微简化的)片段:

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);

(我必须承认,我不太了解这个问题,我在互联网的某个地方发现了这段代码,它对我很有帮助......)

但是,我使用精灵渲染自己的光标,并在光标与窗口边界接触时切换到本机光标。这一切都很顺利,直到我使窗口可调整大小。

现在我的问题是,当我调整窗口大小时,本机光标与精灵光标相对于vRatio“不同步”。根据调整大小的窗口大小,它会“跳跃”一点或多一点。

当精灵光标与边框接触时,我会执行以下操作:

  1. 隐藏精灵光标
  2. 显示原生光标
  3. 将本机光标的位置设置为精灵光标的位置(这不再正常工作)
  4. 我觉得这有一个简单的数学解决方案,但我无法弄清楚(我已经尝试过了......但是......)。

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

1 个答案:

答案 0 :(得分:1)

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

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

为了完整性,从世界坐标到窗口坐标的反向也是可能的OpenGL: gluProject

使用这些功能时,您必须掌握模型矩阵,投影矩阵和视口。为此目的使用glGet *系列的功能。务必将这些矩阵加载到正确设置的位置!