Transform Introduction
In this case you will get familiar with a SimpleTransformProvider.
Agenda:
- Simple Transform Provider introduction
- Modify translation
- Number of steps parameter
- Modify rotation
- Modify scale
Scene setup
Let's use custom scene composer to set up the scene.
Scene consists of:
- 5 shaderballs - locations will be steered by SimpleTransformProvider
- plane - location: (0, 0, 0)
- camera - location: (5, 5, 5)
from skyrenderer.cases.utils import SimpleTransformProviderSceneComposer
scene_composer = SimpleTransformProviderSceneComposer(1500)
scene_composer.setup_scene()
2025-02-04 15:50:05,555 | 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
Simple Transform Provider introduction
The transform provider allocates instances based on translation, rotation, and scale,
It allows for any arbitrary allocation of objects in the scene, making it a very versatile transform provider.
Modify translation
Let's spread our shaderballs on the surface of the plane. First we need to create a SimpleTransformProvider object.
The only mandatory parameter is context, if we don't specify any other parameter all shaderballs will be
in (0, 0, 0) location. We will provide x and z translations ranges to spread shaderballs between these values.
SkyRenderer will draw random values from the given ranges. We didn't specify a range for y values, so all
shaderballs will have translation equal to 0.
from skyrenderer.basic_types.provider import SimpleTransformProvider
shaderball_transform_provider = SimpleTransformProvider(
context=scene_composer.renderer_context, translation_range_x=(-2, 2), translation_range_z=(-2, 2)
)
shaderball_node = scene_composer.renderer_context.layout().get_node("shaderball_GEO")
shaderball_node.modify_locus_definition(
transform_provider=shaderball_transform_provider,
)
scene_composer.visualize()
2025-02-04 15:50:06,017 | skyrenderer.utils.time_measurement | INFO: Setup time: 418 ms
2025-02-04 15:50:08,842 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.82 seconds
2025-02-04 15:50:13,806 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms
2025-02-04 15:50:13,807 | skyrenderer.utils.time_measurement | INFO: Render time: 4.96 seconds
Number of steps parameter
Some of the shaderballs are overlapping, but we don't want it to happen. Let's specify number_of_steps parameter to
increase the distance between them. This parameter specifies the number of possible steps between min and max, for all ranges.
shaderball_transform_provider = SimpleTransformProvider(
context=scene_composer.renderer_context,
translation_range_x=(-2, 2),
translation_range_z=(-2, 2),
number_of_steps=3,
)
shaderball_node.modify_locus_definition(
transform_provider=shaderball_transform_provider,
)
scene_composer.visualize()
2025-02-04 15:50:14,226 | skyrenderer.utils.time_measurement | INFO: Setup time: 72 ms
2025-02-04 15:50:17,161 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.93 seconds
2025-02-04 15:50:21,713 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms
2025-02-04 15:50:21,714 | skyrenderer.utils.time_measurement | INFO: Render time: 4.55 seconds
The shaderballs are now separated. The minimum distance between them is equal to 2 units, because there are
3 possible values in x and z ranges: (-2, 0, 2)
But why are there only 3 shaderballs visible out of 5 instances in the scene tree?
SimpleTransformProvider doesn't guarantee that drawn values will be unique. Let's see the positions of the instances -
some of their positions are duplicated.
If you want to learn how to draw unique values, check randomization strategies tutorials.
for i in range(5):
parameters = scene_composer.renderer_context.get_node("shaderball_GEO").locus.get_json_instance_info(i)[
"transform_provider_parameters"
]["parameters"]
scene_composer.log_info(f"instance {i} x: {parameters['translation_x']} z: {parameters['translation_z']}")
2025-02-04 15:50:22,044 | skyrenderer | INFO: instance 0 x: 2.0 z: 2.0
2025-02-04 15:50:22,045 | skyrenderer | INFO: instance 1 x: -2.0 z: -2.0
2025-02-04 15:50:22,045 | skyrenderer | INFO: instance 2 x: -2.0 z: -2.0
2025-02-04 15:50:22,046 | skyrenderer | INFO: instance 3 x: 2.0 z: 2.0
2025-02-04 15:50:22,046 | skyrenderer | INFO: instance 4 x: -2.0 z: 0.0
Modify rotation
We can specify rotation ranges for x, y and z axis, also called pitch, jaw and roll.
We can also specify these values in degrees or radians by passing rotation_mode parameter that defaults to degrees.
Let's rotate our shaderballs against y-axis so that they are facing away from us.
shaderball_transform_provider = SimpleTransformProvider(
context=scene_composer.renderer_context,
rotation_range_y=(90, 180),
translation_range_x=(-3, 3),
translation_range_z=(-3, 3),
)
shaderball_node.modify_locus_definition(
transform_provider=shaderball_transform_provider,
)
scene_composer.visualize()
2025-02-04 15:50:22,117 | skyrenderer.utils.time_measurement | INFO: Setup time: 65 ms
2025-02-04 15:50:25,024 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.91 seconds
2025-02-04 15:50:29,712 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms
2025-02-04 15:50:29,713 | skyrenderer.utils.time_measurement | INFO: Render time: 4.69 seconds
Modify scale
Similarly to translation and rotation we can specify the shaderball scaling along 3 axes: x, y, z.
The drawing processes for x, y and z ranges are independent, so as a result, shaderballs will be stretched or
shrunk in different directions.
shaderball_transform_provider = SimpleTransformProvider(
context=scene_composer.renderer_context,
scale_range_x=(0.5, 1.5),
scale_range_z=(0.5, 1.5),
scale_range_y=(0.5, 1.5),
translation_range_x=(-3, 3),
translation_range_z=(-3, 3),
)
shaderball_node.modify_locus_definition(
transform_provider=shaderball_transform_provider,
)
scene_composer.visualize()
2025-02-04 15:50:30,097 | skyrenderer.utils.time_measurement | INFO: Setup time: 65 ms
2025-02-04 15:50:32,919 | skyrenderer.utils.time_measurement | INFO: Context update time: 2.82 seconds
2025-02-04 15:50:38,835 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms
2025-02-04 15:50:38,836 | skyrenderer.utils.time_measurement | INFO: Render time: 5.92 seconds
Summary
In this section you have learnt:
- SimpleTransformProvider is comprehensively configurable and may change translation, rotation and scale of
geometries. - For all transformations: translation, rotation and scale we specify ranges of minimum and maximum values.
- We can also specify number_of_steps parameter, which applies to all operations.