• Transform Provider

Ball Transform Provider Parameters

By: SKY ENGINE AI
scroll down ↓to find out moreball-transform-provider-parameters_3_resourcesTutorial

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)
ball-transform-provider-parameters_1_resourcesTutorial
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)
ball-transform-provider-parameters_2_resourcesTutorial
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)
ball-transform-provider-parameters_3_resourcesTutorial
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.