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

标签 c++ opengl 2d sdl scaling

我在这个项目中使用 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);

最佳答案

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

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

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

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

computation

关于c++ - 将 SDL 窗口位置转换为 OpenGL 世界位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025740/

相关文章:

c++ - Visual Studio 忽略 "Additional Library Directories"字段

c++ - 我们是否需要在每次调用 SQLExecdirect 之前调用 SQLAllocHandle 来分配一个 SQLHSTMT

c++ - 当一个 list<T> 被分配给另一个 list<T> 变量时,内容会发生什么变化?

Java:动态连接未指定数量的二维数组

c# - 合并接触的多边形给出错误的结果

c++ - 返回 Iterator 时发生转换错误

c++ - OpenGL 纹理不渲染

c# - OpenGL - 单 channel 立方体贴图不产生输出

将三角形带的顶点转换为多边形的算法

opencv - 在 OpenCV 中查找像素的世界空间坐标