vtk例子中tutorial里的实例源码详解

来源:互联网 发布:数据运营专员做什么的 编辑:程序博客网 时间:2024/06/05 04:00

上一篇blog讲解了cmake编译或者自己添加工程的include,lib的方法,因此对源代码进行进一步的说明,从而有利于更好的理解vtk和cmake编程。


cmake代码详解:


打开tutorial里step文件夹的CMakeLists.txt文件,该文件定义了整个工程基本信息。


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PROJECT (Step1) //定义工程名为 Step1


IF(NOT VTK_BINARY_DIR)  //寻找是否已经定义 VTK_BINARY_DIR变量
/* 一般情况下,这个值得是vtk dll文件的路径*/



FIND_PACKAGE(VTK REQUIRED)   //通过这行命令,找到vtk需要的文件,库等的路径
IF(NOT VTK_USE_RENDERING)   //如果没有定义VTK_USE_RENDERING就输出如下的错误信息
  MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.")
ENDIF(NOT VTK_USE_RENDERING)
INCLUDE(${VTK_USE_FILE})   //添加include文件,整个变量路径为 VTK_USE_FILE
ENDIF(NOT VTK_BINARY_DIR)


ADD_EXECUTABLE(Cone Cone.cxx)  //添加Cone.cxx文件,编译生成Cone.exe运行文件
TARGET_LINK_LIBRARIES(Cone vtkRendering)  //添加工程需要依赖的 vtkRendering






下面来查看一下这些变量,通过Message输出显示:
修改源代码如下:


cmake_minimum_required(VERSION 2.8) //添加cmake版本要求,否则会出现warning


PROJECT (Step1)


IF(NOT VTK_BINARY_DIR)
Message("vtk binary dir: ${VTK_BINARY_DIR}")
FIND_PACKAGE(VTK REQUIRED)
IF(NOT VTK_USE_RENDERING)
  MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.")
ENDIF(NOT VTK_USE_RENDERING)
INCLUDE(${VTK_USE_FILE})
Message("vtk use file: ${VTK_USE_FILE}")
ENDIF(NOT VTK_BINARY_DIR)


ADD_EXECUTABLE(Cone Cone.cxx)
TARGET_LINK_LIBRARIES(Cone vtkRendering)


输出显示为:
vtk binary dir: 
vtk use file: C:/Program Files/VTK/lib/vtk-5.10/UseVTK.cmake


由此可见:
VTK_BINARY_DIR 为 NULL
VTK_USE_FILE 为 C:/Program Files/VTK/lib/vtk-5.10/UseVTK.cmake
整个工程师通过UseVTK.cmake找到vtk的目录






程序源码详解:


#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"


int main()
{
  //构建cone source 数据模型
  vtkConeSource *cone = vtkConeSource::New();
  cone->SetHeight( 3.0 );
  cone->SetRadius( 1.0 );
  cone->SetResolution( 10 );
  
  //将模型添加到mapper中,从而可以显示
  vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
  coneMapper->SetInputConnection( cone->GetOutputPort() );


  //将mapper添加到 actor中,这里还可以设置模型显示的其他属性
  vtkActor *coneActor = vtkActor::New();
  coneActor->SetMapper( coneMapper );


  //render用来管理绘制场景的,可以定义其在window中占比和位置等
  vtkRenderer *ren1= vtkRenderer::New();
  ren1->AddActor( coneActor );
  ren1->SetBackground( 0.1, 0.2, 0.4 );


  //显示的窗口,主要管理render的绘制
  vtkRenderWindow *renWin = vtkRenderWindow::New();
  renWin->AddRenderer( ren1 );
  renWin->SetSize( 300, 300 );


  //通过修改camera,从而能够看到window中的模型旋转一周,否则会一闪而过
  int i;
  for (i = 0; i < 360; ++i)
    {
    // render the image
    renWin->Render();
    // rotate the active camera by one degree
    ren1->GetActiveCamera()->Azimuth( 1 );
    }
  
  /* vtk中的类都是通过工厂模式创建的,其开辟的空间都需要Delete函数释放,当然,可以通过智能指针统一管理,vtkSmartPoints */
  cone->Delete();
  coneMapper->Delete();
  coneActor->Delete();
  ren1->Delete();
  renWin->Delete();


  return 0;
}


好了,现在大家可以按照同样的方式,练习和学习tutorial里面的后续几个例子了。

0 0