In addition, if you would like to rotate the camera and keep your focus fixed, you
could specify the parameter “rot_center” to be your focus (http://yt-project.org/docs/dev/reference/api/generated/yt.visualization.volu...);
if not, the default rotation center is the camera location. The default rotation center is
not set to focus point because sometimes people use camera without setting the focus (say,
giving the camera location and orientation already makes a camera well-defined). But we
can definitely discuss and think about how to improve this.

Thank you so much for this explanation. It gets me off the ground running! I appreciate
the work you've done to make the volume rendering so amazing; these are small final
touches. I'll be happy to open a bug report.

The first, is that the camera.zoom() function doesn't really zoom in on the image,
instead it decreases the "width" the volume rendering region by the zoom factor. This
makes a lot of sense for plane-parallel volume renderings (the default), but not so much
for perspective lenses as you saw. For a perspective lens you should instead reposition
the camera to be closer to the focus to get the same effect.

Next, you also saw that manipulating the TransferFunctionHelper object (source.tfh)
after you've already done a volume rendering doesn't update the transfer function. That's
because the TransferFunctionHelper object is only used to generate the transfer function
(source.transfer_function) if it isn't set yet. If it's already set, it reuses it. So in
your example the first time you called save(), the VolumeSource saw that no one had
manually created a transfer function, and used the TransferFunctionHelper object to build
one. Then, when you asked it for the second rendering, it just reused the same one because
right now the VolumeSource doesn't track if the TransferFunctionHelper has been updated.
To do what you mean, you need to manually set the transfer function to be the one
generated by the TransferFunctionHelper:

I think we could probably do a better job of detecting that the TransferFunctionHelper
has been manipulated and avoid this confusion, if you'd like I invite you to open an issue
about this on our issue tracker. One might also argue that the zoom function should adjust
the camera position for perspective lenses.

Sorry the volume renderer isn't totally intuitive for this use case. I did some work
before the yt 3.3.1 release to improve things, but it's still definitely not perfect. I
think there's a lot of power there but it also really needs some love from someone who is
willing to think about corner cases and interactive workflows.

However, if I naively continue the script to re-render with new settings:
source.tfh.set_bounds((3e-35, 5e-27))
sc.camera.zoom(2.0)
sc.save('rendering2.png', sigma_clip=6.0)

I find that none of my new settings are reflected in "rendering2.png" -- it's just a
duplicate of "rendering.png"! But if I start again from scratch with a new scene, the
settings take hold. This leaves me (a new user) scratching my head.

So here is my question: Once you've created and saved a scene once, how do you change
scene settings like colormap and camera angle?