Google Colaboratory上でVTKの可視化を行うためには、ダミーのXセッションを起動する必要がありますが、Gooble Colaboratoryではバックグラウンドプロセルの起動はできないため、pyvirtualdisplayを起動して、DISPLAY環境変数を指定します。
!apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
!pip install vtk pyvirtualdisplay
pyvirtualdisplayを起動して、DISPLAY環境変数するためには、次のコードを実行します。
1
2
3
4
5
6
7
| -
!
| from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 480))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)
|
VTKのコードでは、vtkRenderWindowのwindowをvtkPNGWriterでメモリ上に出力し、それをIPython.displayに渡します。
以下は、その一例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
| import vtk
fileName = '/content/couette_flow_2d/couette_flow_2d-040.vtu'
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName(fileName)
reader.Update()
ug = reader.GetOutput()
ug.GetPointData().SetActiveScalars('Density')
mapper = vtk.vtkDataSetMapper()
mapper.SetInputConnection(reader.GetOutputPort())
mapper.SetScalarRange(ug.GetPointData().GetScalars().GetRange())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().EdgeVisibilityOn()
scalarBar = vtk.vtkScalarBarActor()
scalarBar.SetLookupTable(mapper.GetLookupTable())
scalarBar.SetTitle("Density")
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderer.AddActor(actor)
renderer.AddActor2D(scalarBar)
renderer.ResetCamera()
renderer.GradientBackgroundOn()
renderer.SetBackground(1, 1, 1)
renderer.SetBackground2(0, 0, 0)
renderWindow.SetSize(680, 480)
renderWindow.OffScreenRenderingOn()
w2if = vtk.vtkWindowToImageFilter()
w2if.SetInput(renderWindow)
w2if.Update()
writer = vtk.vtkPNGWriter()
writer.WriteToMemoryOn()
writer.SetInputConnection(w2if.GetOutputPort())
writer.Write()
data = bytes(memoryview(writer.GetResult()))
from IPython.display import Image
Image(data)
|