It's because of the way Java is reading the zoom events and translating them into scroll wheel events (and how our code is written to handle them). The Designer/Vision use Java Swing, which is a desktop GUI framework that long predates multi-touch capacitive touchpads.
Scrolling with the touchpad on my M4 issues a series of events like this:
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=1,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=1,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=1,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
MOUSE_WHEEL,scrollAmount=1,wheelRotation=0,preciseWheelRotation=0.30000000000000004
In Vision, there's a block of code that interprets the scrolls:
if (e.getWheelRotation() > 0) {
panel.zoomOut();
} else {
panel.zoomIn();
}
When you're using the touchpad, if your "precise" wheel rotation rounds down to an integer wheel rotation less than or equal to zero, Vision treats that as a zoom in, but then a few milliseconds later you get a zoom out event (because the rotation rounded up to 1) and so on, which is why you get such weird inconsistent zooming.
Perspective probably has something similar, copied over from Vision at the beginning of its development.
In contrast, a physical mouse gives you nice full integer scroll reports and works great.
This is something we could absolutely improve. This code was originally written before Java had a getPreciseWheelRotation method and just hasn't been revisited since then.