簡體   English   中英

OpenGl 2d 縮放(使用縮放和平移而不是 glOrtho)

[英]OpenGl 2d zooming (using scale and translate instead of glOrtho)

似乎這是一個很常見的問題,但我找不到與我相同情況的人。 最接近的似乎是: OpenGL:縮放然后翻譯? 如何? .

我真正需要幫助的問題是在使用 OpenGl 放大(和縮小)2d 場景時四處移動。 縮小的代碼非常簡單:

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;
}

在不放大或縮小的情況下拖動效果很好。 縮放效果很好。 放大/縮小時拖動效果不佳:) 基本上,放大時,canvas 的移動速度比鼠標慢很多。 縮小時相反。

我已經嘗試了我能想到的一切,並且閱讀了很多關於有類似問題的人的網站。 我還嘗試使用 glOrtho 重新實現我的代碼來處理縮放,但最終遇到了其他問題,所以回到了這種方式。 有人可以建議我如何處理這些拖動事件嗎?

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

將您的代碼更改為:

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM