2011-05-02 3 views
3

이것은 매우 일반적인 질문 인 것처럼 보이지만 같은 상황에있는 사람을 찾을 수 없습니다. 가장 가까운 것 같습니다 : OpenGL: scale then translate? and how?.OpenGl 2d 확대/축소 (glOrtho 대신 비율 및 변환 사용)

내가 정말 도움이 될만한 문제는 OpenGl을 사용하여 2 차원 장면을 확대 (축소)하는 동안 주위를 둘러 보는 것입니다. 축소의 코드는 매우 간단하다 : 확대를위한

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

코드는 (currentScale에 zoomFactor을 추가하고, 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를 정수로 저장 했으므로 소수 자릿수가 잘 렸습니다. 정말 기본적인 실수입니다. 답변 해 주셔서 감사합니다. – Simon