There is a post about how MeshLab hollows out a 3D mesh made up of triangle polygons. Based on that post, my understanding is that the MeshLab approach is:
- Create a new offset mesh resampled from the model mesh
- Build uniform volumetric representation, i.e. voxel
- Each voxel contains the signed distance from original surface
- Resampled surface is constructed using the marching cube algorithm
- An offset size is required as input
- Flip normal vectors for new offset mesh
- Merge original mesh and new offset mesh
Question
Is this the only approach to hollow out 3D models? What are the alternative approaches?
MeshLab UI to hollow out
MeshLab approach is illustrated here:
MeshLab script
Here is the MeshLab script to hollow out 3D model:
<!DOCTYPE FilterScript>
<FilterScript>
<filter name="Uniform Mesh Resampling">
<Param type="RichAbsPerc" max="22.4008" isxmlparam="0" name="CellSize" tooltip="Size of the cell, the default is 1/50 of the box diag. Smaller cells give better precision at a higher computational cost. Remember that halving the cell size means that you build a volume 8 times larger." value="0.44802" description="Precision" min="0"/>
<Param type="RichAbsPerc" max="4.48016" isxmlparam="0" name="Offset" tooltip="Offset of the created surface (i.e. distance of the created surface from the original one).<br>If offset is zero, the created surface passes on the original mesh itself. Values greater than zero mean an external surface, and lower than zero mean an internal surface.<br> In practice this value is the threshold passed to the Marching Cube algorithm to extract the isosurface from the distance field representation." value="-0.179206" description="Offset" min="-4.48016"/>
<Param type="RichBool" isxmlparam="0" name="mergeCloseVert" tooltip="If true the mesh generated by MC will be cleaned by unifying vertices that are almost coincident" value="false" description="Clean Vertices"/>
<Param type="RichBool" isxmlparam="0" name="discretize" tooltip="If true the position of the intersected edge of the marching cube grid is not computed by linear interpolation, but it is placed in fixed middle position. As a consequence the resampled object will look severely aliased by a stairstep appearance.<br>Useful only for simulating the output of 3D printing devices." value="false" description="Discretize"/>
<Param type="RichBool" isxmlparam="0" name="multisample" tooltip="If true the distance field is more accurately compute by multisampling the volume (7 sample for each voxel). Much slower but less artifacts." value="false" description="Multi-sample"/>
<Param type="RichBool" isxmlparam="0" name="absDist" tooltip="If true a <b> not</b> signed distance field is computed. In this case you have to choose a not zero Offset and a double surface is built around the original surface, inside and outside. Is useful to convrt thin floating surfaces into <i> solid, thick meshes.</i>. t" value="false" description="Absolute Distance"/>
</filter>
<filter name="Invert Faces Orientation">
<Param type="RichBool" isxmlparam="0" name="forceFlip" tooltip="If selected, the normals will always be flipped; otherwise, the filter tries to set them outside" value="true" description="Force Flip"/>
<Param type="RichBool" isxmlparam="0" name="onlySelected" tooltip="If selected, only selected faces will be affected" value="false" description="Flip only selected faces"/>
</filter>
<filter name="Flatten Visible Layers">
<Param type="RichBool" isxmlparam="0" name="MergeVisible" tooltip="If true, flatten only visible layers, otherwise, all layers are used" value="true" description="Merge Only Visible Layers"/>
<Param type="RichBool" isxmlparam="0" name="DeleteLayer" tooltip="Delete all the layers used as source in flattening. <br>If all layers are visible only a single layer will remain after the invocation of this filter" value="true" description="Delete Layers "/>
<Param type="RichBool" isxmlparam="0" name="MergeVertices" tooltip="Merge the vertices that are duplicated among different layers. 

Very useful when the layers are spliced portions of a single big mesh." value="true" description="Merge duplicate vertices"/>
<Param type="RichBool" isxmlparam="0" name="AlsoUnreferenced" tooltip="Do not discard unreferenced vertices from source layers

Necessary for point-cloud layers" value="false" description="Keep unreferenced vertices"/>
</filter>
</FilterScript>