VTK9.1: Boolean difference operation with two cube sources to create a box leads to error

Hello,

I’m trying to create a box from two cube sources that have nearly the same center and one cube is slightly smaller than the other. By applying a difference operation using vtkBooleanOperationPolyDataFilter I want to carve out some space of the bigger box creating a box. This the code I wrote:

double wall_thickness = 10.0; //mm

double outer_x = 600.0 + 2.0 * wall_thickness;
double outer_y = 400.0 + 2.0 * wall_thickness;
double outer_z = 320.0 + wall_thickness; // Bottom wall only

// Bigger outer box
vtkSmartPointer<vtkCubeSource> outer_box = vtkSmartPointer<vtkCubeSource>::New();
outer_box->SetXLength(outer_x);
outer_box->SetYLength(outer_y);
outer_box->SetZLength(outer_z);
outer_box->SetCenter(600.0/2.0, 400.0/2.0, outer_z/2.0);

// Smaller inner box (the cavity)
vtkSmartPointer<vtkCubeSource> inner_box = vtkSmartPointer<vtkCubeSource>::New();
inner_box->SetXLength(600.0);
inner_box->SetYLength(400.0);
inner_box->SetZLength(320.0 + 1.0); // Slightly taller for box opening
inner_box->SetCenter(600.0/2.0, 400.0/2.0, wall_thickness + (320.0 + 10.0)/2.0);

outer_box->Update();
inner_box->Update();

vtkSmartPointer<vtkPolyData> outer_box_polydata = outer_box->GetOutput();
vtkSmartPointer<vtkPolyData> inner_box_polydata = inner_box->GetOutput();

// Substract inner box from outer box
vtkSmartPointer<vtkBooleanOperationPolyDataFilter> boolean_filter = vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();
boolean_filter->SetOperationToDifference();
boolean_filter->SetInputData(0, outer_box_polydata);
boolean_filter->SetInputData(1, inner_box_polydata);
boolean_filter->Update();

vtkSmartPointer<vtkRenderer> preview_renderer = vtkSmartPointer<vtkRenderer>::New();
preview_renderer->SetBackground(1.0, 1.0, 1.0); // White background

vtkSmartPointer<vtkRenderWindow> render_window = vtkSmartPointer<vtkRenderWindow>::New();
render_window->AddRenderer(preview_renderer);
render_window->SetSize(1280, 720);

vtkSmartPointer<vtkRenderWindowInteractor> render_window_interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
render_window_interactor->SetRenderWindow(render_window);

vtkSmartPointer<vtkInteractorStyleTrackballCamera> interactor_style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
render_window_interactor->SetInteractorStyle(interactor_style);

vtkSmartPointer<vtkPolyDataMapper> boolean_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
boolean_mapper->SetInputConnection(boolean_filter->GetOutputPort());

vtkSmartPointer<vtkActor> boolean_actor = vtkSmartPointer<vtkActor>::New();
boolean_actor->SetMapper(boolean_mapper);

preview_renderer->AddActor(boolean_actor); 
    
render_window->Render();
render_window_interactor->Start()

When I start the program, the rendering window is empty and these errors are printed:

2025-05-29 11:07:31.010 (   0.008s) [        2EC43E00]    vtkPointLocator.cxx:845    ERR| vtkPointLocator (0x558a383da990): No points to subdivide
2025-05-29 11:07:31.010 (   0.008s) [        2EC43E00]vtkIntersectionPolyData:2410  WARN| No Intersection between objects 
2025-05-29 11:07:31.011 (   0.009s) [        2EC43E00]vtkDistancePolyDataFilt:81     ERR| vtkDistancePolyDataFilter (0x558a383ccd70): No points/cells to operate on
2025-05-29 11:07:31.011 (   0.009s) [        2EC43E00]vtkDistancePolyDataFilt:81     ERR| vtkDistancePolyDataFilter (0x558a383ccd70): No points/cells to operate on

But it cannot be that there is no intersection between the objects because when I create seperate actors with opacity for the boxes one can see that they overlap:

So my question is what do I have to change in order to create the box with the boolean difference operation?

Thanks in advance!

my guess would be that the filter doesn’t see any intersection of edges. The 2 objects overlap in 3d, but there are no edge overlaps.