之前写过一篇与合并数据相关的笔记《VTK笔记——合并数据(vtkAppendPolyData)》,用vtkAppendPolyData合并多边形数据,有个基本的条件就是输入数据类型要一致。如果我们想要合并数据片段,那可能就要用到vtkMergeFilter.
vtkMergeFilter
vtkMergeFilter将多个数据集中的数据片段合并为一个新的数据集。比如,可以将一个数据集的结构(拓扑和几何),第二个数据集的标量数据,第三个数据集的向量数据合并为一个数据集。当合并数据时,数组中的元组数与点的个数一致,单元数据也一样。
使用方法
auto merge = vtkSmartPointer<vtkMergeFilter>::New();
merge->SetGeometryConnection(wrap->GetOutputPort());
merge->SetScalarsConnection(reader->GetOutputPort());
示例
使用vtkMergeFilter将扭曲的表面与原始数据的颜色进行合并。
ImageWarp.cxx
#include "vtkSmartPointer.h"
#include "vtkBMPReader.h"
#include "vtkImageLuminance.h"
#include "vtkImageDataGeometryFilter.h"
#include "vtkWarpScalar.h"
#include "vtkMergeFilter.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkDataSetMapper.h"
#include "vtkActor.h"
#include <string>
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cout << "Usage: " << argv[0] << "masonry.bmp" << std::endl;
return EXIT_FAILURE;
}
std::string filename = argv[1];
auto reader = vtkSmartPointer<vtkBMPReader>::New();
reader->SetFileName(filename.c_str());
auto luminance = vtkSmartPointer<vtkImageLuminance>::New();
luminance->SetInputConnection(reader->GetOutputPort());
auto geometry = vtkSmartPointer<vtkImageDataGeometryFilter>::New();
geometry->SetInputConnection(luminance->GetOutputPort());
auto wrap = vtkSmartPointer<vtkWarpScalar>::New();
wrap->SetInputConnection(geometry->GetOutputPort());
wrap->SetScaleFactor(-0.1);
auto merge = vtkSmartPointer<vtkMergeFilter>::New();
merge->SetGeometryConnection(wrap->GetOutputPort());
merge->SetScalarsConnection(reader->GetOutputPort());
merge->SetGlobalWarningDisplay(0);
auto mapper = vtkSmartPointer<vtkDataSetMapper>::New();
mapper->SetInputConnection(merge->GetOutputPort());
mapper->SetScalarRange(0, 255);
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
auto ren = vtkSmartPointer<vtkRenderer>::New();
auto renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(ren);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renWin);
ren->AddActor(actor);
ren->ResetCamera();
ren->SetBackground(60/255.0, 93/255.0, 144/255.0);
renWin->SetSize(512, 512);
renWin->Render();
interactor->Start();
return EXIT_SUCCESS;
}