一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①多渲染窗口的开启(共用一个camera)
二:代码及注释
python
import vtkmodules.vtkInteractionStyle
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
from vtkmodules.vtkFiltersSources import vtkConeSource, vtkCubeSource, vtkCylinderSource, vtkSphereSource
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderWindow,
vtkRenderWindowInteractor,
vtkRenderer
)
def get_sources():
sources = list()
sphere = vtkSphereSource()
sphere.SetCenter(0.0, 0.0, 0.0)
sphere.Update()
sources.append(sphere)
cone = vtkConeSource()
cone.SetCenter(0.0, 0.0, 0.0)
cone.SetDirection(0, 1, 0)
cone.Update()
sources.append(cone)
cube = vtkCubeSource()
cube.SetCenter(0.0, 0.0, 0.0)
cube.Update()
sources.append(cube)
cylinder = vtkCylinderSource()
cylinder.SetCenter(0.0, 0.0, 0.0)
cylinder.Update()
sources.append(cylinder)
return sources
def main():
simultaneous_update = True # True表示四个窗口一起动
colors = vtkNamedColors()
ren_bkg = ['AliceBlue', 'GhostWhite', 'WhiteSmoke', 'Seashell']
actor_color = ['Bisque', 'RosyBrown', 'Goldenrod', 'Chocolate']
width = 300
height = 300
dx = 20
dy = 40
w = width + dx
h = height + dy
interactors = []
running = [True, True, True, True]
camera = None
sources = get_sources()
kpis = []
for i in range(0, 4):
ren_win = vtkRenderWindow()
ren_win.SetSize(width, height)
renderer = vtkRenderer()
if i == 0:
camera = renderer.GetActiveCamera()
camera.Azimuth(30)
camera.Elevation(30)
else:
renderer.SetActiveCamera(camera)
ren_win.AddRenderer(renderer)
iren = vtkRenderWindowInteractor()
interactors.append(iren)
iren.SetRenderWindow(ren_win)
ren_win.Render()
ren_win.SetWindowName('MultipleRenderWindows {:d}'.format(i))
ren_win.SetPosition((i % 2) * w, h - (i // 2) * h)
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(sources[i].GetOutputPort())
actor = vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(colors.GetColor3d(actor_color[i]))
renderer.AddActor(actor)
renderer.SetBackground(colors.GetColor3d(ren_bkg[i]))
renderer.ResetCamera()
kpis.append(KeyPressInteractorStyle(parent=iren))
interactors[i].SetInteractorStyle(kpis[i])
kpis[i].status = running[i]
if simultaneous_update:
interactors[0].Initialize()
while all(x is True for x in running): # 死循环,一直执行
for i in range(0, 4):
running[i] = kpis[i].status
if running[i]:
interactors[i].ProcessEvents()
interactors[i].Render()
else:
interactors[i].TerminateApp()
print('Window', i, 'has stopped running.')
else:
interactors[0].Start()
class KeyPressInteractorStyle(vtkInteractorStyleTrackballCamera):
def __init__(self, parent=None, status=True):
self.parent = vtkRenderWindowInteractor()
self.status = status
if parent is not None:
self.parent = parent
self.AddObserver('KeyPressEvent', self.key_press_event)
def key_press_event(self, obj, event):
key = self.parent.GetKeySym().lower()
if key == 'e' or key == 'q':
self.status = False
return
if __name__ == '__main__':
main()