我正在OpenGl和C ++中创建一个基本游戏,并希望这样做,以便当玩家到达屏幕边缘时,他们无法继续前进。我无法找到屏幕边缘的位置。我知道窗户通常有一个介于1和-1之间的系统,但我的看起来更像是0.63到-0.63。播放器在屏幕上显示为一个具有x,y和z位置的框,但它只会在2D空间中移动。
我想更改边界,使它们介于-1和1之间,而不是奇数值。
我该怎么做?
代码已上传至http://pastebin.com/jxd5YhHa。
答案 0 :(得分:0)
如果您不打算动态更改投影矩阵,最简单的方法是调用
glScalef(.63f,.63f,1);
投影矩阵。
然后,您可以根据这些值限制移动。
要随时计算世界空间坐标,您应该使用gluUnProject。 假设'x'和'y'分别是窗口的宽度和高度(传递gluPerspective的值),你可以找到世界空间坐标,如下所示:
double world_llx,world_lly,world_llz;
//world coordinates of lower left corner of window
gluUnProject(0, 0, 0, view_mat, proj_mat, viewport,&world_llx,&world_lly,&world_llz);
//world coordinate of upper right corner of window
double world_urx,world_ury,world_urz;
gluUnProject(x,y,0,view_mat,proj_mat,viewport,&world_urx,&world_ury,&world_urz);
view_mat是您的视图矩阵。 proj_mat是你的投影矩阵。你可以使用glGetDouble *和GL_MODELVIEW_MATRIX以及GL_PROJECTION_MATRIX来获得这两个。
viewport参数可能与窗口具有相同的尺寸。无论如何,这是你用glViewport设置的。
这假设您的XZ平面位于z == 0。