我可能有一个简单的数学问题,我很难搞清楚。我有一个可调整大小的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
“不同步”。根据调整大小的窗口大小,它会“跳跃”一点或多一点。
当精灵光标与边框接触时,我会执行以下操作:
我觉得这有一个简单的数学解决方案,但我无法弄清楚(我已经尝试过了......但是......)。
我希望我的问题不是太模糊,而且我提供了足够的信息!
答案 0 :(得分:1)
首先,您的窗口大小与OpenGL的大小相匹配。但是当您调整窗口大小时,投影必须更改。因此,至少添加了缩放因子。这解释了为什么游标不同步。
如果您想让它们始终保持同步,您必须将窗口坐标映射到世界坐标。这可以通过gluUnProject
OpenGL: gluUnProject来完成。您已经手动完成了这项操作,但没有考虑导致问题的分辨率变化。
为了完整性,从世界坐标到窗口坐标的反向也是可能的OpenGL: gluProject
使用这些功能时,您必须掌握模型矩阵,投影矩阵和视口。为此目的使用glGet *系列的功能。务必将这些矩阵加载到正确设置的位置!