Ball Transform Provider Parameters
In this tutorial you will get familiar with BallTransformProvider's parameters. You will see how change of
parameter values affect transformations provided by BallTransformProvider.
Agenda:
- BallTransformProvider - parameters
Scene setup
Let's use custom scene composer to set up the scene.
from skyrenderer.cases.utils.PROVIDER_scene import SeagullTransformProviderSceneComposer
from skyrenderer.basic_types.provider.transform_providers.ball_transform_provider import BallTransformProvider
scene_composer = SeagullTransformProviderSceneComposer(antialiasing_level=64)
scene_composer.setup_scene()
seagull_locator = scene_composer.renderer_context.layout().get_node("seagull_GEO_NUL")
seagull_locator.n_instances = 10
scene_composer.randomize_bird_animations()
2025-04-15 09:49:55,052 | skyrenderer.scene.renderer_context | INFO: Root paths: - root path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer - assets path: /dli/mount/assets - config path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer/config - gpu sources path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer/optix_sources/sources - cache path: /dli/mount/cache - ptx cache path: compiled_ptx/ptx - ocio path: ocio_configs/aces_1.2/config.ocio 2025-04-15 09:49:55,180 | skyalembic.archive_manager | WARNING: Loading not adapted alembic file 2025-04-15 09:49:55,185 | skyrenderer.basic_types.provider.unit_providers.hdr_texture_provider | WARNING: Parameter light_adapt provided in HDR json is not supported 2025-04-15 09:49:55,186 | skyrenderer.basic_types.provider.unit_providers.hdr_texture_provider | WARNING: Parameter color_adapt provided in HDR json is not supported
BallTransformProvider - parameters
In this section we will walk you through changing and setting basic BallTransformProvider parameters:
- center
- radius
- number of points
To do that, we will set up separate parameter providers for each combination.
Center
Location of the center of the ball (sphere) used to draw transformation values. Moves the entire randomized group
of objects together.
renders = {}
transform_provider_center_000 = BallTransformProvider(scene_composer.renderer_context, center=[0, 0, 0], radius=4)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_center_000)
renders["center=[0, 0, 0]"] = scene_composer.get_render()
transform_provider_center_00n1 = BallTransformProvider(scene_composer.renderer_context, center=[0, 0, -10], radius=4)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_center_00n1)
renders["center=[0, 0, -10]"] = scene_composer.get_render()
transform_provider_center_01n1 = BallTransformProvider(scene_composer.renderer_context, center=[0, 10, -10], radius=4)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_center_01n1)
renders["center=[0, 10, -10]"] = scene_composer.get_render()
scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
2025-04-15 09:49:57,343 | skyrenderer.utils.time_measurement | INFO: Setup time: 2.15 seconds 2025-04-15 09:50:00,060 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.72 seconds 2025-04-15 09:50:02,104 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:02,105 | skyrenderer.utils.time_measurement | INFO: Render time: 2.04 seconds 2025-04-15 09:50:02,208 | skyrenderer.utils.time_measurement | INFO: Setup time: 69 ms 2025-04-15 09:50:04,832 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.62 seconds 2025-04-15 09:50:07,439 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:07,440 | skyrenderer.utils.time_measurement | INFO: Render time: 2.61 seconds 2025-04-15 09:50:07,592 | skyrenderer.utils.time_measurement | INFO: Setup time: 124 ms 2025-04-15 09:50:10,272 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.68 seconds 2025-04-15 09:50:12,524 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:12,525 | skyrenderer.utils.time_measurement | INFO: Render time: 2.25 seconds
Radius
Radius of the ball used to draw transformation values - affects the overall size of the ball volume, so as when
the spread increases, the density will likely decrease. You will notice the change in radius by itself does not
affect the state of randomization - polar coordinates of each object stay the same in relation to other objects.
The radius only pulls them closer together or pushes them further apart.
renders = {}
transform_provider_radius_1 = BallTransformProvider(scene_composer.renderer_context, radius=3)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_radius_1)
renders["radius=3"] = scene_composer.get_render()
transform_provider_radius_2 = BallTransformProvider(scene_composer.renderer_context, radius=5)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_radius_2)
renders["radius=5"] = scene_composer.get_render()
transform_provider_radius_3 = BallTransformProvider(scene_composer.renderer_context, radius=10)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_radius_3)
renders["radius=10"] = scene_composer.get_render()
scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
2025-04-15 09:50:12,854 | skyrenderer.utils.time_measurement | INFO: Setup time: 133 ms 2025-04-15 09:50:15,365 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.51 seconds 2025-04-15 09:50:16,593 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:16,594 | skyrenderer.utils.time_measurement | INFO: Render time: 1.23 seconds 2025-04-15 09:50:16,740 | skyrenderer.utils.time_measurement | INFO: Setup time: 126 ms 2025-04-15 09:50:19,375 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.63 seconds 2025-04-15 09:50:20,682 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:20,683 | skyrenderer.utils.time_measurement | INFO: Render time: 1.31 seconds 2025-04-15 09:50:20,823 | skyrenderer.utils.time_measurement | INFO: Setup time: 121 ms 2025-04-15 09:50:23,341 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.52 seconds 2025-04-15 09:50:25,285 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:25,286 | skyrenderer.utils.time_measurement | INFO: Render time: 1.94 seconds
Number of points
Number of possible spawn points in the ball's volume that can be used to draw transformation values. You can
consider it similar to the concept of DPI in print and screens - more points will result in finer, more organic
differences between two almost identical random draws. Fewer points on the other hand will help create hotspots
with higher repeatability of potential object placement - you can make "the lightning strike twice".
This param, in case of the BallTransformProvider specifically, expects a value which can be cubic_rooted to
an integer. Giving an arbitrary number, which is not an n^3, will throw an error.
renders = {}
transform_provider_number_of_points_343 = BallTransformProvider(
scene_composer.renderer_context, number_of_points=343, radius=5
)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_number_of_points_343)
renders["number_of_points=343"] = scene_composer.get_render()
transform_provider_number_of_points_1000 = BallTransformProvider(
scene_composer.renderer_context, number_of_points=1000, radius=5
)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_number_of_points_1000)
renders["number_of_points=1000"] = scene_composer.get_render()
transform_provider_number_of_points_4096 = BallTransformProvider(
scene_composer.renderer_context, number_of_points=4096, radius=5
)
seagull_locator.modify_locus_definition(transform_provider=transform_provider_number_of_points_4096)
renders["number_of_points=4096"] = scene_composer.get_render()
scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
2025-04-15 09:50:25,617 | skyrenderer.utils.time_measurement | INFO: Setup time: 139 ms 2025-04-15 09:50:28,315 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.70 seconds 2025-04-15 09:50:30,034 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:30,035 | skyrenderer.utils.time_measurement | INFO: Render time: 1.72 seconds 2025-04-15 09:50:30,170 | skyrenderer.utils.time_measurement | INFO: Setup time: 120 ms 2025-04-15 09:50:32,626 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.45 seconds 2025-04-15 09:50:34,512 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:34,513 | skyrenderer.utils.time_measurement | INFO: Render time: 1.89 seconds 2025-04-15 09:50:34,654 | skyrenderer.utils.time_measurement | INFO: Setup time: 126 ms 2025-04-15 09:50:37,132 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.48 seconds 2025-04-15 09:50:39,845 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-04-15 09:50:39,846 | skyrenderer.utils.time_measurement | INFO: Render time: 2.71 seconds
Summary
In this section you have learnt:
- BallTransformProviders has many parameters that affect drawing of transformation values within a ball-shaped
volume.