def select(self, cursor_position): """Returns bodies and geoms visible at given coordinates in the frame. Args: cursor_position: A `tuple` containing x and y coordinates, normalized to between 0 and 1, and where (0, 0) is bottom-left. Returns: A `Selected` namedtuple. Fields are None if nothing is selected. """ self.update() aspect_ratio = self._width / self._height cursor_x, cursor_y = cursor_position pos = np.empty(3, np.double) selected_geom = mjlib.mjv_select( self._physics.model.ptr, self._physics.data.ptr, self._scene_option.ptr, aspect_ratio, cursor_x, cursor_y, self._scene.ptr, pos) if selected_geom == -1: # Nothing was selected. return Selected(body=None, geom=None, world_position=None) else: assert 0 <= selected_geom < self._physics.model.ngeom selected_body = self._physics.model.geom_bodyid[selected_geom] assert 0 <= selected_body < self._physics.model.nbody return Selected( body=selected_body, geom=selected_geom, world_position=pos)
def select(self, cursor_position): """Returns bodies and geoms visible at given coordinates in the frame. Args: cursor_position: A `tuple` containing x and y coordinates, normalized to between 0 and 1, and where (0, 0) is bottom-left. Returns: A `Selected` namedtuple. Fields are None if nothing is selected. """ self.update() aspect_ratio = self._width / self._height cursor_x, cursor_y = cursor_position pos = np.empty(3, np.double) geom_id_arr = np.intc([-1]) skin_id_arr = np.intc([-1]) body_id = mjlib.mjv_select( self._physics.model.ptr, self._physics.data.ptr, self._scene_option.ptr, aspect_ratio, cursor_x, cursor_y, self._scene.ptr, pos, geom_id_arr, skin_id_arr) [geom_id] = geom_id_arr [skin_id] = skin_id_arr # Validate IDs if body_id != -1: assert 0 <= body_id < self._physics.model.nbody else: body_id = None if geom_id != -1: assert 0 <= geom_id < self._physics.model.ngeom else: geom_id = None if skin_id != -1: assert 0 <= skin_id < self._physics.model.nskin else: skin_id = None if all(id_ is None for id_ in (body_id, geom_id, skin_id)): pos = None return Selected( body=body_id, geom=geom_id, skin=skin_id, world_position=pos)
def raycast(self, viewport, screen_pos): """Shoots a ray from the specified viewport position into the scene.""" if not self.is_initialized: return -1, None viewport_pos = viewport.screen_to_inverse_viewport(screen_pos) grab_world_pos = np.empty(3, dtype=np.double) selected_geom_id_arr = np.intc([-1]) selected_skin_id_arr = np.intc([-1]) selected_body_id = mjlib.mjv_select( self._model.ptr, self._data.ptr, self._options.visualization.ptr, viewport.aspect_ratio, viewport_pos[0], viewport_pos[1], self._scene.ptr, grab_world_pos, selected_geom_id_arr, selected_skin_id_arr) del selected_geom_id_arr, selected_skin_id_arr # Unused. if selected_body_id < 0: selected_body_id = _INVALID_BODY_INDEX grab_world_pos = None return selected_body_id, grab_world_pos
def raycast(self, viewport, screen_pos): """Shoots a ray from the specified viewport position into the scene.""" if not self.is_initialized: return -1, None viewport_pos = viewport.screen_to_inverse_viewport(screen_pos) grab_world_pos = np.zeros(3) selected_geom_id = mjlib.mjv_select(self._model.ptr, self._data.ptr, self._options.visualization.ptr, viewport.aspect_ratio, viewport_pos[0], viewport_pos[1], self._scene.ptr, grab_world_pos) if selected_geom_id >= 0: selected_body_id = self._model.geom_bodyid[selected_geom_id] else: selected_body_id = _INVALID_BODY_INDEX grab_world_pos = None return selected_body_id, grab_world_pos