OrbitControls(camera, domElement) treats the camera itself as spherical coordinates (azimuth, polar angle, distance) around a target point, translating pointer drags into angle changes and scroll into distance changes. You must call controls.update() every frame for the camera position to actually refresh.
Turn on enableDamping and the camera coasts to a stop like it has inertia after you let go, which feels much smoother. autoRotate plus autoRotateSpeed keeps the camera slowly orbiting on its own even without input — that’s why this demo keeps moving in the card preview too. minDistance/maxDistance stop the zoom from going too close or too far.
Internally it only ever changes the camera’s position and always keeps it looking at target, so you never touch camera.rotation directly.
When to use
Product 3D viewers, model previewers — anywhere the user needs to freely look an object over.