I think there are too many ways to approach this issue, but I cannot advice what would be the best for your specific case.
- changing zoom speed depending on the distance
- changing the target, so instead of zooming, you will be moving
- using another controls (e.g.
FlyControls
) - modifying the zooming/dollying function in the source code
- providing your own zooming function (if OrbitControls allows this)
- writing your own controls
- dynamically changing the minimum and maximum distance (and keep them equal, thus forcing the camera to make larger or smaller steps)
- searching for similar questions as they might have solutions that work for you (example)