@@ -63,9 +63,9 @@ class MujocoEnv(metaclass=EnvMeta):
6363 has_renderer (bool): If true, render the simulation state in
6464 a viewer instead of headless mode.
6565 has_offscreen_renderer (bool): True if using off-screen rendering.
66- render_camera (str): Name of camera to render if `has_renderer` is True. Setting this value to 'None'
66+ render_camera (str or list of str ): Name of camera to render if `has_renderer` is True. Setting this value to 'None'
6767 will result in the default angle being applied, which is useful as it can be dragged / panned by
68- the user using the mouse
68+ the user using the mouse. When a list of strings is provided, it will render from multiple camera angles.
6969 render_collision_mesh (bool): True if rendering collision meshes
7070 in camera. False otherwise.
7171 render_visual_mesh (bool): True if rendering visual meshes
@@ -110,6 +110,8 @@ def __init__(
110110 self .has_renderer = has_renderer
111111 # offscreen renderer needed for on-screen rendering
112112 self .has_offscreen_renderer = (has_renderer and renderer != "mjviewer" ) or has_offscreen_renderer
113+ if render_camera is not None and isinstance (render_camera , str ):
114+ render_camera = [render_camera ]
113115 self .render_camera = render_camera
114116 self .render_collision_mesh = render_collision_mesh
115117 self .render_visual_mesh = render_visual_mesh
@@ -179,7 +181,8 @@ def initialize_renderer(self):
179181 from robosuite .renderers .viewer import MjviewerRenderer
180182
181183 if self .render_camera is not None :
182- camera_id = self .sim .model .camera_name2id (self .render_camera )
184+ assert len (self .render_camera ) == 1 , "Only one camera can be specified for mjviewer"
185+ camera_id = self .sim .model .camera_name2id (self .render_camera [0 ])
183186 else :
184187 camera_id = None
185188 self .viewer = MjviewerRenderer (env = self , camera_id = camera_id , ** self .renderer_config )
@@ -323,8 +326,11 @@ def _reset_internal(self):
323326
324327 # Set the camera angle for viewing
325328 if self .render_camera is not None :
326- camera_id = self .sim .model .camera_name2id (self .render_camera )
327- self .viewer .set_camera (camera_id )
329+ camera_ids = []
330+ for cam in self .render_camera :
331+ camera_id = self .sim .model .camera_name2id (cam )
332+ camera_ids .append (camera_id )
333+ self .viewer .set_camera (camera_ids )
328334
329335 elif self .renderer == "mjviewer" :
330336 self .initialize_renderer ()
0 commit comments