我在OpenGl和C++中创建了一个基本游戏,并且希望这样做是为了当玩家到达屏幕边缘时,他们不能再进一步移动。我无法确定屏幕边缘的位置。我知道windows通常有一个1到-1的系统,但我的似乎更像是0.63到-0.63。玩家在屏幕上显示为具有x,y和z位置的框,但它只会在2D空间中移动。OpenGl坐标系不是-1到1
我想改变边界,使它们在-1和1之间,而不是奇数值。
我该怎么做?
代码已上传至http://pastebin.com/jxd5YhHa。
我在OpenGl和C++中创建了一个基本游戏,并且希望这样做是为了当玩家到达屏幕边缘时,他们不能再进一步移动。我无法确定屏幕边缘的位置。我知道windows通常有一个1到-1的系统,但我的似乎更像是0.63到-0.63。玩家在屏幕上显示为具有x,y和z位置的框,但它只会在2D空间中移动。OpenGl坐标系不是-1到1
我想改变边界,使它们在-1和1之间,而不是奇数值。
我该怎么做?
代码已上传至http://pastebin.com/jxd5YhHa。
如果你不会是动态变化的投影矩阵,最容易做的事情是打电话
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一起获得这两者。
视口参数可能与您的窗口具有相同的尺寸。无论如何,这是你用glViewport设置的。
这里假设您的XZ平面位于z == 0.
这种工作除了0.63是一个猜测无论如何,以确切知道屏幕的界限任何时候? – user2296321
@ user2296321请参阅编辑。这应该非常接近你需要做的事情。 – Aeluned
视口目前未定义我该怎么做? – user2296321
您的视角平截头体是什么样的? –
我猜想它是45度角的1到1000(gluPerspective(45.0,(float)WIDTH /(float)HEIGHT,1,1000)) – user2296321
[在openGL中设置窗口的大小](http: /stackoverflow.com/questions/16090612/setting-the-size-of-a-window-in-opengl) – datenwolf