MeshObj Introduction
In this case you will get familiar with obj-mesh concept in SkyRenderer. You will learn how to define,
modify and manipulate a mesh loaded from OBJ. For additional information about intersectors see:
INTRO_Intersectors tutorial.
Agenda:
- Mesh from OBJ basic usage
- Mesh manipulation
Scene setup
Let's use custom scene composer to set up the scene.
from skyrenderer.cases.utils import GeometriesSceneComposer
scene_composer = GeometriesSceneComposer(antialiasing_level=2048)
scene_composer.setup_scene(1400, 900)
print(scene_composer.renderer_context.layout())
2025-02-04 10:30:41,319 | 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
top_node
|-- camera_CAM_NUL
+-- geometry_GEO
Mesh from OBJ basic usage
Let's start with creating MeshIntersector and its parameter set objects, then we configure geometry for
object by invoking set_geometry_definition
method (see: INTRO_Geometries).
Additionally, we have to define buffer provider. For ABC files it is done automatically.
from skyrenderer.basic_types.procedure import MeshIntersector
from skyrenderer.scene.scene_layout.layout_elements_definitions import GeometryDefinition
from skyrenderer.basic_types.provider import ObjBufferProvider
mesh_intersector = MeshIntersector(scene_composer.renderer_context)
scene_composer.renderer_context.set_geometry_definition(
"geometry_GEO",
GeometryDefinition(
buffer_provider=ObjBufferProvider(scene_composer.renderer_context, "shaderball"),
intersector=mesh_intersector,
),
)
scene_composer.setup_geometry_material()
scene_composer.visualize()
2025-02-04 10:30:41,760 | skyrenderer.utils.time_measurement | INFO: Setup time: 396 ms
2025-02-04 10:30:45,132 | skyrenderer.utils.time_measurement | INFO: Context update time: 3.37 seconds
2025-02-04 10:30:48,782 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms
2025-02-04 10:30:48,783 | skyrenderer.utils.time_measurement | INFO: Render time: 3.65 seconds
Mesh manipulation
As for each geometry, you can access its node to perform basic manipulation (see: TRANSFORMATIONS_Transform
and INTRO_SceneLayout tutorials). In this section we will move and rotate our shaderball.
scene_composer.renderer_context.get_node("geometry_GEO").rotate_degrees(rot_angles=[20, 0, 0])
scene_composer.renderer_context.get_node("geometry_GEO").apply_translation(translation_vector=[0, -1, 0])
scene_composer.visualize(scene_composer.get_render(setup=False))
2025-02-04 10:30:48,960 | skyrenderer.utils.time_measurement | INFO: Context update time: 6 ms
2025-02-04 10:30:51,565 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms
2025-02-04 10:30:51,568 | skyrenderer.utils.time_measurement | INFO: Render time: 2.61 seconds
Summary
In this section you have learnt:
- MeshIntersector can be used to load geometries from .obj files.
- Loaded mesh can be manipulated via modification of its node's transformation.