Animating Dome Rotation in DAZ Studio – is it possible?
Hello!
I need to animate the Dome Rotation in Render Settings (Environment) to create an animation where the HDRI rotates over time. My goal is to have the Dome Rotation value change frame by frame on the Timeline.
I tried the ERC Freeze method:
-
created a Null,
-
added a custom property (for example DomeRotationCtrl),
-
then attempted to link it to Dome Rotation in Environment Options using ERC Freeze.
Unfortunately, this approach did not work for me — I could not get Dome Rotation to animate through such a controller.
Is there another method, plugin, or script that allows animating Dome Rotation (and possibly other Environment Options)? Any advice would be greatly appreciated.

Comments
I would also like to add that I tried a workaround by rotating the entire scene. This approach turned out to be very inconvenient: the rotation center does not match the point where it needs to be, so the result looks incorrect. In the end, this method creates more problems than it solves.
You could create a null and place it where you want it to rotate, and then parent the scene to that.
Thank you for your reply. However, I am still trying to find a solution that is not a workaround but actually rotates the dome itself. Perhaps this can be achieved with a script?
well, technically the camera is always fixed and everything animates around it however the dome is part of the render engine not the scene
nonetheless one can animate environment domes in other software
I know none of the existing texture animation scripts work on it and people have said it isn't accessible in the API (I wouldn't know, just take their word for it)
hence I too group everything or parent to a niull, got to watch D|S though as it does weird things parenting too like scaling recursively
This would be a job for a post-load proxy creation, to link the rotation to an aniamtable node proeprty http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/start#post-load_data_items
Buddy, what you wrote sounds interesting, but it is not clear to me at all. Could you please show a more practical example or explain it in a simpler way? I am not such an advanced user, so I can’t fully grasp it right away. If it involves code, a sample would really help me understand how to use it. Thanks in advance for your efforts.
Did I understand you correctly? The code that was proposed creates a proxy property on a Null and links it to Dome Rotation, so the dome’s rotation can be animated in the Timeline. I would like to confirm if this matches your recommendation about post-load proxy creation.
That is right, the script runs in the background to create the links each time you load the scene.
The script currently works, produces no errors, and successfully updates the Dome Rotation value through the timeline. However, there is one issue: it only functions once after being launched. This approach is not suitable for rendering. Is there a way to run the script once and have it continue working in the background? Or is that fundamentally impossible in DAZ? A manual launch is not a viable option for rendering.
# Problem: Script executes only once, no continuous synchronization in DAZ Studio 4.24
Problem Description
I'm creating a proxy property on a Null node to control Dome Rotation via script. The script correctly creates properties and sets initial values, but doesn't work in the background - synchronization only occurs when the script is launched, but not when changing frames on the timeline.
What I've Tried
1. Basic approach with valueChanged
Result: Only works when manually changing values in Properties panel, but not when scrubbing through timeline.
2. Timer for continuous synchronization
Result: Timer starts, but script terminates and timer stops.
3. Binding timer to scene node
Result: Timer persists on the node, but still doesn't work after script completion.
4. Using QDialog to keep script alive
Result: Dialog shows service is running, but synchronization doesn't work.
5. Connecting to scene events
Result: Events don't trigger or script doesn't receive them after completion.
6. Object-oriented approach with reference storage
Result: References are stored, but script still doesn't work in background.
Key Issues
Questions for the Community
Any ideas or alternative approaches would be greatly appreciated!
You could turn the HDR into an actual physical skydome in your scene. Then you can rotate it easily. Just set the base color and emission color of your skydome to your exr/hdr, adjust the luminance as desired. I noticed this kind of bogs down my GPU when I tried this way though (I only have 6GB VRAM), so your mileage may vary depending on GPU size and size of the HDR.
What a re you trying to do with repeating callbacks? The object is to have the script run once at load, create the null and its property (don't forget to name them, name matters more than label) and make the property a controller of the dome rotation property. Once that is done, for the session, you can animate changes to the node proeprty as you can any other and the dome rotation will follow without any script action required. http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/start#post-load_callbacks is the source from which IBL Master grew in this respect.
Thank you for your previous answer. I'm trying to follow your advice to create a property controller that links my custom "Dome Rotation Proxy" property on a null node to the "Dome Rotation" property of the "Environment Options" node. However, when attempting to use DzProxyPropertyController, I get a ReferenceError: Can't find variable: DzProxyPropertyController.
After reviewing the official script samples in the Documentation Center, I couldn't find any use of DzProxyPropertyController. Instead, the examples often use other methods, such as DzExpression or creating a DzCallBack to link properties.
Could you please clarify which specific controller class should be used to create a permanent link between the two properties for animation without recurring script calls? There might be a recommended approach I am missing.
Thank you for your time and assistance.
http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/object_index/erclink_dz you need to create an ERCLink on the rotation control that makes the actual dome rotation conrol (what you are adding it to) subject to the new property on your control node - using DeltaAdd or Add I would think (the former allows a scalar, multiplier, value to be included so that you can have a different range if desired on your controller). Once the node and controller exist the script then fires on loading the item to reinstate that link - once the link exists in the currently open scene it has no further role to play.
Log:
Executing Script...
Found existing DomeCtrl node
Found existing Dome Rotation Proxy property
Found Dome Rotation property
SUCCESS: ERC Link created successfully!
Dome Rotation is now controlled by Dome Rotation Proxy
You can now animate 'Dome Rotation Proxy' and Dome Rotation will follow automatically
Connection test - Proxy: 0, Dome: 0
Result:
Script executed in 0 secs 113 msecs.
Based on the code and the log, does the solution you suggested and the code I wrote look correct? I just want to double-check with you as a developer if everything is done properly, because honestly I’m a bit confused and can’t tell what’s right and what isn’t. Just let me know if it’s correct or if I messed something up again.
Your previous sample looked promising (I didn't go through it in detail) - just in the final sectrion, where you have lots of ?s, you need to use the ERC Link constructor to make an ERC_Add link to your dome rotation control property and then set that as a controller of the actual proerpty (which ytou already have) on the Environment Settings node (using http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/object_index/numericproperty_dz#a_1a7a4e7c2103a43b2a14afd3cdb6a8113c if I am recalling correctly, it's been a while since I did this)
Now the code is written correctly, right?
work thx a LOT!
I followed your instructions, and the interesting part is that the script almost works. Keys are being set, and the required parameters change synchronously. Yes, there are some minor discrepancies with the limits, but those are not critical. The main issue appears after reloading the scene: the script stops working and no longer synchronizes the keys. Is there a way to fix this? Could you test it on your side and point out what I might be doing wrong so I can correct it?
That is what the Ppost Load script is for, are you setting that part up? Or is it that the script isn't working when it is run that way?
Please check both scripts. One handles the loading process, and the other, the main one, performs all actions. It is possible that I missed something or did something wrong, although no errors appear. I tested it with ChatGPT, which says everything looks correct, but I understand that ChatGPT is just a tool without emotions, and the best solution can, of course, come from a human.
The main script that is used to run in DAZ Studio.
The script starts running only after the scene has been reloaded.
Make the entire scene **including the camera** into a group (select everything, create group...) Rotate that group.
If you are using a close-up HDRI then that won't work; you need to create a second group of the first and move that to the center of the HDRI and invert the move on the original group. Be aware that if you try to rotate an HDRI with close-up objects around a scene your chance of getting it to work is minimal; the HDRI has to be rotated about the **camera** not the scene otherwise the perspective will be messed up.
This is a 3D issue; an HDRI is taken with a camera at the center of the captured scene, when the HDRI is used the camera used to view the scene it is illuminating has to be at the same center or everything goes screwy (out of perspective). For "infinite dome" HDRIs it doesn't matter because anything/∞ = 0. For "finite dome" HDRIs it really does mattter; dome-raduis/camera-displacement must be close to 0.
The base problem is that "dome rotation" is a property of the "Environment" which cannot be animated. If you want to animate it in a script you need to find a way to trigger that script on every single frame change. The same issue applies to things in "Environment" which certainly should be animable; EV is an excellent example (it should be an animable Camera property.)
Why should I use a sphere, spend time setting it up, adjusting lighting, and resizing it, when user Richard Haseltine mentioned that the documentation already describes a solution that allows the Dome to rotate when a scene is loaded? What I’m currently writing isn’t fully working yet, but it already retrieves and sets the Dome coordinates. I understand that everyone is looking for a simple solution, and if I manage to finish this script, users will be able to use it effortlessly- no need to create spheres, groups, or make manual adjustments. It will be a truly useful solution that will make life easier for many (and spare some from unnecessary suffering)).
I followed the documentation and the script mostly works, but for some reason, it doesn’t run when the scene is loaded. Could you please advise what I might have missed or done wrong?