From aeb9ebaeb9c925e41428c4ecc8aaba9190d5892e Mon Sep 17 00:00:00 2001 From: Rafael Papallas Date: Wed, 24 Aug 2022 16:31:43 +0100 Subject: [PATCH 1/3] Added method to update window's title --- mujoco_viewer/mujoco_viewer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mujoco_viewer/mujoco_viewer.py b/mujoco_viewer/mujoco_viewer.py index 7cc0cc7..e9988f4 100644 --- a/mujoco_viewer/mujoco_viewer.py +++ b/mujoco_viewer/mujoco_viewer.py @@ -118,6 +118,9 @@ def __init__( self._overlay = {} self._markers = [] + def set_title(self, new_title): + glfw.set_window_title(self.window, new_title) + def add_marker(self, **marker_params): self._markers.append(marker_params) From b7b0ac64a3fa73cb7b60e59b026d80cd603d2c1d Mon Sep 17 00:00:00 2001 From: Rafael Papallas Date: Thu, 25 Aug 2022 12:56:42 +0100 Subject: [PATCH 2/3] Exposed a save_screenshot method to allow clients to save a screenshot programmatically. --- mujoco_viewer/callbacks.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mujoco_viewer/callbacks.py b/mujoco_viewer/callbacks.py index 92c63b8..f3497cc 100644 --- a/mujoco_viewer/callbacks.py +++ b/mujoco_viewer/callbacks.py @@ -35,6 +35,14 @@ def __init__(self, hide_menus): self._advance_by_one_step = False self._hide_menus = hide_menus + def save_screenshot(self, file_name): + img = np.zeros( + (glfw.get_framebuffer_size( + self.window)[1], glfw.get_framebuffer_size( + self.window)[0], 3), dtype=np.uint8) + mujoco.mjr_readPixels(img, None, self.viewport, self.ctx) + imageio.imwrite(file_name, np.flipud(img)) + def _key_callback(self, window, key, scancode, action, mods): if action != glfw.RELEASE: if key == glfw.KEY_LEFT_ALT: @@ -65,12 +73,7 @@ def _key_callback(self, window, key, scancode, action, mods): self._render_every_frame = not self._render_every_frame # Capture screenshot elif key == glfw.KEY_T: - img = np.zeros( - (glfw.get_framebuffer_size( - self.window)[1], glfw.get_framebuffer_size( - self.window)[0], 3), dtype=np.uint8) - mujoco.mjr_readPixels(img, None, self.viewport, self.ctx) - imageio.imwrite(self._image_path % self._image_idx, np.flipud(img)) + self.save_screenshot(self._image_path % self._image_idx) self._image_idx += 1 # Display contact forces elif key == glfw.KEY_C: From 7e35ed1c11afa28e4af49e54ff60c7c46e58026d Mon Sep 17 00:00:00 2001 From: Rafael Papallas Date: Thu, 25 Aug 2022 13:01:19 +0100 Subject: [PATCH 3/3] Updated README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 0d47d24..aa15ca1 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,11 @@ img = viewer.read_pixels(camid=2) ## do something cool with img ``` +# Other features +1. You can save a screenshot of the viewer programmatically: + `viewer.save_screenshot('path/to/save.png')`. + + # Optional Parameters - `title`: set the title of the window, for example: `viewer = mujoco_viewer.MujocoViewer(model, data, title='My Demo')` (defaults to `mujoco-python-viewer`).