【问题标题】:c# Point Cloud to Meshc#点云到网格
【发布时间】:2018-08-13 20:47:04
【问题描述】:

是否可以将 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,我已经弄清楚了那部分。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • ... 我刚刚注意到c# 标签。将矢量替换为List&lt;int&gt;,将.push_back() 替换为.Add(),删除.reserve(),一切顺利。
    • 谢谢...我会从这里开始工作的。令人惊讶的是,经过数小时的搜索,我没有发现任何解决此问题的方法。再说一次,我正在搜索可能不是我应该寻找的关键词。
    • @user3478586 很高兴为您提供帮助。 gl 将索引缓冲区(在我的示例中为ti)称为“元素数组缓冲区”)(参见GL_ELEMENT_ARRAY_BUFFER)。另一种方法是创建行*列分辨率的纹理,将采样的 Z 值作为像素值,并将其渲染为高度图。 (有关更多信息,请参阅“高度图地形渲染”。)最终,正确的方法取决于您的用例,但这将允许您构建网格。如果您以 50Hz 的频率以典型的 CNC 速度读取数据,则可能需要降低采样率。
    • 如果您对 gl 或 dx 不太熟悉,google "opengl indexed gldraw" 可能会有所帮助
    • @user3478586 少了《星球大战》。更多编码。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2017-10-02
    • 2014-07-27
    • 2013-09-27
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多