본문 바로가기
Ect./Library

VTK 의 작동 Flow

by 쿠리의일상 2023. 12. 12.

VTK 

3D 시각화 및 데이터 처리를 위한 라이브러리

 

VTK Obejct Model

1. Graphics : Rendering

2. Visualization : Generating graphic objects to represent the data

Source Filter Mapper Actor Renderer
Visualization model Visualization model
+
Graphics model
Graphics model

 

Demand-driven

VTK는 데이터가 변경되는 시점에 업데이트가 이뤄지는 것(Event-driven)이 아닌 모든 데이터가 처리를 완료하고 명령 요청을 한 시점에 한번에 업데이트를 진행한다

 

 

아래와 같은 순서로 시각화가 처리된다.

1. 데이터 입력

vtkReader 의 서브 클래스 등을 사용하여 모델 데이터를 가져와줌

또는 vtkPoints 와 vtkCellArray, vtkSource 등 그려줄 수 있는 클래스를 사용하여 데이터를 직접 그려줄 수 있음

 

2. 데이터 전처리

vtkFilter, vtkProperty 등 데이터를 분석 및 전처리(변환/축소)

 

3. Mapping

데이터를 그래픽 객체로 변환

vtkMapper 를 사용하여 SetInputConnection() 으로 연결

 

4. Actor

vtkActor, vtkVolume 등을 사용한 3D 객체

3D 객체의 위치, 크기, 각도, 색, 회전 ...

vtkLight, vtkCamera 등 활용

 

5. Renderer

렌더링 엔진

vtkRenderer 로 설정해주며 3D 객체를 렌더링

 

6. Windowing

vtkRenderWindow(= Scene) 와 vtkRenderWindowInteractor(= Viewer) 를 사용하여 그래픽 사용자 인터페이스 구현

 

위의 순서를 기반으로 아래의 코드처럼 작동하게 된다

colors = vtk.vtkNamedColors()

# 데이터 입력
points = vtk.vtkPoints()
points.InsertNextPoint(10, 10, 0)
points.InsertNextPoint(100, 100, 0)
points.InsertNextPoint(200, 200, 0)

polydata = vtk.vtkPolyData()
polydata.SetPoints(points)

# 데이터 전처리
glyphFilter = vtk.vtkVertexGlyphFilter()
glyphFilter.SetInputData(polydata)
glyphFilter.Update()

# Mapping
mapper = vtk.vtkPolyDataMapper2D()
mapper.SetInputConnection(glyphFilter.GetOutputPort())
mapper.Update()

# Actor
actor = vtk.vtkActor2D()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(colors.GetColor3d('Gold'))
actor.GetProperty().SetPointSize(8)

# Renderer 렌더링 엔진
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

# Windowing, Scene
renderer.AddActor(actor)
renderWindow.SetSize(300, 300)
renderer.SetBackground(colors.GetColor3d('DarkSlateGray'))

renderWindow.SetWindowName('Actor2D')

# Render
renderWindow.Render()

# RenderWindow Interactor
renderWindowInteractor.Start()