如何获得给定网格的主曲率?

时间:2013-01-09 11:22:15

标签: mesh surface

我遇到了从给定网格(形状)中获取主曲率的问题。

  1. 我正在尝试使用Matlab文件交换中的'patchcurvature'方法。然而,该方法总是给出正曲率。我认为可能是该方法将网格视为单独的补丁,并计算每个补丁的主曲率。 [〜,〜,方向1,Dir2中,PrincipalCurvature1,PrincipalCurvature1] = patchcurvature(meshFaceVertices);

  2. 我还尝试使用另一种名为'surfature'的Matlab文件交换方法;然而,它计算由表面上的三个2D点阵列定义的“表面”的主曲率。我不确定如何使用由顶点和面定义的现有网格创建具有2D点阵列的“曲面”。有一些方法将表面转换为网格,但不是相反...

  3. 任何想法都将不胜感激。非常感谢和新年快乐!!!

    最佳, 甲

3 个答案:

答案 0 :(得分:3)

Principal curvatures,如果我没有错过不同的定义,则在可微分的曲面上定义,但网格(通常是三角形的集合)是不可微分的。我可以想象一些可能的近似主曲率的方法。

假设您的网格是通过从可微表面采样获得的,那么您需要做的是polynomial regression,更具体地说,quadratic interpolation在您尝试计算曲率的点周围的附近顶点上。 / p>

首先,您需要确定您感兴趣的点的法线向量。法向量可以通过网格三角形的法线方向(AB×AC,交叉产生三角形的两个边)获得,并用其他一些法向量进行插值。

找到法线向量后,可以变换网格的坐标,使点位于原点,法线向量指向z轴。 (具有沿z轴以角度θ旋转的参数)

然后你的下一个目标是找到一个表面

     1                   1
z = --- alpha * x^2  +  --- beta * y^2
     2                   2

最接近你的点集,有三个参数alpha,beta和theta。

然后alpha和beta是主要成分。

我不确定,但已经有一个matlab函数可以为你做回归。

答案 1 :(得分:0)

作为Iyomis的替代方案,可能对您的问题不太具体,但在一般情况下可能有用:您可以计算切线平面,给定您的网格法线,在给定点,投影相邻顶点的法线(或者更好的是平面法线和相邻法线之间的插值到那个平面上,然后只对结果点使用主成分分析。

嗯,它不完全是主曲率,但它是一个很好的近似值。我相信pcl(http://pointclouds.org)库使用类似的主要曲率实现。

答案 2 :(得分:0)

为什么不按定义去做,而是去做。对于Z的含义,其中z是描述表面高度的XY网格。

[Fx,Fy] = gradient(Z);

[Fxx,~] = gradient(Fx);

[~,Fyy] = gradient(Fy);

curv_norm=abs(Fxx.*Fyy-Fxy.^2);

normeliztion_size_mat = (1+Fx.^2+Fy.^2).^2;

normelized_size_mat=curv_norm/normelization_size_mat;