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

时间:2012-12-24 21:14:14

标签: c++ opengl 2d sdl scaling

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

我无法在此发布图片,但我在gamedev.net中创建了一个帖子,如果您需要更多信息,可以参考。 http://www.gamedev.net/topic/636257-opengl-2d-selection-scaling-multiple-times/

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

// modify mouse coordinates to fit scaled image
            _mouseStart.x = ((_mouseStart.x / SCREEN_WIDTH) * (_portionEnd.x - _portionStart.x)) + _portionStart.x;
            _mouseStart.y = ((_mouseStart.y / SCREEN_HEIGHT) * (_portionEnd.y - _portionStart.y)) + _portionStart.y;
            _mouseEnd.x = ((_mouseEnd.x / SCREEN_WIDTH) * (_portionEnd.x - _portionStart.x)) + _portionStart.x;
            _mouseEnd.y = ((_mouseEnd.y / SCREEN_HEIGHT) * (_portionEnd.y - _portionStart.y)) + _portionStart.y;

以下是我将glOrtho重置为居中并显示所选区域的方法。

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

1 个答案:

答案 0 :(得分:3)

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

  • 蓝色矩形是您的(未经展开的)基本视口。
  • 小绿色矩形是在基本视口中选择的区域
  • 大绿色矩形是新的缩放视口
  • 在缩放视口内选择一个新矩形(红色矩形)

红色矩形的红色坐标是您应从鼠标位置获得的坐标。您可以使用此坐标计算当前缩放视口的值(绿色坐标)。要获得最终的未校正坐标(蓝色值),您必须添加绿色矩形的偏移量(228,88)。

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

computation