이것은 매우 일반적인 질문 인 것처럼 보이지만 같은 상황에있는 사람을 찾을 수 없습니다. 가장 가까운 것 같습니다 : 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를 사용하여 줌을 처리하기 위해 내 코드를 재 구현하려고 시도했지만 다른 문제에 마주 쳤다. 그래서 이렇게 돌아왔다. 아무도 내가이 드래그 이벤트를 처리하는 방법을 제안 할 수 있습니까?
을 그 부서를 생략 할 수 있도록, 당신이 당신의 마우스 움직임을 확장 할 필요가 없습니다 순서를 변경 한 후 실제로 발견 문제는 코드와 광산 모두 잘 작동합니다. totalMovedX 및 totalMovedY를 정수로 저장 했으므로 소수 자릿수가 잘 렸습니다. 정말 기본적인 실수입니다. 답변 해 주셔서 감사합니다. – Simon