.. Comment: this file is automatically generated by `update_example_docs.py`. It should not be modified manually. Lights ========================================== Visualize a mesh under different lighting conditions. To get the demo data, see ``./assets/download_dragon_mesh.sh``. .. code-block:: python :linenos: import time from pathlib import Path import numpy as np import trimesh import viser import viser.transforms as tf def main() -> None: # Load mesh. mesh = trimesh.load_mesh(str(Path(__file__).parent / "assets/dragon.obj")) assert isinstance(mesh, trimesh.Trimesh) mesh.apply_scale(0.05) vertices = mesh.vertices faces = mesh.faces print(f"Loaded mesh with {vertices.shape} vertices, {faces.shape} faces") # Start Viser server with mesh. server = viser.ViserServer() server.scene.add_mesh_simple( name="/simple", vertices=vertices, faces=faces, wxyz=tf.SO3.from_x_radians(np.pi / 2).wxyz, position=(0.0, 0.0, 0.0), ) server.scene.add_mesh_trimesh( name="/trimesh", mesh=mesh, wxyz=tf.SO3.from_x_radians(np.pi / 2).wxyz, position=(0.0, 5.0, 0.0), ) # adding controls to custom lights in the scene server.scene.add_transform_controls("/control0", position=(0.0, 10.0, 5.0)) server.scene.add_label("/control0/label", "Directional") server.scene.add_transform_controls("/control1", position=(0.0, -5.0, 5.0)) server.scene.add_label("/control1/label", "Point") directional_light = server.scene.add_light_directional( name="/control0/directional_light", color=(186, 219, 173), ) point_light = server.scene.add_light_point( name="/control1/point_light", color=(192, 255, 238), intensity=30.0, ) # Create default light toggle. gui_default_lights = server.gui.add_checkbox("Default lights", initial_value=True) gui_default_lights.on_update( lambda _: server.scene.enable_default_lights(gui_default_lights.value) ) # Create light control inputs. with server.gui.add_folder("Directional light"): gui_directional_color = server.gui.add_rgb( "Color", initial_value=directional_light.color ) gui_directional_intensity = server.gui.add_slider( "Intensity", min=0.0, max=20.0, step=0.01, initial_value=directional_light.intensity, ) @gui_directional_color.on_update def _(_) -> None: directional_light.color = gui_directional_color.value @gui_directional_intensity.on_update def _(_) -> None: directional_light.intensity = gui_directional_intensity.value with server.gui.add_folder("Point light"): gui_point_color = server.gui.add_rgb("Color", initial_value=point_light.color) gui_point_intensity = server.gui.add_slider( "Intensity", min=0.0, max=200.0, step=0.01, initial_value=point_light.intensity, ) @gui_point_color.on_update def _(_) -> None: point_light.color = gui_point_color.value @gui_point_intensity.on_update def _(_) -> None: point_light.intensity = gui_point_intensity.value # Create GUI elements for controlling environment map. with server.gui.add_folder("Environment map"): gui_env_preset = server.gui.add_dropdown( "Preset", ( "None", "apartment", "city", "dawn", "forest", "lobby", "night", "park", "studio", "sunset", "warehouse", ), initial_value="city", ) gui_background = server.gui.add_checkbox("Background", False) gui_bg_blurriness = server.gui.add_slider( "Bg Blurriness", min=0.0, max=1.0, step=0.01, initial_value=0.0, ) gui_bg_intensity = server.gui.add_slider( "Bg Intensity", min=0.0, max=1.0, step=0.01, initial_value=1.0, ) gui_env_intensity = server.gui.add_slider( "Env Intensity", min=0.0, max=1.0, step=0.01, initial_value=0.1, ) def update_environment_map(_) -> None: server.scene.set_environment_map( gui_env_preset.value if gui_env_preset.value != "None" else None, background=gui_background.value, background_blurriness=gui_bg_blurriness.value, background_intensity=gui_bg_intensity.value, environment_intensity=gui_env_intensity.value, ) update_environment_map(None) gui_env_preset.on_update(update_environment_map) gui_background.on_update(update_environment_map) gui_bg_blurriness.on_update(update_environment_map) gui_bg_intensity.on_update(update_environment_map) gui_env_intensity.on_update(update_environment_map) while True: time.sleep(10.0) if __name__ == "__main__": main()