def autoscale(self): self.cam.lookat[0] = self.model.stat.center[0] self.cam.lookat[1] = self.model.stat.center[1] self.cam.lookat[2] = self.model.stat.center[2] self.cam.distance = 1.0 * self.model.stat.extent self.cam.camid = -1 self.cam.trackbodyid = -1 if self.window: width, height = glfw.get_framebuffer_size(self.window) mjlib.mjv_updateCameraPose(byref(self.cam), width * 1.0 / height)
def handle_scroll(self, window, x_offset, y_offset): # require model if not self.model: return # get current window size width, height = glfw.get_framebuffer_size(window) # scroll self.gui_lock.acquire() mjlib.mjv_moveCamera(C.MOUSE_ZOOM, 0, (-20 * y_offset), byref(self.cam), width, height) self.gui_lock.release()
def handle_mouse_move(self, window, xpos, ypos): # no buttons down: nothing to do if not self.button_left_pressed \ and not self.button_middle_pressed \ and not self.button_right_pressed: return # compute mouse displacement, save dx = int(self.scale * xpos) - self.last_mouse_x dy = int(self.scale * ypos) - self.last_mouse_y self.last_mouse_x = int(self.scale * xpos) self.last_mouse_y = int(self.scale * ypos) # require model if not self.model: return # get current window size width, height = glfw.get_framebuffer_size(self.window) # get shift key state mod_shift = glfw.get_key(window, glfw.KEY_LEFT_SHIFT) == glfw.PRESS \ or glfw.get_key(window, glfw.KEY_RIGHT_SHIFT) == glfw.PRESS # determine action based on mouse button action = None if self.button_right_pressed: action = C.MOUSE_MOVE_H if mod_shift else C.MOUSE_MOVE_V elif self.button_left_pressed: action = C.MOUSE_ROTATE_H if mod_shift else C.MOUSE_ROTATE_V else: action = C.MOUSE_ZOOM self.gui_lock.acquire() functions.mjv_moveCamera(action, dx, dy, byref(self.cam), width, height) self.gui_lock.release()
def start(self, window): self.running = True width, height = glfw.get_framebuffer_size(window) width1, height = glfw.get_window_size(window) self.scale = width * 1.0 / width1 self.window = window mjlib.mjv_makeObjects(byref(self.objects), 1000) mjlib.mjv_defaultCamera(byref(self.cam)) mjlib.mjv_defaultOption(byref(self.vopt)) mjlib.mjr_defaultOption(byref(self.ropt)) mjlib.mjr_defaultContext(byref(self.con)) if self.model: mjlib.mjr_makeContext(self.model.ptr, byref(self.con), 150) self.autoscale() else: mjlib.mjr_makeContext(None, byref(self.con), 150)
def handle_mouse_move(self, window, xpos, ypos): # no buttons down: nothing to do if not self.button_left_pressed \ and not self.button_middle_pressed \ and not self.button_right_pressed: return # compute mouse displacement, save dx = int(self.scale * xpos) - self.last_mouse_x dy = int(self.scale * ypos) - self.last_mouse_y self.last_mouse_x = int(self.scale * xpos) self.last_mouse_y = int(self.scale * ypos) # require model if not self.model: return # get current window size width, height = glfw.get_framebuffer_size(self.window) # get shift key state mod_shift = glfw.get_key(window, glfw.KEY_LEFT_SHIFT) == glfw.PRESS \ or glfw.get_key(window, glfw.KEY_RIGHT_SHIFT) == glfw.PRESS # determine action based on mouse button action = None if self.button_right_pressed: action = C.MOUSE_MOVE_H if mod_shift else C.MOUSE_MOVE_V elif self.button_left_pressed: action = C.MOUSE_ROTATE_H if mod_shift else C.MOUSE_ROTATE_V else: action = C.MOUSE_ZOOM self.gui_lock.acquire() mjlib.mjv_moveCamera(action, dx, dy, byref(self.cam), width, height) self.gui_lock.release()
def render(self): super(GatherViewer, self).render() tmpobjects = mjcore.MJVOBJECTS() mjlib.mjlib.mjv_makeObjects(byref(tmpobjects), 1000) for obj in self.env.objects: x, y, typ = obj # print x, y qpos = np.zeros_like(self.green_ball_model.data.qpos) qpos[0, 0] = x qpos[1, 0] = y if typ == APPLE: self.green_ball_model.data.qpos = qpos self.green_ball_model.forward() self.green_ball_renderer.render() mjextra.append_objects(tmpobjects, self.green_ball_renderer.objects) else: self.red_ball_model.data.qpos = qpos self.red_ball_model.forward() self.red_ball_renderer.render() mjextra.append_objects(tmpobjects, self.red_ball_renderer.objects) mjextra.append_objects(tmpobjects, self.objects) mjlib.mjlib.mjv_makeLights(self.model.ptr, self.data.ptr, byref(tmpobjects)) mjlib.mjlib.mjr_render(0, self.get_rect(), byref(tmpobjects), byref(self.ropt), byref(self.cam.pose), byref(self.con)) try: import OpenGL.GL as GL except: return def draw_rect(x, y, width, height): # start drawing a rectangle GL.glBegin(GL.GL_QUADS) # bottom left point GL.glVertex2f(x, y) # bottom right point GL.glVertex2f(x + width, y) # top right point GL.glVertex2f(x + width, y + height) # top left point GL.glVertex2f(x, y + height) GL.glEnd() def refresh2d(width, height): GL.glViewport(0, 0, width, height) GL.glMatrixMode(GL.GL_PROJECTION) GL.glLoadIdentity() GL.glOrtho(0.0, width, 0.0, height, 0.0, 1.0) GL.glMatrixMode(GL.GL_MODELVIEW) GL.glLoadIdentity() GL.glLoadIdentity() width, height = glfw.get_framebuffer_size(self.window) refresh2d(width, height) GL.glDisable(GL.GL_LIGHTING) GL.glEnable(GL.GL_BLEND) GL.glColor4f(0.0, 0.0, 0.0, 0.8) draw_rect(10, 10, 300, 100) apple_readings, bomb_readings = self.env.get_readings() for idx, reading in enumerate(apple_readings): if reading > 0: GL.glColor4f(0.0, 1.0, 0.0, reading) draw_rect(20 * (idx + 1), 10, 5, 50) for idx, reading in enumerate(bomb_readings): if reading > 0: GL.glColor4f(1.0, 0.0, 0.0, reading) draw_rect(20 * (idx + 1), 60, 5, 50)
def get_rect(self): rect = mjcore.MJRRECT(0, 0, 0, 0) rect.width, rect.height = glfw.get_framebuffer_size(self.window) return rect
def render(self): super(GatherViewer, self).render() tmpobjects = mjcore.MJVOBJECTS() mjlib.mjlib.mjv_makeObjects(byref(tmpobjects), 1000) for obj in self.env.objects: x, y, typ = obj # print x, y qpos = np.zeros_like(self.green_ball_model.data.qpos) qpos[0, 0] = x qpos[1, 0] = y if typ == APPLE: self.green_ball_model.data.qpos = qpos self.green_ball_model.forward() self.green_ball_renderer.render() mjextra.append_objects( tmpobjects, self.green_ball_renderer.objects) else: self.red_ball_model.data.qpos = qpos self.red_ball_model.forward() self.red_ball_renderer.render() mjextra.append_objects( tmpobjects, self.red_ball_renderer.objects) mjextra.append_objects(tmpobjects, self.objects) mjlib.mjlib.mjv_makeLights( self.model.ptr, self.data.ptr, byref(tmpobjects)) mjlib.mjlib.mjr_render(0, self.get_rect(), byref(tmpobjects), byref( self.ropt), byref(self.cam.pose), byref(self.con)) try: import OpenGL.GL as GL except: return def draw_rect(x, y, width, height): # start drawing a rectangle GL.glBegin(GL.GL_QUADS) # bottom left point GL.glVertex2f(x, y) # bottom right point GL.glVertex2f(x + width, y) # top right point GL.glVertex2f(x + width, y + height) # top left point GL.glVertex2f(x, y + height) GL.glEnd() def refresh2d(width, height): GL.glViewport(0, 0, width, height) GL.glMatrixMode(GL.GL_PROJECTION) GL.glLoadIdentity() GL.glOrtho(0.0, width, 0.0, height, 0.0, 1.0) GL.glMatrixMode(GL.GL_MODELVIEW) GL.glLoadIdentity() GL.glLoadIdentity() width, height = glfw.get_framebuffer_size(self.window) refresh2d(width, height) GL.glDisable(GL.GL_LIGHTING) GL.glEnable(GL.GL_BLEND) GL.glColor4f(0.0, 0.0, 0.0, 0.8) draw_rect(10, 10, 300, 100) apple_readings, bomb_readings = self.env.get_readings() for idx, reading in enumerate(apple_readings): if reading > 0: GL.glColor4f(0.0, 1.0, 0.0, reading) draw_rect(20 * (idx + 1), 10, 5, 50) for idx, reading in enumerate(bomb_readings): if reading > 0: GL.glColor4f(1.0, 0.0, 0.0, reading) draw_rect(20 * (idx + 1), 60, 5, 50)