作为一个刚刚入门VTK的菜鸟,我决定先从分析vtk的示例程序做起。
vtk的程序流程通常是下面这样子的:
- 读取或者生成数据
vtk中提供了获取数据的方法,一种是直接从文件中读取数据,另一种是生成相应的源对象(流水线的起点操作),通过vtkConeSource *cone = vtkConeSource::New();生成一个源对象(椎体)。 - 过滤、映射
过滤器将原始数据进行处理以得到我们想要的数据,一个输入一个输出或多个输入一个输出。
映射器对象是可视化流水线的接口,将过滤器得到的数据映射成我们需要的几何元素。 - 绘制
vtkRenderer *ren1= vtkRenderer::New();//创建一个Renderer并且分配给他actor
ren1->AddActor( coneActor );
ren1->SetBackground( 0.1, 0.2, 0.4 );
绘制器可以看做是一个视口,负责对actor进行绘制 - 交互
创建了数据后通常都需要进行交互,vtk提供了两种交互的方式,一种是使用vtkRenderWindowInteractor进行交互,另外一种是用户可以自己针对事件进行绑定。
vtkSource->vtkFilter->vtkMapper->vtkActor->vtkRender。
下面贴出代码分析:
class vtkMyCallback : public vtkCommand
{
public:
static vtkMyCallback *New() //vkt的实例化都是通过New()来实现的</span>
{ return new vtkMyCallback; }
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
vtkTransform *t = vtkTransform::New();
vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(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;
}
相应的头文件就不说了,程序解析如上注释。
示例效果图入选: