TransformMultiProvider Introduction
In this case you will get familiar with a TransformMultiProvider.
Agenda:
- Transform Multi Provider usage
Scene setup
Let's use custom scene composer to set up the scene.
Scene consists of:
- 200 spheres - locations will be steered by TransformMultiProvider
- plane - location: (0, 0, 0)
- camera - location: (5, 5, 5)
from skyrenderer.cases.utils import TransformMultiProviderSceneComposer
scene_composer = TransformMultiProviderSceneComposer()
scene_composer.setup_scene()
2025-02-05 11:55:33,869 | skyrenderer.scene.renderer_context | INFO: Root paths: - root path: /dli/skyenvironment/skyrenderer/skyrenderer - assets path: /dli/mount/assets - config path: /dli/skyenvironment/skyrenderer/skyrenderer/config - gpu sources path: /dli/skyenvironment/skyrenderer/skyrenderer/optix_sources/sources - cache path: /dli/mount/cache - ptx cache path: compiled_ptx/ptx - ocio path: ocio_configs/aces_1.2/config.ocio
Transform Multi Provider usage
Transform Multi Provider allows to distribute instances by multiple transform providers.
In this case we define 3 transform providers: a Sphere Transform Provider and two Circle Transform Providers.
Transform Multi Provider will randomly spread 200 spheres among these 3 providers, so the spheres are now
arranged in 3 shapes - two circles and a sphere between them.
from skyrenderer.basic_types.provider.transform_providers.circle_transform_provider import CircleTransformProvider
from skyrenderer.basic_types.provider.transform_providers.sphere_transform_provider import SphereTransformProvider
from skyrenderer.basic_types.provider.transform_providers.transform_multi_provider import TransformMultiProvider
sphere_transform_provider = SphereTransformProvider(scene_composer.renderer_context, center=(0, 3, 0), radius=2)
top_circle_transform_provider = CircleTransformProvider(scene_composer.renderer_context, center=(0, 6, 0), radius=2)
bottom_circle_transform_provider = CircleTransformProvider(
scene_composer.renderer_context, center=(0, 0, 0), radius=2.5
)
multi_transform_provider = TransformMultiProvider(
scene_composer.renderer_context,
[sphere_transform_provider, top_circle_transform_provider, bottom_circle_transform_provider],
)
scene_composer.renderer_context.layout().get_node("sphere_GEO").modify_locus_definition(
transform_provider=multi_transform_provider
)
scene_composer.visualize()
2025-02-05 11:55:34,700 | skyrenderer.utils.time_measurement | INFO: Setup time: 782 ms 2025-02-05 11:55:35,422 | skyrenderer.utils.time_measurement | INFO: Context update time: 721 ms 2025-02-05 11:55:39,028 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-02-05 11:55:39,029 | skyrenderer.utils.time_measurement | INFO: Render time: 3.61 seconds
sphere_node = scene_composer.renderer_context.get_node("sphere_GEO")
provider_indexes = [
sphere_node.locus.get_json_instance_info(i)["transform_provider_parameters"]["parameters"]["provider_selector"]
for i in range(200)
]
provider_counts = {
"Sphere transform provider": provider_indexes.count(0),
"Top circle provider": provider_indexes.count(1),
"Bottom circle provider": provider_indexes.count(2),
}
scene_composer.log_info(f"Number of instances steered by each transform provider: {provider_counts}")
2025-02-05 11:55:39,412 | skyrenderer | INFO: Number of instances steered by each transform provider: {'Sphere transform provider': 64, 'Top circle provider': 65, 'Bottom circle provider': 71}
Summary
In this section you have learnt:
- Transform Multi Provider allows to arrange instances of the same node by multiple different providers.
- Instances are assigned to providers randomly, so each provider might handle a slightly different number of
instances.