【问题标题】:Convert SDL window position to OpenGL world position将 SDL 窗口位置转换为 OpenGL 世界位置
【发布时间】:2012-12-11 03:14:42
【问题描述】:

我在这个项目中使用 SDL 和 OpenGL。我在程序启动时的屏幕是 640 x 480,我的 glOrtho 设置也是如此。所以程序开始同步。但是我的程序允许用户使用鼠标创建选择要放大的显示部分。例如,用户可以选择从 320,240 (_mouseStart) 到 640,480 (_mouseEnd) 的区域。然后将此选择区域传递给 glOrtho,以便它可以居中并放大所选区域。我的问题是当我尝试选择一个已经放大区域的区域时,因为 SDL 鼠标坐标在 0,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);

【问题讨论】:

    标签: c++ opengl 2d sdl scaling


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您提供详细示例,但我正试图采取相反的方式。我正在尝试根据非缩放的 x 和 y 坐标计算缩放的 x 和 y 坐标。换句话说,我试图从蓝色坐标计算绿色坐标,从绿色坐标计算红色坐标。
    • 嗯,你确定你看懂了我的图片吗?我想我在左上角的红色 x 坐标上犯了一个错误,因为 120 太小了。但是如果你看右下角。 (564,392) 是您获得的绝对鼠标位置(从 0,0640,480)。 330,186 是相对于绿色矩形的坐标,558,274 是您可以用来计算新视口的坐标。
    • 所以红色坐标是鼠标的绝对坐标。所以我们首先将显示宽度乘以选择宽度,然后除以鼠标的绝对x坐标,得到放大后的图像对应的x坐标。我们使用这个新的 x 坐标并将当前放大选择的起始 x 坐标值添加到它。我们对 y 值也这样做,应该是这样。对吗?
    • 是的,这应该可以。 [mouse position] / [maximal horizontal mouse coordinate] * [selection width] + [x offset for the zoomed section] -> 564 / 640 * 374 + 228
    • 好的,成功了!!你真是个天才!我花了这么长时间才得到这个!我很感激。
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多