I have a STL file which has 983236 triangles. I read it and use vtkAppendPolyData and vtkTransformPolyDataFilter to make a new data for the matrix display. Whe I set nx=ny=nz=7, it was displayed correctly. However when I set nz=8, now it has 385428512 triangles but only part of it was displayed. I try to use a plane to cut it and found the cross-section is correct. It means vtkAppendPolyData has generated all triangles but this model was not displayed correctly.
The computer has enough memory and GPU resource. I got no memory leak and the program exits normally.
The VTK version is 9.5.1 x64. I compiled and used VTK with VS2019. VTK 9.4 also has this problem.
What below is the codes. Thanks for your kindly help. It is a strange problem.
int main(int argc, char* argv)
{
vtkOutputWindow::SetGlobalWarningDisplay(true);
vtkSmartPointer<vtkSTLReader> stlReader = vtkSmartPointer<vtkSTLReader>::New();
stlReader->SetFileName("sim.stl");
stlReader->Update();
if (!stlReader->GetOutput()) {
std::cerr << "Error: Failed to read STL file!" << std::endl;
return EXIT_FAILURE;
}
std::cout << stlReader->GetOutput()->GetNumberOfPolys() << std::endl;
vtkSmartPointer<vtkAppendPolyData> appendFilter = vtkSmartPointer<vtkAppendPolyData>::New();
int nx = 7, ny = 7, nz = 8;
double dx = 0.1, dy = 0.1, dz = 0.1;
for (int k = 0; k < nz; k++)
{
for (int j = 0; j < ny; j++)
{
for (int i = 0; i < nx; i++)
{
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->Translate(i * dx, j * dy, k * dz);
vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
transformFilter->SetInputData(stlReader->GetOutput());
transformFilter->SetTransform(transform);
transformFilter->Update();
appendFilter->AddInputData(transformFilter->GetOutput());
}
}
}
appendFilter->Update();
std::cout << appendFilter->GetOutput()->GetNumberOfPolys() << std::endl;
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(appendFilter->GetOutput());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->EdgeVisibilityOff();
actor->GetProperty()->SetOpacity(0.8);
actor->GetProperty()->BackfaceCullingOn();
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(1920, 1080);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->SetBackground(0.1, 0.2, 0.3);
renderer->ResetCamera();
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}