int maxPointsX, maxPointsY, maxPointsZ;
std::vector<int> datas;
std::set<int> values = {1,2};
const int material_size = values.size();
readFile(datas, maxPointsZ, maxPointsY, maxPointsX);
std::vector<vtkSmartPointer<vtkImageData>> imageDatas;
std::vector<unsigned char*> voxelDatas;
voxelDatas.resize(material_size);
imageDatas.resize(material_size);
for (int i = 0; i < material_size; i++)
{
vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::New();
imageData->SetDimensions(maxPointsX + 2, maxPointsY + 2, maxPointsZ + 2);//设置网格的尺寸
imageData->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
imageData->SetSpacing(1.0, 1.0, 1.0);
unsigned char* voxelData = static_cast<unsigned char*>(imageData->GetScalarPointer());
voxelDatas[i] = voxelData;
imageDatas[i] = imageData;
}
int k = 0;
int count = 0;
for (int i = -1; i <= maxPointsZ; ++i) {
for (int j = -1; j <= maxPointsY; ++j) {
for (int l = -1; l <= maxPointsX; ++l) {
if (i == -1 || i == maxPointsZ || j == -1 || j == maxPointsY || l == -1 || l == maxPointsX) {
voxelDatas[0][k] = 0;
voxelDatas[1][k] = 0;
}
else {
if (datas[count] == 0) {
voxelDatas[0][k] = 0;
voxelDatas[1][k] = 0;
}
else if (datas[count] == 1) {
voxelDatas[0][k] = 1;
voxelDatas[1][k] = 0;
}
else{
voxelDatas[0][k] = 0;
voxelDatas[1][k] = 2;
}
count++;
}
k++;
}
}
}
vector<vtkSmartPointer<vtkActor>> actors;
for (int i = 0; i < material_size; i++) {
vtkSmartPointer<vtkMarchingCubes> marchingCubes = vtkSmartPointer<vtkMarchingCubes>::New();
marchingCubes->SetInputData(imageDatas[i]);
marchingCubes->SetValue(0, i + 1);
marchingCubes->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(marchingCubes->GetOutputPort());
mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(&colors[i * 3]);
actors.push_back(actor);
}
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
for (vtkSmartPointer<vtkActor> actor : actors)
{
renderer->AddActor(actor);
}
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(640, 480);
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
//启用缩放、旋转和平移交互功能
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
interactor->SetInteractorStyle(style);
// 渲染并启动交互
renderWindow->Render();
interactor->Start();
return 0;
如果不对多种材料分开提取等值面(定义多个imagedata对象,多次使用MC算法),会出现错误的显示。这个原因可能要追溯到MC算法的原理,暂时不做讨论。
效果如下: