有几种平滑算法。拉普拉斯平滑是最好的解决方案之一。
应用您自己的拉普拉斯平滑算法可能很费力。相反,您可以使用 MeshlabServer 应用完美的拉普拉斯平滑。
您应该有必要的 meshlab dll。为此,您可以在 PC 上安装 Meshlab。在 PC 上安装 Meshlab 时,安装文件夹中有所有必需的 dll。但是,如果您只想获取您想要使用的过滤方法所需的 dll,您可以将它们放在您的安装文件夹中。在这种情况下,您应该在要调用 MeshlabServer 功能的 PC 上安装 Visual C++ 可再发行组件(Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.26.2872)。
最后,您应该定义您的 .mlx 文件来告诉 Meshlab 服务器应用哪个过滤器。
以下是 6 步拉普拉斯平滑的 .mlx 文件的内容:
<FilterScript>
<filter name="Laplacian Smooth">
<Param name="stepSmoothNum" tooltip="" description="" isxmlparam="0" value="6"
type="RichInt"/>
<Param name="selection" tooltip="" description="" isxmlparam="0" value="false"
type="RichBool"/>
<Param name="boundarySmooth" tooltip="" description="" isxmlparam="0" value="true"
type="RichBool"/>
<Param name="cotangentWeight" tooltip="" description="" isxmlparam="0" value="true"
type="RichBool"/>
</filter>
</FilterScript>
以及调用过滤函数的 C# 方法:
/// <summary>
/// Applies a laplacian smoothing filter to the given 3D object.
/// </summary>
/// <param name="input">The path of the source 3D object</param>
/// <param name="output">The path to save the smoothed result.</param>
/// <param name="meshlabRoot">The path of the Meshlab dlls folder</param>
/// <returns></returns>
public static bool LaplacianSmoothing(string input, string output, string meshlabRoot)
{
bool retVal = true;
try
{
string strCmdText;
string mlxPath = meshlabRoot + "LaplacianFilter.mlx";
strCmdText = "/C " + meshlabRoot +
@"meshlabserver " +
@"-i " + input + " " +
@"-o " + output + " -s " +
mlxPath;
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = strCmdText;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
}
catch (Exception ex)
{
UserMethods.ParseError(ex, "SmoothFile");
retVal = false;
}
return retVal;