• Provider

Simple Transform Provider

By: SKY ENGINE AI
scroll down ↓to find out moresimple-transform-provider_2_resourcesTutorial

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()
simple-transform-provider_1_resourcesTutorial
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()
simple-transform-provider_2_resourcesTutorial
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()
simple-transform-provider_3_resourcesTutorial
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()
simple-transform-provider_4_resourcesTutorial
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.