When working on a scene with a lot of assets, it’s a good idea to use proportionately lower levels of subdivision as assets get further away from the camera. But how do you do this efficiently when you are dealing with a large number of assets, say 50-100 or more?

dynamic_lods

The Handler API allows you to write simple handlers that get triggered every time a certain condition is met. In this case, we can think of the camera’s movement as a trigger. Camera movements, among other things, are captured in the depsgraph_update_pre and depsgraph_update_post handlers which get triggered before and after any change to any objects in the scene respectively.

Using this, we can write a simple handler function that gets called every time the camera moves. Roughly, the handler would work something like:

For every object in the scene, calculate the distance between the object and the camera. Determine the appropriate subdivision level based on predefined distance thresholds. Assign the calculated subdivision level to the object.

Here’s a quick code snippet illustrating the handler 👇🏻

dynamic_lods_snippet

Instead of using the depsgraph handler, you can also use the frame_change_pre or frame_change_post handlers to recalculate subdivisions every time there is a frame change, which could be useful when doing animations.

Similarly, this can be extended to assign appropriate texture resolutions based on camera distance/screen space as well.