2011-05-02 252 views
3

看起來這是一個相當普遍的問題,但我無法找到一個具有相同環境的人。最接近的似乎是:OpenGL: scale then translate? and how?OpenGl 2d縮放(使用縮放和平移代替glOrtho)

我真的想要一些幫助的問題是,如何在使用OpenGl放大(並退出)二維場景時進行移動。爲縮小的代碼非常簡單:

void RefMapGLScene::zoomOut(){ 
    currentScale = currentScale-zoomFactor; 
    double xAdjust = (((get_width())*zoomFactor/2)); 
    double yAdjust = ((get_height()*zoomFactor/2)); 
    zoomTranslateX -= xAdjust; 
    zoomTranslateY -= yAdjust; 
} 

代碼爲放大基本上是相同的(加zoomFactor到currentScale,並增加zoomTranslateX和Y)。

的撕心裂肺一切的代碼也很簡單:

glPushMatrix(); 
glTranslated(-zoomTranslateX, -zoomTranslateY, 0); 

glScaled(currentScale, currentScale, 1); 
glTranslated(totalMovedX, totalMovedY, 0); 

graph->draw(); 

glPopMatrix(); 

從本質上講,zoomTranslate存儲使畫面變焦時移動一點點往中間的需要進行調整。我不會做任何事情,比如移動到鼠標指向的位置,我只是移動到中間位置(即根據您的座標系統向右和向上/向下)。 TotalMovedX和Y存儲鼠標移動如下:

if (parent->rightButtonDown){ 
    totalMovedX += (-(mousex-curx))/currentScale; 
    totalMovedY += (-(mousey-cury))/currentScale; 
} 

拖動而不放大或縮小的作品很好。縮放效果很好。放大/縮小時拖動不起作用:)基本上,放大時,畫布移動比鼠標慢很多。縮小時相反。

我試過了所有我能想到的東西,並且已經閱讀了許多關於類似問題的人的這個網站。我也嘗試使用glOrtho來重新實現我的代碼來處理縮放,但最終面臨着其他問題,所以回到了這種方式。任何人都可以建議我如何處理這些拖延事件?

回答

3

操作順序很重要。矩陣上的操作以與矩陣相乘的相反順序應用。在您的情況下,您可以在縮放之前應用畫布移動,因此您的鼠標拖動也會放大。

你的代碼改成這樣:

glPushMatrix(); 
glTranslated(-zoomTranslateX, -zoomTranslateY, 0); 

glTranslated(totalMovedX, totalMovedY, 0); 
glScaled(currentScale, currentScale, 1); 

graph->draw(); 

glPopMatrix(); 

也正在改變這個順序,你不必擴展您的鼠標移動,這樣你就可以通過currentScale

省略師
if (parent->rightButtonDown){ 
    totalMovedX += (-(mousex-curx)); 
    totalMovedY += (-(mousey-cury)); 
} 
+2

後,我居然發現這個問題,你的代碼和我的工作都很好。我只是將totalMovedX和totalMovedY作爲int保存,這意味着小數被截斷。真正的基本錯誤。謝謝你的回答。 – Simon 2011-05-02 07:26:24