1

我可能有一个简单的数学问题,我很难弄清楚。我有一个可调整大小的 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 回答 1

1

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

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

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

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

于 2012-09-16T13:11:30.170 回答