有一篇文章介绍了 MeshLab 如何挖空由三角形多边形组成的 3D 网格。基于那篇文章,我的理解是 MeshLab 方法是:
MeshLab UI 镂空
MeshLab 脚本
<!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>
正偏移量