前言:
有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条
背景渐变 1---0
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->GradientBackgroundOn();
renderer->SetBackground(1, 1, 1);
renderer->SetBackground2(0, 0, 0);
1.以 Z 显示颜色 效果如下
2. 这里我是因为加载了点云数据:
vtkLookupTable
//建立lookupTable
lut = vtkSmartPointer< vtkLookupTable >::New();
//设置颜色映射的数目
lut->SetNumberOfTableValues(10);
lut->SetHueRange(0.67, 0.0); //色调范围从红色到蓝色
//设置颜色映射的范围
lut->SetTableRange(p_min.z,p_max.z);
lut->Build();
/
创建数据
//可以根据颜色标量值在scalarBar中建立一个颜色查找表
pcl::getMinMax3D(cloud, p_min, p_max);
double distance = abs(p_min.z - p_max.z);
std::cout << "distance : " << distance << " " << "min.x"<<p_min.z<<" "<<"max.z"<<p_max.z<< std::endl;
vtkSmartPointer<vtkPoints>points = vtkSmartPointer<vtkPoints>::New();//点数据
vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();//单元数据 顶点类型
//存储标量值
vtkFloatArray* scalars = vtkFloatArray::New();
vtkUnsignedCharArray *cellData = vtkUnsignedCharArray::New();
cellData->SetNumberOfComponents(3);
double rgb[3];
float ucrgb[3];
int count = cloud.points.size();
std::cout << "old point s count : " << count << " " << std::endl;
for (int i = 0; i < count; i++)
{
//定义存储顶点索引的中间变量,类似Int、long类型
vtkIdType pointId[1];
//将每个点的坐标加入vtkPoints,InsertNextPoint()返回加入点的索引号
pointId[0] = points->InsertNextPoint(cloud.points[i].x, cloud.points[i].y, cloud.points[i].z);
//为每个坐标点分别创建一个顶点,顶点是单元类型里面的一种
double zDistance = cloud.points[i].z-p_min.z;
lut->GetColor(static_cast<double>(zDistance), rgb);
//convert the d value to rgb value
for (size_t j = 0; j < 3; j++)
{
ucrgb[j] = static_cast<unsigned char>(rgb[j] * 255);
}
vertices->InsertNextCell(1, pointId);
scalars->InsertTuple1(i, cloud.points[i].z);
}
//指定数据的几何结构(由points指定)和拓扑结构(由vertices指定)
polyData->SetPoints(points);
polyData->SetVerts(vertices);
//设定每个顶点的标量值
polyData->GetPointData()->SetScalars(scalars);
pointsMapper->SetScalarRange(scalars->GetRange());
pointsMapper->SetLookupTable(lut);
pointsMapper->SetInputData(polyData);
pointsMapper->Update();
mCloudActor->SetMapper(pointsMapper);
mCloudActor->GetProperty()->SetPointSize(1);//设置点的大小
如果是 STL
// read data
vtkSmartPointer<vtkSTLReader> source = vtkSmartPointer<vtkSTLReader>::New();
source->SetFileName("TEST.stl");
source->Update();
int numPts = source->GetOutput()->GetPoints()->GetNumberOfPoints();
vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();
scalars->SetNumberOfValues(numPts);
for (int i = 0; i < numPts; ++i)
scalars->SetValue(i, i);//这个地方点和标量产生联系(第一个参数是第几个点;第二个参数就是设定的标量值)现在就假设第i个点颜色就是i
vtkSmartPointer<vtkPolyData> poly = vtkSmartPointer<vtkPolyData>::New();
poly->DeepCopy(source->GetOutput());
poly->GetPointData()->SetScalars(scalars);
// 创建颜色查找表
vtkSmartPointer<vtkLookupTable> hueLut = vtkSmartPointer<vtkLookupTable>::New();
hueLut->SetNumberOfColors(numPts); // 指定颜色查找表中有多少种颜色
hueLut->SetHueRange(0.6667, 0.0); //蓝到红渐变
hueLut->Build();
添加
vtkScalarBarActor
/********************************************************************************************/
//标注类测试
vtkSmartPointer<vtkScalarBarActor > scalarBarActor = vtkSmartPointer< vtkScalarBarActor >::New();
//scalarBarActor->SetOrientationToHorizontal();
scalarBarActor->SetTitle("Z(mm)");
scalarBarActor->SetNumberOfLabels(10);
scalarBarActor->SetLookupTable(lut);
//自己设定色带的位置
scalarBarActor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport();
scalarBarActor->GetPositionCoordinate()->SetValue(0.01, 0.01);//参数越小越靠左,第二个参数越大越往上
scalarBarActor->SetWidth(0.1);
scalarBarActor->SetHeight(0.8);
// scalarBar->SetTextPositionToPrecedeScalarBar();//标题和刻度标记是否应在标量栏之前(文字会出现在条形左边)
//设置标题和条形之间的边距
scalarBarActor->SetVerticalTitleSeparation(10);
//设置标题颜色
scalarBarActor->GetTitleTextProperty()->SetColor(0.0, 0.0, 0.0);
mRenderer->AddActor2D(scalarBarActor);
//viewer->resetCamera();
mRenderer->ResetCamera();
mRenderer->ResetCameraClippingRange();
mRenderer->Render();
ui->qvtkWidget->update();