Repository: Genesis-Embodied-AI/Genesis
File: genesis/engine/scene.py (Python)

Code before:
        model : str
            Specifies the camera model. Options are 'pinhole' or 'thinlens'.
        res : tuple of int, shape (2,)
            The resolution of the camera, specified as a tuple (width, height).
        pos : tuple of float, shape (3,)
            The position of the camera in the scene, specified as (x, y, z).
        lookat : tuple of float, shape (3,)
            The point in the scene that the camera is looking at, specified as (x, y, z).
        up : tuple of float, shape (3,)
            The up vector of the camera, defining its orientation, specified as (x, y, z).
        fov : float
            The vertical field of view of the camera in degrees.
        aperture : float
            The aperture size of the camera, controlling depth of field.
        focus_dist : float | None
            The focus distance of the camera. If None, it will be auto-computed using `pos` and `lookat`.
        GUI : bool
            Whether to display the camera's rendered image in a separate GUI window.
        spp : int, optional
            Samples per pixel. Only available when using RayTracer renderer. Defaults to 256.
        denoise : bool
            Whether to denoise the camera's rendered image. Only available when using the RayTracer renderer. Defaults
            to True. If OptiX denoiser is not available in your platform, consider enabling the OIDN denoiser option
            when building the RayTracer.
        debug : bool
            Whether to use the debug camera (Rasterizer). Effective for BatchRenderer and RayTracer settings. Defaults to False.

        Returns
        -------
        camera : genesis.Camera
            The created camera object.
        """
        return self._visualizer.add_camera(
            res, pos, lookat, up, model, fov, aperture, focus_dist, GUI, spp, denoise, env_idx, debug
        )

    @gs.assert_unbuilt
    def add_emitter(
        self,
        material: Material,
        max_particles=20000,
        surface: Surface | None = None,
    ):
        """
        Add a fluid emitter to the scene.

        Parameters
        ----------
        material : gs.materials.Material
            The material of the fluid to be emitted. Must be an instance of `gs.materials.MPM.Base` or `gs.materials.SPH.Base`.
        max_particles : int

Review comment (bug):
Can you clarify the documentation? At this point I have no clue what it is supposed to do.

You should explain that it enables to create cameras that can used to monitor / debug the simulation without being part of the that are not officially considered as part of the "sensors". Their output is rendered by the usual simple `Rasterizer` systematically, no matter if BatchRender and RayTracer is enabled. This way, it is possible to record the simulation with arbitrary resolution and camera pose, without interfering with what robots can perceive from their environment. 

Code after:
        ----------
        model : str
            Specifies the camera model. Options are 'pinhole' or 'thinlens'.
        res : tuple of int, shape (2,)
            The resolution of the camera, specified as a tuple (width, height).
        pos : tuple of float, shape (3,)
            The position of the camera in the scene, specified as (x, y, z).
        lookat : tuple of float, shape (3,)
            The point in the scene that the camera is looking at, specified as (x, y, z).
        up : tuple of float, shape (3,)
            The up vector of the camera, defining its orientation, specified as (x, y, z).
        fov : float
            The vertical field of view of the camera in degrees.
        aperture : float
            The aperture size of the camera, controlling depth of field.
        focus_dist : float | None
            The focus distance of the camera. If None, it will be auto-computed using `pos` and `lookat`.
        GUI : bool
            Whether to display the camera's rendered image in a separate GUI window.
        spp : int, optional
            Samples per pixel. Only available when using RayTracer renderer. Defaults to 256.
        denoise : bool
            Whether to denoise the camera's rendered image. Only available when using the RayTracer renderer. Defaults
            to True on Linux, otherwise False. If OptiX denoiser is not available in your platform, consider enabling
            the OIDN denoiser option when building the RayTracer.
        debug : bool
            Whether to use the debug camera. It enables to create cameras that can used to monitor / debug the
            simulation without being part of the "sensors". Their output is rendered by the usual simple Rasterizer
            systematically, no matter if BatchRender and RayTracer is enabled. This way, it is possible to record the
            simulation with arbitrary resolution and camera pose, without interfering with what robots can perceive
            from their environment. Defaults to False.

        Returns
        -------
        camera : genesis.Camera
            The created camera object.
        """
        if denoise is None:
            denoise = sys.platform != "darwin"
        return self._visualizer.add_camera(
            res, pos, lookat, up, model, fov, aperture, focus_dist, GUI, spp, denoise, env_idx, debug
        )

    @gs.assert_unbuilt
    def add_emitter(
        self,
        material: Material,
        max_particles=20000,
        surface: Surface | None = None,
    ):
        """