Search code examples
pythonopencvgtkpygtkmayavi

Mayavi - Mouse hovering interaction & plot same scene from different perspectives


i am currently struggling to see through how to interact in an appropriate way with a mayavi rendered scene.

I have a lidar point cloud which gets plotted by the function points3d(), now i have set in addition a bounding box around a car in between the point cloud, and i would like to change the color of the points inside the box as soon as i hover with my mouse over the bounding box. Can you tell me how I can just select the points inside the bbox and change their color?

And my second question is, how can i show the same scene of the pointcloud in a 3d view and a bird view, concurrently?

Thank you very much :]


Solution

  • I have found a solution regarding the color problem - I don't know if it is best practice. But i still need help for determining the points inside the bounding box. I would also like to create a gui which enables the user to modify the size and orientation of the bounding box. [but that is an other topic]

    import numpy as np
    from mayavi.mlab import draw, points3d
    from tvtk.api import tvtk
    
    # Primitives
    N = 3000 # Number of points
    ones = np.ones(N) #np.hstack((np.tile(np.array([1]), int(N/2)).T,  np.tile(np.array([4000]),  int(N/2)).T))
    scalars = ones #np.arange(N)  # Key point: set an integer for each point
    
    # Define color table (including alpha), which must be uint8 and [0,255]
    colors = np.vstack((np.tile(np.array([[255],[255],[0]]), int(N/2)).T,  np.tile(np.array([[0],[0],[255]]),  int(N/2)).T))
    # Define coordinates and points
    x, y, z = (np.random.random((N, 3))*255).astype(np.uint8).T # Assign x, y, z values to match color
    pts = points3d(x, y, z, scale_factor=10) # Create points
    #pts.glyph.color_mode = 'color_by_vector' # Color by scalar
    # Set look-up table and redraw
    #pts.module_manager.scalar_lut_manager.lut.table = colors
    pts.glyph.scale_mode = 'scale_by_vector'
    sc=tvtk.UnsignedCharArray()
    sc.from_array(colors)
    pts.mlab_source.dataset.point_data.scalars = sc
    draw()