Sunday, July 12, 2015

vtk

 vtk는 3D 컴퓨터 그래픽, 모델링, 영상처리, 과학 및 정보의 영상화(visualization)를 위한 c++ 오픈소스 툴킷으로 python, java도 지원한다. 알고리즘을 구현하는 과정에서 console 출력밖에 마땅한 방법이 없어 고생하던 차에 오프소스에서 많이 사용하는 것을 보고 관심을 가지게 되었다.

 The Visualization Toolkit (VTK) is an open-source, freely available software system for 3D computer graphics, modeling, image processing, volume rendering, scientific visualization, and information visualization. VTK also includes ancillary support for 3D interaction widgets, two- and three-dimensional annotation, and parallel computing. At its core, VTK is implemented as a C++ toolkit, requiring users to build applications by combining various objects into an application. The system also supports automated wrapping of the C++ core into Python, Java, and Tcl, so VTK applications may also be written using these interpreted programming languages.

 적당한 도구를 발견하기 전까지는 OpenGL을 사용해 직접 그렸지만, 화려한 게임을 만들려는 것도 아닌데 너무 많은 속성지정이 필요하고, 직접 구현해야 하는 기능이 많은 탓에 3d 출력 구현에만 너무 많은 시간이 낭비되는 경험을 하기도 했다.  vtk는 패턴화된 파이프라인으로 통해 쉽게 3D 오브젝트 생성(출력)과 속성부여(색, 투명)가 가능하게 해준다.

vtk 설치법
 c++의 경우 대부분의 오픈소스가 그렇듯이, 소스코드를 다운로드 받고, 소스코드에 대해 camke를 이용해 프로젝트를 생성해서 직접 바이너리 파일(.lib, .dll 파일)을 컴파일하면 된다.

vtk 이해
 직관적인 vtk 파이프라인 구조 때문에, 아무리 설명을 읽어봤자, 사실 직접 예제를 컴파일해가면서 몇번 따라하는것만 못하다. 그럼에도 불구하고 궂이 파이라인 개념에 대한 설명을 읽자면, 내가 본 자료 중에선 아래 링크가 가장 쉽게 이해가 되었다.


원 출처에선, 색칠된 박스를 직접 클릭해 자세한 설명을 읽을 수 있다. 예제와 함께 파이프라인을 비교해보자.

 우선 프로젝트를 만들어야 한다.
 예제코드 밑의 'here to download cylinder'에서 소스코드를 다운받고, cmake를 이용해 프로젝트를 생성하면 된다. 소스코드를 읽어보면 다음과 같다.

vtkCylinderSource 객체로부터 실린더에 해당하는 형상정보(버텍스, 폴리곤등)을 가져온다.
실린더 형상의 속성을 default값으로부터 변경할 수 있다.
해당 예제에서는 Filter가 생략되고 바로 source로부터 Mapper로 바로 파이프가 연결되었다. 마지막으로 mapper는 actor로 연결된다.

 Renderer 상에 등록되는 actor는 말그대로 배우처럼 화면에 출력되는 object가 된다. 동일한 mapper를 참조하는 여러개의 actor를 생성하여 renderer에 등록(소스코드 addactor)하면 동일한 형상의 actor 여러개를 동시에 화면에 띄우게 가능하고, 이미 등록되어 화면에 출력중인 실린더actor에 대해 setmapper함수를 다시 호출하여 박스로 형상을 바꾸는것도 가능하다.
http://www.vtk.org/Wiki/VTK/Examples/Cxx/에서 필요한 예제들을 몇번 따라하고 읽어보면, 이해하는데는 큰 어려움은 없다.

 vtkSmartPointer가 이해가 안간다면 smart pointer에 대해 찾아보면 된다. 결론부터 말하자면 new, delete 를 자동화해 메모리 누수를 예방한다.

 actor는 강력한 기능이지만 그만큼 코스트가 많이 요구된다. 예를 들어 만개의 sampling 점집합을  만개의 radius 1짜리 spherer actor로 출력하는것보단 만개의 point로 이루어진 1개의 actor로 출력하는 쪽이 훨씬 합리적이다.

 나는 개인적으로 QVtkWidget내의 renderer에 actor들을 등록해 출력하는쪽을 선호한다. Qt가 제공하는 UI 추가가 훨씬 쉽기 때문에.

No comments:

Post a Comment