1

我有一系列形成点云​​的点。我需要计算每个点的法线向量,并从该点向法线向量的方向投射一条光线。在这种情况下,我需要使用什么类型的公式来计算法线向量?

编辑* 我有一系列点(x,y,z)形成一个点云(称为 A),形成一个半球的形状。我还有另一个点云(称为 B),我将其拟合到一个表面,形成另一个半球体,该半球适合 A 内部。我想测量这些表面彼此相距多远的长度,所以我的计划就是从 A 中的每个点投射一条射线到曲面 B 并测量到该点的交点。我希望这个解释能让我的问题更清楚。

感谢您的帮助!

4

3 回答 3

1

您是否有一个网格,以便您知道一个点连接到哪些其他本地点?

在这种情况下,该点的法线是在该点相遇的每对线之间的叉积的平均值(即归一化为一个单位向量)。

于 2013-04-24T15:09:54.333 回答
0
  1. 你能建立两个网格之间的对应关系吗?也就是说,对于网格 A 中的每个点,由于平移/缩放/旋转,网格 B 中的对应点位于不同的位置。如果是这样,那么您可以使用Procustes 分析来找到两个云之间的最佳平移/缩放/旋转变换矩阵。在 OP 中提供的示例中,缩放矩阵可以揭示两个网格之间的距离。

  2. 如果两个网格是任意的,那么我能想到的最好的算法是首先将两个点云放在同一个八叉树中。从这里,您可以遍历网格 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);
于 2013-04-27T16:38:55.030 回答
0

我用 Python 开发了一个代码,它将计算点云每个点的法线。您可以将其调整为 C++。

- 基本上你从你的点附近的 k 个点计算单值分解。

它将为您提供有关差异较大和较小位置的信息。

- 然后你选择方差较小的方向(与最小特征值相关的特征向量)。该特征向量是通过您的 k 点(包括您的点 P)的平面的法线。最后,对点云的每个点重复此操作。

于 2019-05-23T09:03:46.620 回答