• Geometries

Mesh OBJ introduction

By: SKY ENGINE AI
scroll down ↓to find out moremesh-obj_1_resourcesTutorial

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()
mesh-obj_1_resourcesTutorial
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))
mesh-obj_2_resourcesTutorial
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.