C++ 将SDL窗口位置转换为OpenGL世界位置
我在这个项目中使用SDL和OpenGL。我在程序启动时的屏幕是640 x 480,我的GLORTO设置也是如此。所以程序开始时是同步的。但我的程序允许用户用鼠标选择要放大的部分显示。例如,用户可以选择从320240(_mouseStart)到640480(_mouseEnd)的区域。然后将该选择区域传递到glOrtho,以便它可以居中并放大选定区域。我的问题是,当我尝试选择已放大区域的一个区域时,因为SDL鼠标坐标在0,0到640480之间,而不是选择的新区域(在本例中为320、240到640480)。我需要一种方法来计算什么是真正的鼠标位置时,试图选择和已经放大的地区 我无法在这里发布图片,但我已经在gamedev.net中创建了一个帖子,如果您需要更多信息,可以参考该帖子 在这里,我在用户选择一个区域(现在是正确的)后计算所有鼠标位置信息 下面是我如何将glOrtho重置为中心并显示选定区域的方法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
glLoadIdentity();
glOrtho(_portionStart.x, _portionEnd.x, _portionEnd.y, _portionStart.y, 1, -1);
我创建了一个图像来解释这个过程(我希望)
- 蓝色矩形是(未缩放的)基础视口
- 小绿色矩形是在“基础”视口中选定的区域
- 大绿色矩形是新缩放的视口
- 在缩放的视口中,将选择一个新矩形(红色矩形)
感谢您提供了详细的示例,但我想反其道而行之。我试图从未缩放的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);