我有一系列形成点云的点。我需要计算每个点的法线向量,并从该点向法线向量的方向投射一条光线。在这种情况下,我需要使用什么类型的公式来计算法线向量?
编辑* 我有一系列点(x,y,z)形成一个点云(称为 A),形成一个半球的形状。我还有另一个点云(称为 B),我将其拟合到一个表面,形成另一个半球体,该半球适合 A 内部。我想测量这些表面彼此相距多远的长度,所以我的计划就是从 A 中的每个点投射一条射线到曲面 B 并测量到该点的交点。我希望这个解释能让我的问题更清楚。
感谢您的帮助!
我有一系列形成点云的点。我需要计算每个点的法线向量,并从该点向法线向量的方向投射一条光线。在这种情况下,我需要使用什么类型的公式来计算法线向量?
编辑* 我有一系列点(x,y,z)形成一个点云(称为 A),形成一个半球的形状。我还有另一个点云(称为 B),我将其拟合到一个表面,形成另一个半球体,该半球适合 A 内部。我想测量这些表面彼此相距多远的长度,所以我的计划就是从 A 中的每个点投射一条射线到曲面 B 并测量到该点的交点。我希望这个解释能让我的问题更清楚。
感谢您的帮助!
您是否有一个网格,以便您知道一个点连接到哪些其他本地点?
在这种情况下,该点的法线是在该点相遇的每对线之间的叉积的平均值(即归一化为一个单位向量)。
你能建立两个网格之间的对应关系吗?也就是说,对于网格 A 中的每个点,由于平移/缩放/旋转,网格 B 中的对应点位于不同的位置。如果是这样,那么您可以使用Procustes 分析来找到两个云之间的最佳平移/缩放/旋转变换矩阵。在 OP 中提供的示例中,缩放矩阵可以揭示两个网格之间的距离。
如果两个网格是任意的,那么我能想到的最好的算法是首先将两个点云放在同一个八叉树中。从这里,您可以遍历网格 A 中的每个点并找到网格 B 中的最近点。“两个网格之间的最小距离”是迭代后找到的 2 个点之间的最小距离。
2 的替代方案只是蛮力遍历所有点:
double min=BIG_NUMBER;
for(Point a : meshA)
for(Point b : meshB)
if(dist(a,b)<min) min=dist(a,b);
我用 Python 开发了一个代码,它将计算点云每个点的法线。您可以将其调整为 C++。
- 基本上你从你的点附近的 k 个点计算单值分解。
它将为您提供有关差异较大和较小位置的信息。
- 然后你选择方差较小的方向(与最小特征值相关的特征向量)。该特征向量是通过您的 k 点(包括您的点 P)的平面的法线。最后,对点云的每个点重复此操作。