最近乃至了VTK,去官网下载了最新的realse 8.2.0。
编译成功后,开始写实现代码,参考网上的实现得到以下代码
double pts[][3] = {{0,0,0}, {1,0,0}, {0,1,0}};
vtkSmartPointer<vtkPoints> points = vtkPoints::New();
vtkSmartPointer<vtkCellArray> verts =vtkCellArray::New();
vtkSmartPointer<vtkStringArray> labels = vtkStringArray::New();
labels->SetName("labels");
for(ID i=0;i<3;i++){
points->InsertNextPoint(pts[i][0],pts[i][1], pts[i][2]);
verts->InsertNextCell(1);
verts->InsertCellPoint(i);
labels->InsertNextValue(std::to_string(i));;
}
vtkSmartPointer<vtkPolyData> polyData = vtkPolyData::New();
polyData->SetPoints(points);
polyData->SetVerts(verts);
polyData->GetPointData()->AddArray(labels);
vtkSmartPointer<vtkTextProperty> textProp = vtkTextProperty::New();
textProp->SetFontSize(18);
textProp->SetColor(1.0,1.0,0.5);
textProp->SetFontFamilyToArial();
vtkSmartPointer<vtkPointSetToLabelHierarchy> hie
= vtkPointSetToLabelHierarchy::New();
hie->SetInputData(polyData);
hie->SetMaximumDepth(15);
hie->SetLabelArrayName("labels");
hie->SetTargetLabelCount(100);
hie->SetTextProperty(textProp);
vtkSmartPointer<vtkLabelPlacementMapper> labelmapper
= vtkLabelPlacementMapper::New();
labelmapper->SetInputConnection(hie->GetOutputPort());
labelmapper->SetRenderStrategy(vtkFreeTypeLabelRenderStrategy::New());
labelmapper->UseDepthBufferOn();
labelmapper->SetShapeToNone();
labelmapper->SetStyleToOutline();
labelmapper->UseUnicodeStringsOff();
getPointLabelActor()->SetMapper(labelmapper);
但启动后,出现奇怪的bug
以上代码中使用了vtkFreeTypeLabelRenderStrategy
,而这个类的vtkTextRenderer
是vtkMathTextFreeTypeTextRenderer
,但是,但这个vtkTextRenderer
总是空对象,于是就出错了。
上网查了后,发现是vtk使用了module机制,需要手动在代码启用相应的模块。
在代码启动时,添加如下代码后,运行正常。
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingFreeType);