C++ 将SDL窗口位置转换为OpenGL世界位置

C++ 将SDL窗口位置转换为OpenGL世界位置,c++,opengl,2d,sdl,scaling,C++,Opengl,2d,Sdl,Scaling,我在这个项目中使用SDL和OpenGL。我在程序启动时的屏幕是640 x 480,我的GLORTO设置也是如此。所以程序开始时是同步的。但我的程序允许用户用鼠标选择要放大的部分显示。例如,用户可以选择从320240(_mouseStart)到640480(_mouseEnd)的区域。然后将该选择区域传递到glOrtho,以便它可以居中并放大选定区域。我的问题是,当我尝试选择已放大区域的一个区域时,因为SDL鼠标坐标在0,0到640480之间,而不是选择的新区域(在本例中为320、240到6404

我在这个项目中使用SDL和OpenGL。我在程序启动时的屏幕是640 x 480,我的GLORTO设置也是如此。所以程序开始时是同步的。但我的程序允许用户用鼠标选择要放大的部分显示。例如,用户可以选择从320240(_mouseStart)到640480(_mouseEnd)的区域。然后将该选择区域传递到glOrtho,以便它可以居中并放大选定区域。我的问题是,当我尝试选择已放大区域的一个区域时,因为SDL鼠标坐标在0,0到640480之间,而不是选择的新区域(在本例中为320、240到640480)。我需要一种方法来计算什么是真正的鼠标位置时,试图选择和已经放大的地区

我无法在这里发布图片,但我已经在gamedev.net中创建了一个帖子,如果您需要更多信息,可以参考该帖子

在这里,我在用户选择一个区域(现在是正确的)后计算所有鼠标位置信息

下面是我如何将glOrtho重置为中心并显示选定区域的方法

glLoadIdentity();
glOrtho(_portionStart.x, _portionEnd.x, _portionEnd.y, _portionStart.y, 1, -1);

我创建了一个图像来解释这个过程(我希望)

  • 蓝色矩形是(未缩放的)基础视口
  • 小绿色矩形是在“基础”视口中选定的区域
  • 大绿色矩形是新缩放的视口
  • 在缩放的视口中,将选择一个新矩形(红色矩形)
红色矩形处的红色坐标是从鼠标位置获得的坐标。可以使用此坐标计算当前缩放视口的值(绿色坐标)。要获得最终未缩放的坐标(蓝色值),必须添加绿色矩形(228,88)的偏移量

请注意,我的示例不是最好的,因为绿色矩形的偏移量和绿色矩形的高度是相同的(两个值都是228)


感谢您提供了详细的示例,但我想反其道而行之。我试图从未缩放的x和y坐标计算缩放的x和y坐标。换句话说,我正试图从蓝色坐标计算绿色坐标,从绿色坐标计算红色坐标。你确定你理解我的图片吗?我想我在左上角的红色x坐标上犯了一个错误,因为120太小了。但如果你看右下角
(564392)
是您获得的鼠标绝对位置(从
0,0
640480
330186
是相对于绿色矩形的坐标,
558274
是可以用来计算新视口的坐标。因此,红色坐标是鼠标的绝对坐标。因此,我们首先将显示宽度乘以选择宽度,然后除以鼠标绝对x坐标,得到对应于放大图像的x坐标。我们使用新的x坐标,并将当前放大选择的起始x坐标值添加到该坐标中。我们对y值也这样做,应该就是这样。是吗?是的,这应该有用<代码>[鼠标位置]/[最大水平鼠标坐标]*[选择宽度]+[缩放部分的x偏移量]->
564/640*374+228
正常工作!!你真是个天才!我花了这么长时间才弄到这个!我很感激。
glLoadIdentity();
glOrtho(_portionStart.x, _portionEnd.x, _portionEnd.y, _portionStart.y, 1, -1);