Search code examples
vtkgame-developmentpyopengl

Python rendering 3D, 2D images within a same window


I am trying to create a simple robot simulator with 3D + 2D(bird-eye view mini-map) like the below image.

My map file is just a list of vertices for polygon and center/radius for circles (all objects are heights of 1 where z = 0).

I found that python VTK plotter makes it really easy to visualize simple object but there is a lack of documentation for the multi-view windows. I also tried open-cv but it creates a 2D image in a separate window.

What would be the easiest way to achieve a simulator like below? There would be very few objects on the map so efficiency is not my concern.

enter image description here


Solution

  • My strategy for making a 2D mini-map overlay like this is to use glWindowPos2d and glDrawPixels, and I have found it to be very successful. You'll want to turn off common OpenGL features like texturing, lighting, and the depth test. In the following example, minimap_x and minimap_y are the window coordinates of the upper-left corner of the minimap.

    For example:

    glDisable(GL_TEXTURE_2D)
    glDisable(GL_LIGHTING)
    glDisable(GL_DEPTH_TEST)
    
    glWindowPos2d(minimap_x, window_height - (minimap_y + minimap_height))
    glDrawPixels(minimap_width, minimap_height, GL_RGBA, GL_UNSIGNED_BYTE, minimap_image)
    
    glEnable(GL_TEXTURE_2D)
    glEnable(GL_LIGHTING)
    glEnable(GL_DEPTH_TEST)
    

    You'll need to provide the minimap_image data.

    In my applications, I'm typically using PyGame, and so the minimap is on a PyGame Surface. Converting the Surface to raw image data usable by glDrawPixels looks like this:

     minimap_image = pygame.image.tostring(minimap_surface, "RGBA", True)