Skip to main content

Hi,

Any ideas how to generate a 3D footprint of a 3D object (e.g. solid)? Z value of the vertices of the footprint not zero.

Something like deaggregating a 3D object to all individual surfaces and selecting only the locally lowest faces...

Jasper

Hello @jasperwis

SurfaceFootprintReplacer will give you a "2D shadow". If it's some complicated shape and you really just want the lowest face. Deaggregator to get surfaces and sort by Z for every center point.


If you have a solid and want to get the individual surfaces you can use the following steps:

Deaggregator to remove any aggregates followed by GeometryGoercer to CompositeSurface then into Deaggregator split composits = yes.

 

This should give you the individual surfaces.

 

If you don't have a ground surface for any reason and alternative approach would be to use the

Aggregator>BoundsExtractor(zmin)>SurfaceFootprintReplacer>3DForcer(using zmin).

 

 

The second approach will not work if your models/solids have donuts.

Thank you both.

Both workflows work for object with a flat base. But If there are objects after deaggregating with

multiple faces at the bottom, with different Z values, you will either get a 2D shadow lifted to the elevation of the lowest face or you will only get the lowest face (and not the other faces of the bottom).

 


Thank you both.

Both workflows work for object with a flat base. But If there are objects after deaggregating with

multiple faces at the bottom, with different Z values, you will either get a 2D shadow lifted to the elevation of the lowest face or you will only get the lowest face (and not the other faces of the bottom).

 

Hello @jasperwis

Can you post an example?

Your question just popped into my head, out of nowhere. If it's multiple triangles, the tradional way in computer graphics would be to compare surface normals.

- I believe the GeometryValidator will give you a surface normal as a vector, you can calculate the angle between that and 0,0,1 to get a kind of a "filter by orientation". This should seperate "vertical" surfaces from "horizontal" ones. Roughly...

- The other CG approach would be similiar to "smoothing groups" - you can compare normals, i.e. calculate angles between every face and if it's below a certain treshold = face group.


Thank you both.

Both workflows work for object with a flat base. But If there are objects after deaggregating with

multiple faces at the bottom, with different Z values, you will either get a 2D shadow lifted to the elevation of the lowest face or you will only get the lowest face (and not the other faces of the bottom).

 

This would be the traditional CG method, turns out the "surface dissolver" actually does just that.

Mesh Filter by Orientation.fmw3D Test Model.zip


This would be the traditional CG method, turns out the "surface dissolver" actually does just that.

Mesh Filter by Orientation.fmw3D Test Model.zip

Hi David,

Thanks again. I can see you adjusted the surface tolerance of the SurfaceDissolver. For my test data this is giving better results, a much bigger reduction of the amount of surfaces. I had to change the GeometryCoercer to mesh for my test.

But I still have the problem how to select all base surfaces of the 3D object. For my test file (see attached solid_test.dwg), I end up with 2 surfaces at the base of the 3D object. You could add a condition that the difference in Z between a surface and the lowest surface has to be smaller than a threshold. See attached workbench. But this will only give the desired output for certain situations and the threshold will always have to fit the situation. This workflow could also select surfaces, that are not at the base of the object, but with their centerpoint close to the lowest surface.

I added two tests that are more challenging.

1= 3D object with multiple base surfaces (and not co planar)

2= 3D object with large and sloped base and relatively limited height. Will be hard to use Z_min to filter a base surface.

May be you could use a 2D SurfaceFootprintReplacer for all surfaces and only keep those surfaces with the largest area. But this will again not be a generic solution. Still struggling how to keep all base surfaces of an object.

Another approach could be to use a 2D SurfaceFootprintReplacer (and if needed a Dissolver to only keep the general contour). The Z of all vertices then should be lifted to the elevation of the closest neighboring vertex of the 3D model. I will test this out.

33519-mesh-filter-by-orientation_2.fmw

solid_test.dwg

test_challenging1.dwg

test_challenging2.dwg


Reply