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

上一篇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里面的后续几个例子了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值