无法在VTK中重新着色边缘

时间:2019-10-23 12:52:00

标签: c++ vtk

我在VTK中有一个非结构化的网格,我想与其边缘线一起渲染。我可以使用vtkExtractEdges来执行此操作,但是无论我做什么,边缘线始终为蓝色。
我有可用的代码以所需的颜色很好地绘制了网格的轮廓,并且尝试对边缘使用基本上相同的代码:

vtkSmartPointer<vtkOutlineFilter> outline = vtkSmartPointer<vtkOutlineFilter>::New();
vtkSmartPointer<vtkPolyDataMapper> outline_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> outline_actor = vtkSmartPointer<vtkActor>::New();

outline->SetInput(grid);
outline_mapper->SetInputConnection(outline->GetOutputPort());
outline_actor->SetMapper(outline_mapper);
outline_actor->GetProperty()->SetColor(1.,1.,1.); // << works just fine here
renderer->AddActor(outline_actor);

vtkSmartPointer<vtkExtractEdges> edges = vtkSmartPointer<vtkExtractEdges>::New();
vtkSmartPointer<vtkPolyDataMapper> edges_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> edges_actor = vtkSmartPointer<vtkActor>::New();

edges_mapper->SetInputConnection(edges->GetOutputPort());
edges_actor->SetMapper(edges_mapper);
edges_actor->GetProperty()->SetColor(1.,1.,1.); // << still stays blue here
renderer->AddActor(edges_actor);

这令人困惑,特别是因为我在SetColor上调用的类是vtkPolyDataMapper,此后,这两种情况的代码都是相同的。

还有其他人遇到此问题并知道解决方法吗?
到目前为止,我发现了这一点:https://public.kitware.com/pipermail/vtkusers/1999-September/087677.html,其中有人提议通过绘制管子来解决它,但我希望有一个干净的解决方案。

我使用的VTK版本是5.6,出于兼容性考虑,我不能使用其他版本。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

我发现由vtkPolyDataMapper产生的数据在馈入vtkExtractEdges时具有标量值(基于我想为入射单元格),并且这些行由查找表上色,而不是单色。
因此,我要做的就是给映射器一个单色的查找表。现在新的代码是

    edges_mapper->SetInputConnection(edges->GetOutputPort());
    edges_mapper->SetLookupTable(build_mono_table(1.,1.,1.));
    edges_actor->SetMapper(edges_mapper);
    renderer->AddActor(edges_actor);

具有帮助功能

inline vtkSmartPointer<vtkLookupTable> build_mono_table(double r, double g, double b)
{
    vtkSmartPointer<vtkLookupTable> table = vtkSmartPointer<vtkLookupTable>::New();
    table->SetNumberOfTableValues(1);
    table->Build();
    table->SetTableValue(0, r, g, b);
    return table;
}

似乎没有必要指定标量范围。