MultipleViewports
Repository source: MultipleViewports
Description¶
This example creates a window with 4 viewports. Updating the camera position in one viewport will also update the position in the other viewports.
See MultipleRenderWindows for an example using multiple windows.
Question
If you have a question about this example, please use the VTK Discourse Forum
Code¶
MultipleViewports.py
#!/usr/bin/env python3
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import (
    vtkConeSource,
    vtkCubeSource,
    vtkCylinderSource,
    vtkSphereSource
)
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)
def main():
    colors = vtkNamedColors()
    # One render window, multiple viewports.
    rw = vtkRenderWindow(size=(600, 600), window_name='MultipleViewPorts')
    iren = vtkRenderWindowInteractor()
    iren.render_window = rw
    # Define viewport ranges.
    xmins = [0, .5, 0, .5]
    xmaxs = [0.5, 1, 0.5, 1]
    ymins = [0, 0, .5, .5]
    ymaxs = [0.5, 0.5, 1, 1]
    # Have some fun with colors.
    ren_bkg = ['AliceBlue', 'GhostWhite', 'WhiteSmoke', 'Seashell']
    actor_color = ['Bisque', 'RosyBrown', 'Goldenrod', 'Chocolate']
    sources = get_sources()
    camera = None
    for i in range(4):
        # Create a mapper and actor
        mapper = vtkPolyDataMapper()
        mapper.SetInputConnection(sources[i].GetOutputPort())
        actor = vtkActor()
        actor.GetProperty().SetColor(colors.GetColor3d(actor_color[i]))
        actor.SetMapper(mapper)
        ren = vtkRenderer(viewport=(xmins[i], ymins[i], xmaxs[i], ymaxs[i]), background=colors.GetColor3d(ren_bkg[i]))
        rw.AddRenderer(ren)
        ren.AddActor(actor)
        # Share the camera between viewports.
        if i == 0:
            camera = ren.active_camera
            camera.Azimuth(30)
            camera.Elevation(30)
        else:
            ren.active_camera = camera
        ren.ResetCamera()
    rw.Render()
    iren.Start()
def get_sources():
    sources = list()
    # Create a sphere
    sphere = vtkSphereSource(center=(0.0, 0.0, 0.0))
    sources.append(sphere)
    cone = vtkConeSource(center=(0.0, 0.0, 0.0), direction=(0, 1, 0))
    sources.append(cone)
    cube = vtkCubeSource(center=(0.0, 0.0, 0.0))
    sources.append(cube)
    cylinder = vtkCylinderSource(center=(0.0, 0.0, 0.0))
    sources.append(cylinder)
    return sources
if __name__ == '__main__':
    main()
