在VTK中,颜色映射的过程是由映射器mapper完成的。最终该标量值映射为何种颜色,还需要看颜色查询表中颜色的分配情况。如果不手动创建一个查询表,则映射器会使用一个默认的映射表。
我们可以手动创建一个颜色查找表,颜色查找表中允许我们自由设定颜色值。vtkLookupTable可以帮助我们来完成这个工作。
//定义一个颜色查找表
vtkLookupTable *lut=vtkLookupTable::New();
//设置需要映射的颜色的数目
lut->SetNumberOfTableValues(static_cast<vtkIdType>(vtkCells.size()/*cellIds->GetNumberOfIds()*/));
//设置颜色值的映射范围,如,我需要把0-100范围的数值通过颜色查
//找表获取一个标量值
lut->SetTableRange(0,100);
lut->Build();
……
//定义一个颜色标量
vtkUnsignedCharArray *cellData = vtkUnsignedCharArray::New();
cellData->SetNumberOfComponents(3);
for (auto it = vtkCells.begin(); it != vtkCells.end(); it++)
{
//cout << "id: " << it->first << " " << "distance: " << it->second<< endl;
distance = it->second;
//get the rgb value from lut table according to the distance value
lut->GetColor(static_cast<double>(distance), rgb);
//convert the distance value to rgb value
for (size_t j = 0; j < 3; j++)
{
ucrgb[j] = static_cast<unsigned char>(rgb[j] * 255);
}
cellData->InsertTuple(it->first, ucrgb);
}
boneSurfG->GetOutput()->GetCellData()->SetScalars(cellData);
//将数据可视化
//Mapper,Actor,Render
vtkSmartPointer<vtkPolyDataMapper> boneMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
boneMapper->SetInputData(boneSurf);
vtkSmartPointer<vtkActor> boneActor =
vtkSmartPointer<vtkActor>::New();
boneMapper->SetScalarModeToUseCellData();
boneMapper->Update();
//delete original color
//boneMapper->ScalarVisibilityOff();
boneActor->SetMapper(boneMapper);
……
renderer->AddActor(boneActor);
……
renderWindowInteractor->Start();
以上介绍的是lookupTable的用法
下面是颜色映射在可视化的时候根据不同需要会使用到的映射方法
有时候,标量数据就是颜色值,并不需要通过查询表进行映射。对此,映射器提供了以下一些方法来进行控制。
● SetColorModeToDefault()该方法执行默认的映射器行为,即把unsigned char类型的标量属性数据当作颜色值,不执行隐式。对于其他类型的标量数据,将通过查询表映射。
● SetColorModeToMapScalars()无论变量数据是何种类型,该方法都通过查询表对标量数据进行映射。如果标量数据的每个元组有多个分量,则对第0个分量进行映射。
注意事项:
- 如果没有标量数据,则映射器将不能使用查询表控制对象的颜色。这时可以使用演员对象来控制颜色。
- 如果想阻止颜色映射,可调用映射器的ScalarVisibilityOff()方法。
调用ScalarVisibilityOn()方法后,可以控制映射器的颜色映射行为:
● SetScalarModeToDefault()执行默认的映射行为:如果有点标量属性数据,则用其进行映射,如果没有点标量属性数据但有单元标量属性数据,则用单元标量属性数据进行映射,否则不映射。
● SetScalarModeToUsePointData()总是使用点标量属性数据进行映射的。如果没有嗲按标量属性数据,就不进行映射。
● SetScalarModeToUseCellData()总是使用单元标量属性数据进行映射的。如果没有单元标量属性数据,就不进行映射。
● SetScalarModeToUsePointFieldData()不使用点或单元标量属性数据,而是使用点属性数据中的一般属性数据来进行映射的。该方法应该与ColorByArrayComponent()结合使用,以用来指定用于颜色映射的数据。
● SetScalarModeToUseCellFieldData()不使用点或单元标量属性数据,而是使用单元属性数据中的一般属性数据来进行映射的。该方法应该与ColorByArrayComponent()结合使用,以用来指定用于颜色映射的数据。