2012-12-24 57 views
2

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

我无法在此发布图片,但是我在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); 

回答

3

我创建了解释过程(我希望)

  • 蓝色矩形是你的(未缩放)基地视的图像。
  • 小绿色矩形是在基视口中选择的区域
  • 大绿色矩形是新视口
  • 放大在放大后视一个新的矩形被选择(红色的)

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

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

computation

+0

感谢详细的例子,但我试图以相反的方式。我试图从非缩放的x和y坐标计算缩放的x和y坐标应该是什么。换句话说,我试图计算蓝色坐标的绿色坐标和绿色坐标的红色坐标。 – arnm

+0

嗯,你确定你了解我的照片吗?我认为我在左上角的x坐标上犯了一个错误,因为120是小的。但是,如果你看看右下角。 '(564,392)'是你得到的绝对鼠标位置(从'0,0'到'640,480')。 '330,186'是相对于绿色矩形的坐标,'558,274'是您可以用来计算新视口的坐标。 – micha

+0

所以红色的坐标是绝对的鼠标坐标。因此,我们首先将显示宽度乘以选择宽度,然后除以绝对鼠标x坐标以获得与放大图像相对应的x坐标。我们使用该新的x坐标,并为其添加当前放大选择的开始x坐标值。我们也为y值做这个,应该是这样。对? – arnm