VTK入门(一)--分析示例程序,对图形拉伸

作为一个刚刚入门VTK的菜鸟,我决定先从分析vtk的示例程序做起。

vtk的程序流程通常是下面这样子的:

  1. 读取或者生成数据
            vtk中提供了获取数据的方法,一种是直接从文件中读取数据,另一种是生成相应的源对象(流水线的起点操作),通过vtkConeSource *cone = vtkConeSource::New();生成一个源对象(椎体)。
  2. 过滤、映射
            过滤器将原始数据进行处理以得到我们想要的数据,一个输入一个输出或多个输入一个输出。
            映射器对象是可视化流水线的接口,将过滤器得到的数据映射成我们需要的几何元素。
  3. 绘制
            vtkRenderer *ren1= vtkRenderer::New();//创建一个Renderer并且分配给他actor
            ren1->AddActor( coneActor );
            ren1->SetBackground( 0.1, 0.2, 0.4 );
            绘制器可以看做是一个视口,负责对actor进行绘制
  4. 交互
            创建了数据后通常都需要进行交互,vtk提供了两种交互的方式,一种是使用vtkRenderWindowInteractor进行交互,另外一种是用户可以自己针对事件进行绑定。
总结出来是下面这样:

        vtkSource->vtkFilter->vtkMapper->vtkActor->vtkRender。

下面贴出代码分析:

class vtkMyCallback : public vtkCommand
{
public:
  static vtkMyCallback *New()             //vkt的实例化都是通过New()来实现的
    { return new vtkMyCallback; }
  virtual void Execute(vtkObject *caller, unsigned long, void*)
    {
      vtkTransform *t = vtkTransform::New();
      vtkBoxWidget *widget = reinterpret_cast(caller);
      widget->GetTransform(t);
      widget->GetProp3D()->SetUserTransform(t);
      t->Delete();
    }
};

int main()
{
  //数据源对象
  vtkConeSource *cone = vtkConeSource::New();
  cone->SetHeight( 3.0 );
  cone->SetRadius( 1.0 );
  cone->SetResolution( 10 );
  
  //映射器,接受cone的输出,将数据映射为几何元素
  vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
  coneMapper->SetInputConnection( cone->GetOutputPort() ); 

  //演员出场
  vtkActor *coneActor = vtkActor::New();
  coneActor->SetMapper( coneMapper );

  //绘制器
  vtkRenderer *ren1= vtkRenderer::New();
  ren1->AddActor( coneActor );
  ren1->SetBackground( 0.1, 0.2, 0.4 );

  //通过AddRenderer将renderer绘制到窗口上
  vtkRenderWindow *renWin = vtkRenderWindow::New();
  renWin->AddRenderer( ren1 );
  renWin->SetSize( 300, 300 );

  //vtkRenderWindowInteracor类捕捉窗口的鼠标的键盘事件,然后分配给其他的类。
  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  iren->SetRenderWindow(renWin);

  //要在vtk中添加新的交互方式需要从tkInteractorStyle 类中派生新的类,如 vtkInteractorStyleTrackballCamera实现操作杆交互方式,对相机进行交互。
    vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New(); 
    iren->SetInteractorStyle(style);//使用vtkBoxWidget对象来对actor进行相应的转换变形,生成窗口小部件,SetInteractor方法建立交互 
    vtkBoxWidget *boxWidget = vtkBoxWidget::New();
    boxWidget->SetInteractor(iren); 
    boxWidget->SetPlaceFactor(1.25);  //缩放系数 
    boxWidget->SetProp3D(coneActor);
    boxWidget->PlaceWidget(); 
    vtkMyCallback *callback = vtkMyCallback::New();
  //每个vtk类都提供一个AddObserver方法建立回调,如果Observer监控的对象的一个事件被触发,则一个响应的回调函数就会被调用。在boxWidget上为InterractionEvent建  //立一个Observer,只要运行Excute(),就进行回调
  boxWidget->AddObserver(vtkCommand::InteractionEvent, callback);

  
  boxWidget->On();

  
  iren->Initialize();
  iren->Start();
  
  
  cone->Delete();
  coneMapper->Delete();
  coneActor->Delete();
  callback->Delete();
  boxWidget->Delete();
  ren1->Delete();
  renWin->Delete();
  iren->Delete();
  style->Delete();

  return 0;
}


相应的头文件就不说了,程序解析如上注释。

示例效果图入选:

VTK入门(一)--分析示例程序,对图形拉伸_第1张图片


      

你可能感兴趣的:(VTK入门(一)--分析示例程序,对图形拉伸)