diff --git a/gui/src/main.cpp b/gui/src/main.cpp
index 728c8ca428f952d048564a525a3b4ca45d7fbdef..a0ae730e7a3e449523c2368f800e1deb32875a20 100644
--- a/gui/src/main.cpp
+++ b/gui/src/main.cpp
@@ -139,6 +139,13 @@ int main(int argc, char** argv) {
 #ifndef NDEBUG
 			std::cout << "Zooming" << std::endl;
 #endif
+			//calculate position of mouse cursor in real world
+			glm::vec2 m_real_world = camera.GetWorldXyFromMouse(InputState::mpos_x, InputState::mpos_y);
+			//move camera to position pointed to by cursor
+			camera.MoveTo(m_real_world);
+			//move mouse to screen center (doesn't visually work in remote desktop)
+			SDL_WarpMouseInWindow(infra.window(), WIDTH/2, HEIGHT/2);
+			//process zoom (keep only this for central zoom)
 			camera.ProcessMouseZoom(InputState::mwheelmot_y);
 		}
 		SelectionManager::hoveredIndex = bottom_metal.selectObject(InputState::umpos_x, HEIGHT - InputState::umpos_y, projection, view, model);