Monday, February 18, 2019

opengl - Zooming to point of interest


I have the following variables:



  • Point of interest which is the position(x,y) in pixels of the place to focus.

  • Screen width,height which are the dimensions of the window.

  • Zoom level which sets the zoom level of the camera.



And this is the code I have so far.


void Zoom(int pointOfInterestX,int pointOfInterstY,int screenWidth,
int screenHeight,int zoomLevel)
{
glScalef(1,1,1);
glTranslatef( (pointOfInterestX/2) - (screenWidth/2), (pointOfInterestY/2) - (screenHeight/2),0);

glScalef(zoomLevel,zoomLevel,1);
}


And I want to do zoom in/out but keep the point of interest in the middle of the screen. but so far all of my attempts have failed and I would like to ask for some help.



Answer



So you want zoom just like in google maps? If you hover over city and zoom there cursor stays top of that city. This give smooth transition.


        public static final void zoom(float amount, float toX, float toY) {
float oldZ = camera.zoom;
camera.zoom += amount;
// If zooming still has effect then we need translate map towards cursor
if (camera.zoom < minZoom) {
camera.zoom = minZoom;

} else if (camera.zoom > maxZoom) {
camera.zoom = maxZoom;
} else {
float a = (toX - (float) HALFSCREENSIZEX)
* (oldZ - camera.zoom);
float b = (-toY + (float) HALFSCREENSIZEY)
* (oldZ - camera.zoom);
camera.translate(a, b, 0);
//check boundaries if you have any.
}

}

To make this work with matrix stack you might have to peek there http://code.google.com/p/libgdx/source/browse/trunk/gdx/src/com/badlogic/gdx/graphics/OrthographicCamera.java


Zooming is just multiplier for viewport size there. I have done this with matrix stack too but its much cleaner to use camera class.


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...