Programming/VTK

VTK를 설치하고 개인 프로젝트에 적용하는 방법 (2/2)

Mr.Jimmy 2019. 4. 10. 11:58

VTK를 다운받아 cmake를 활용해 설정한 후, 예제를 실행시켜보는 과정은 이전 post를 참조하길 바란다.

https://jihunlee25.tistory.com/entry/VTK%EB%A5%BC-%EC%84%A4%EC%B9%98%ED%95%98%EA%B3%A0-%EA%B0%9C%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-12

 

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 관련 파일들이 어디 존재하는지 모르기 때문에 당연히 오류가 난다.

프로젝트 속성 들어가기

먼저 프로젝트 속성으로 들어가주자.

VTK dll 파일 연결

먼저 구성 속성 → 디버깅 내의 작업 디렉터리를
이전 포스트에서 cmake 생성 파일이 저장된 곳 내부의 bin폴더로 경로를 설정해준다.

VTK 헤더 파일 연결

다음으로 C/C++  일반 내의 추가 포함 디렉터리를
이전 포스트에서 cmake 생성 파일이 저장된 곳 내부의 include 내부의 vtk-8.2 폴더로 경로를 설정해준다.

VTK lib 파일 연결

다음은 링커 → 일반 내의 추가 라이브러리 디렉터리를
이전 포스트에서 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

vtk lib 파일 입력

 

필요한 lib 파일들을 추가 종속성에 입력해주자.

모두 완료하고 나면 빨간 줄 없이 정상적으로 코드들이 동작하는 것을 확인할 수 있다.
직접 실행해보자.

빨간줄이 사라졌다!
정상적으로 Hello World가 출력됐다!

 

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를 적용시켜 활용하는 방법에 대해 알아보았다.