4

是否可以将 2.5D 表面从 X、Y、Z 点(非结构化点云)重建为三角形网格?是否有可用的库可以为我执行此操作,我可以与 C# 一起使用?我找不到任何具有此内置功能的开箱即用的开源软件。

第一个选项:这是场景。我有一个可以用来捕获位置数据的 CNC。我将从特定轴扫描并以特定间隔进行测量。例如,我在 X 轴上移动,每 0.5 毫米进行一次测量。我将每隔 0.5 毫米设置一次 X、Y 和 Z 点。完成 X 轴扫描后,我将 Y 移动 0.05 毫米,然后再次扫描 X 轴。似乎把它变成一个网格应该很简单。一个点总是与 8 个三角形相交,除了边上的边为 4 并且连接点是已知的。所有 X/Y 将每 0.5 毫米对齐。

首选选项:可能需要密度估计算法,据我所知,如果没有我不想使用的 MatLab 之类的东西,这是不可能的。

如果我不必以一致的 X 轴间隔进行测量,那就更好了。激光位移传感器和相关设备将使我能够以 50hz 捕获点数据。我宁愿在那个时间段内进行尽可能多的测量,因为我在 X 上扫描,但很可能前一个 Y 位置的 X 不会对齐。

在上述选项中,我仍然可以通过创建归一化算法来对齐 X 和 Y 坐标。

我几乎可以用 C# 编写任何代码,但我对 3D 术语知之甚少。因此,如果我使用错误的措辞来描述我想要完成的事情,我会提前道歉。

我知道这样的东西对爱好 CNC 的用户非常有用。一旦我创建了网格,我就可以将结果保存到 STL,我已经弄清楚了那部分。

4

1 回答 1

2

假设您使用 X,Y,Z 捕获了以下点:

 0  1  2  3
 4  5  6  7
 8  9 10 11
12 13 14 15

你有一个顶点数组,上面的每个数字都是该数组的索引,生成一个索引数组(每个值都是顶点数组的索引,识别顶点 - 从你的 CNC 探针捕获的点 - 在你的网格中)

// first row of quads - values are indices into the vertex array
0,1,4
1,5,4
1,2,5
2,6,5
2,3,6
3,7,6

// second row...    
4,5,8
5,9,8
5,6,9
6,10,9
6,7,10
7,11,10

// etc. ..

在这里识别模式,我们可以说:(对格式表示歉意,注意这是伪代码。我在手机上写了这个,可能有很多错误。)

int cols = 4; // number of points in X
int rows = 4; // number of points in Y

std::vector<int> ti // triangle indices;
// speed things up a bit...
ti.reserve((cols + 1) * (rows + 1));

for(int j = 0; j < rows-1; ++j)
{
for(int i = 0; i < cols-1; ++i)
{
/*

i0--i1
| / |
|/  |
i2--i3

*/
int o = j * cols + i;
int i0 = o;   // nw corner of local quad
int i1 = i0 + 1; // ne corner of local quad
int i2 = i0 + cols; // sw corner of local quad
int i3 = i2 + 1; // se corner of local quad

// upper-left triangle in this quad
ti.push_back(i0);
ti.push_back(i1);
ti.push_back(i2);

// lower-right triangle in this quad
ti.push_back(i1);
ti.push_back(i3);
ti.push_back(i2);
}
}

现在,每个三元组ti表示单个三角形的索引。例如,将的第一部分ti

[0,1,4, 1,5,4, 1,2,5, 2,6,5...]等等

或者,谷歌“从网格生成高度图网格”。

这假设您的探测数据以本文开头的“矩阵”指示的模式排列 - 即,沿 x 探测后,您快速回到另一侧,移动到下一个 X,然后再次探测,所以你得到一个光栅图案。

几年前我为我的 DIY CNC 路由器做了类似的事情。这很简单。可能已经有软件可以做到这一点 - 如果没有,我会感到惊讶 - 但算法非常基本。我是一名图形编码员,所以我只是建立了自己的。(我不能分享。)

这种方法不要求样本在精确的规则间隔,但如果它们接近规则,您将获得更好的结果(采样对象的更好近似)。

于 2018-08-13T21:06:25.757 回答