2012-12-24 56 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