Hi @quangu , I found that each object is an aggregate of a lot of voxel boundaries.
If I understand your requirement and data structure correctly, the workflow shown in the screenshot extracts "bottom" surfaces for each class.
Deaggregtor: Decompose the objects into individual voxel surfaces.
Matcher: Filter out internal surfaces, which are duplicated.
PlanarityFilter: Calculate the normal vector for each surface.
Tester: Select "bottom" surfaces, whose z-component of normal vector is equal to -1 (i.e. downward).
Thank you so much takashi, this is what im looking for!