c#点云到网格

c#点云到网格,c#,opengl,3d,geometry-surface,cnc,C#,Opengl,3d,Geometry Surface,Cnc,是否可以将2.5D曲面从X、Y、Z点(非结构化点云)重建为三角形网格?是否有一个库可以为我做这件事,我可以使用C#?我找不到任何具有此内置功能的现成开源软件 第一种选择: 下面是一个场景。我有一个CNC,我可以用它捕捉位置数据。我将从一个特定的轴进行扫描,并以特定的间隔进行测量。例如,我沿着X轴移动,每0.5毫米测量一次。我将每隔0.5毫米有X,Y和Z点。完成X轴扫描后,我将Y移动0.05 mm,然后再次扫描X轴。似乎将其转化为网格应该非常简单。一个点将始终与8个三角形相交,但在边上除外,该边将

是否可以将2.5D曲面从X、Y、Z点(非结构化点云)重建为三角形网格?是否有一个库可以为我做这件事,我可以使用C#?我找不到任何具有此内置功能的现成开源软件

第一种选择: 下面是一个场景。我有一个CNC,我可以用它捕捉位置数据。我将从一个特定的轴进行扫描,并以特定的间隔进行测量。例如,我沿着X轴移动,每0.5毫米测量一次。我将每隔0.5毫米有X,Y和Z点。完成X轴扫描后,我将Y移动0.05 mm,然后再次扫描X轴。似乎将其转化为网格应该非常简单。一个点将始终与8个三角形相交,但在边上除外,该边将为4,且连接点将已知。所有X/Y将对齐每个0.5 mm

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

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

在上面的选项中,我仍然可以通过创建标准化算法来对齐X和Y坐标

我可以用C#编写任何代码,但我对3D术语知之甚少。因此,如果我使用了错误的措辞来描述我试图实现的目标,我会提前道歉


我知道这样的东西对爱好CNC的用户非常有用。创建网格后,我可以将结果保存到STL中,我已经计算出该部分。

假设您已使用X、Y、Z捕捉到以下点:

 0  1  2  3
 4  5  6  7
 8  9 10 11
12 13 14 15
如果您有一个顶点数组,并且上面的每个数字都是该数组的索引,则生成一个索引数组(每个值都是顶点数组的索引,用于标识网格中从CNC探针捕获的顶点)

在这里识别模式,我们可以说:(为格式化道歉,注意这是伪代码。我在手机上写的,可能有很多错误。)

int cols=4;//X中的点数
int行=4;//Y中的点数
向量ti//三角形指数;
//把事情加快一点。。。
ti.储备((列+1)*(行+1));
对于(int j=0;j
现在,
ti
中的每个三元组表示单个三角形的索引。例如,
ti
的第一部分将是

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

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

这假设您的探针数据是按照本文开头的“矩阵”所指示的模式排列的,即沿x方向进行探测后,您快速返回到另一侧,移动到下一个x方向,然后再次进行探测,从而获得光栅模式

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


这种方法不要求采样以精确的规则间隔进行,但如果采样接近规则间隔,则会得到更好的结果(更好地逼近采样对象)

。。。我刚刚注意到
c#
标签。将向量替换为
列表
。将
推回()
。添加()
,删除
。保留()
,然后就可以开始了。谢谢…我将从中着手。令人惊讶的是,经过数小时的搜索,我没有找到任何解决这个问题的方法。再说一遍,我正在搜索可能不是我应该搜索的关键词。@user3478586很高兴提供帮助。gl将索引缓冲区(
ti
在我的示例中)称为“元素数组缓冲区”)(请参见
gl\u element\u array\u buffer
)。另一种方法是创建一个rows*cols分辨率的纹理,将采样的Z值作为像素值,并将其渲染为高度贴图。(有关更多信息,请参阅“heightmap地形渲染”)最终,正确的方法取决于您的用例,但这将允许您构建网格。如果你在50Hz下以典型的CNC速度阅读,你可能需要下载样本。如果你对gl或dx没有太多经验,谷歌“opengl索引gldraw”@user3478586减去《星球大战》可能会有所帮助。更多编码:)
// 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);
}
}