VTK를 설치하고 개인 프로젝트에 적용하는 방법 (2/2)
VTK를 다운받아 cmake를 활용해 설정한 후, 예제를 실행시켜보는 과정은 이전 post를 참조하길 바란다.
VTK를 설치하고 개인 프로젝트에 적용하는 방법 (1/2)
Volume Rendering 관련 프로젝트를 맡게 되면서 VTK를 활용하게 됐다. VTK(Visualization TooKit)는 객체지향 기법으로 설계, 구현된 3차원 그래픽 C++ 클래스 라이브러리이다. 쉽게 보자면 데이터를 시각화해서..
jihunlee25.tistory.com
이번 시간에는 빈 프로젝트를 만들어 VTK를 적용시켜 볼 것이다.
먼저 프로젝트를 생성해 cpp파일을 하나 만들어주자.
일단 예제 코드를 입력해볼 것이다.
항상 시작은 "Hello World"부터 시작해야 한다.
아래 코드를 따라서 쳐보자.
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
|
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkSmartPointer.h>
#include <vtkTextActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main(int /*argc*/, char ** /*argv*/)
{
auto textActor = vtkSmartPointer<vtkTextActor>::New();
textActor->SetInput("Hello World");
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(textActor);
renderer->ResetCamera();
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetInteractor(interactor);
interactor->Start();
return 0;
}
|
cs |
그러면 아래와 같이 많은 빨간 줄이 뜰 것이다.
현재 프로젝트에서는 vtk 관련 파일들이 어디 존재하는지 모르기 때문에 당연히 오류가 난다.
먼저 프로젝트 속성으로 들어가주자.
먼저 구성 속성 → 디버깅 내의 작업 디렉터리를
이전 포스트에서 cmake 생성 파일이 저장된 곳 내부의 bin폴더로 경로를 설정해준다.
다음으로 C/C++ → 일반 내의 추가 포함 디렉터리를
이전 포스트에서 cmake 생성 파일이 저장된 곳 내부의 include 내부의 vtk-8.2 폴더로 경로를 설정해준다.
다음은 링커 → 일반 내의 추가 라이브러리 디렉터리를
이전 포스트에서 cmake 생성 파일이 저장된 곳 내부의 lib 폴더로 경로를 설정해준다.
이제 링커 → 입력 내의 추가 종속성에 사용할 lib 파일 이름들을 추가시켜줘야 하는데
자주 사용하는 vtk lib들을 적어두겠다. 각각 추가해주길 바란다.
현재 프로젝트에서 사용되는 lib는 굵은 글씨로 표시해두었다.
- vtkCommonCore-8.2.lib
- vtkCommonDataModel-8.2.lib
- vtkCommonExecutionModel-8.2.lib
- vtkCommonSystem-8.2.lib
- vtkCommonMath-8.2.lib
- vtkCommonTransforms-8.2.lib
- vtkFiltersGeneral-8.2.lib
- vtkInteractionStyle-8.2.lib
- vtkIOCore-8.2.lib
- vtkIOImage-8.2.lib
- vtkIOLegacy-8.2.lib
- vtkRenderingCore-8.2.lib
- vtkRenderingFreeType-8.2.lib
- vtkRenderingVolume-8.2.lib
- OpenGL related libraries
- for OpenGL
- vtkRenderingOpenGL-8.2.lib
- vtkRenderingVolumeOpenGL-8.2.lib
- for OpenGL2
- vtkRenderingOpenGL2-8.2.lib
- vtkRenderingVolumeOpenGL2-8.2.lib
- for OpenGL
필요한 lib 파일들을 추가 종속성에 입력해주자.
모두 완료하고 나면 빨간 줄 없이 정상적으로 코드들이 동작하는 것을 확인할 수 있다.
직접 실행해보자.
1
2
3
|
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);
|
cs |
VTK_MODULE_INIT 은 필요한 모듈 / 라이브러리를 초기화하기 위해 사용되는 매크로이다.
여기서 사용될 모듈을 초기화하지 않으면 <ClassName>::New()를 호출할 때 NULL이 반환되어 런타임 오류가 발생한다.
1
2
|
auto textActor = vtkSmartPointer<vtkTextActor>::New();
textActor->SetInput("Hello World");
|
cs |
vtkTextActor는 문자열을 화면에 표시하는 데 사용할 수 있는 간단한 클래스이다.
이와 같은 방법으로 vtkTextActor 객체를 만들어 문자열을 화면에 설정할 수 있다.
참고로 vtkSmartPointer는 vtkObject의 파생 클래스 인스턴스들의 수명을 제어하며 참조 횟수를 관리한다. 이를 활용해 다양한 vtk 객체들을 쉽게 호출할 수 있다.
1
2
3
|
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(textActor);
renderer->ResetCamera();
|
cs |
vtkRender는 화면에 출력되는 내용을 관리하는 클래스이다.
이전에 만들었던 textActor를 받아서 renderer에 적용시켜 주는 코드이다.
1
2
3
4
5
|
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetInteractor(interactor);
|
cs |
vtkRenderWindowInteractor는 사용자 입력(마우스/키보드/타이밍) 이벤트를 해당 작업에 매핑하는 클래스이다.
vtkRenderWindow 객체에서 랜더링 할 윈도우를 만들고 랜더러를 추가한 다음 인터렉터를 설정한다. 사용 가능한 함수와 등록된 클래스들을 기반으로 적절한 구현을 자동으로 선택해준다.
1
|
interactor->Start();
|
cs |
이 코드는 사용자가 종료를 요청하거나 창을 닫을 때만 리턴되는 블로킹 호출이다.
지금까지 개인 프로젝트에 VTK를 적용시켜 활용하는 방법에 대해 알아보았다.