c#点云到网格

时间:2018-08-13 20:47:05

标签: c# opengl 3d geometry-surface cnc

是否可以从X,Y,Z点(非结构化点云)到三角形网格重建2.5D曲面?有没有可以为我使用C#的库?我没有开箱即用的内置功能。<​​/ p>

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

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

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

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

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

我知道这样的事情对于爱好CNC的用户非常有用。创建网格后,我可以将结果保存到STL中,然后找出该部分。

1 个答案:

答案 0 :(得分:0)

假设您已使用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路由器做了类似的事情。这很简单。可能已经有软件在执行此操作-如果不这样做,我会感到惊讶-但该算法非常基本。我是图形编码器,所以我只是建立了自己的图形编码器。 (我无法分享。)

这种方法不需要采样间隔精确,但如果它们与常规距离 close ,则会得到更好的结果(更好地近似采样对象)。