Open Cascade 7.7.0 新功能:模拟三维扫描点云-BRepLib_PointCloudShape

转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16867753.html

1. 简介

OCC官方在2022年10月3日发布 7.7 Beta 版,并于今天2022年11月7日正式发布 Open Cascade 7.7.0 版本,其中一个更新为:一个用于生成拓扑模型上的点集的工具方法。

Introduced new tool BRepLib_PointCloudShape generating a point set for a 
topological shape.

参考新功能说明文档和用户文档,其主要功能:在距离模型表面指定距离内生成点集,可以用来模拟激光扫描模型所得到的点云,提供两种生成方式

  1. 根据设定的点集密度值自动生成点集;
  2. 根据模型三角形网格顶点生成。[文档特别注明该方法非线程安全]

 2. 测试效果

 使用三个模型进行测试,效果如下:

图1:模型1. 正方体,边长为10mm, 指定距离 设置为 2mm

图1:模型1. 正方体,边长为10mm, 指定距离 设置为 2mm

图2:模型1. 正方体,将 指定距离 设置为 20mm, 按密度生成

图3:模型2. nist_ctc_05,模型来自 NIST, 按密度生成

图4:模型2. nist_ctc_05, Use Triangulation 按三角形网格顶点生成

图5:模型3. Schenkel,模型来自 FreeCAD, 按密度生成

3.  功能详解

通过以上图示,可进一步理解其具体功能是在模型周围指定距离内以某种随机算法生成点集,输入参数包括:模型、指定距离、指定密度值、是否按三角形网格顶点生成以及计算精度。

按密度生成 时,需指定密度值;此时生成的点集接近均匀,但生成原理还有待进一步探究;如上图1所示。

按三角形网格顶点生成 时,将使用模型的显示网格顶点生成点集,如上图4所示。此时不同的指定距离所得的点集完全相同,据此可以推测点集由网格顶点直接生成。不同指定距离的生成效果如下:

​按三角形网格顶点生成时,不同的指定距离和点密度
 

 因此可以推测,对已显示模型(已具有三角网格模型)生成点集时,效率将非常快。

4. 代码

该工具 BRepLib_PointCloudShape 是一个抽象类,但只需要实现一个接收生成点结果的接口即可:

//! Method to add point, normal to surface in this point and face for which point computed.
  //! @param[in] thePoint 3D point on the surface
  //! @param[in] theNorm  surface normal at this point
  //! @param[in] theUV    surface UV parameters
  //! @param[in] theFace  surface (face) definition
  Standard_EXPORT virtual void addPoint (const gp_Pnt& thePoint,
                                         const gp_Vec& theNorm,
                                         const gp_Pnt2d& theUV,
                                         const TopoDS_Shape& theFace) = 0;
从Open Cascade Beta 版的源代码中找到两处应用,分别是 PointCloudPntFiller 和 PointCloudPlyWriter,前者用在点云显示、后者用在 ply 点云读写。参考其中一处实现如下:
class PointCloudPntFiller : public BRepLib_PointCloudShape
    {
    public:
      PointCloudPntFiller (Standard_Real theTol) : BRepLib_PointCloudShape (TopoDS_Shape(), theTol) {}
      void SetPointArray (const Handle(Graphic3d_ArrayOfPoints)& thePoints) { myPoints = thePoints; }

    protected:
      virtual void addPoint (const gp_Pnt& thePoint,
                             const gp_Vec& theNorm,
                             const gp_Pnt2d& theUV,
                             const TopoDS_Shape& ) Standard_OVERRIDE
      {
        const Standard_Integer aPntIndex = myPoints->AddVertex (thePoint, theUV);
        if (theNorm.SquareMagnitude() > gp::Resolution())
        {
          myPoints->SetVertexNormal (aPntIndex, theNorm);
        }
        if (myPoints->HasVertexColors())
        {
          Quantity_Color aColor (360.0 * Standard_Real(aPntIndex) / Standard_Real(myPoints->VertexNumberAllocated()),
                                 1.0, 0.5, Quantity_TOC_HLS);
          myPoints->SetVertexColor (aPntIndex, aColor);
        }
      }

    private:
      Handle(Graphic3d_ArrayOfPoints) myPoints;
    };
PointCloudPntFiller 记录工具生成的点集,并用于后续显示之中。本文截图均基于 PointCloudPntFiller 实现。

最后,仍有几个疑问需要解决,随机生成点算法原理是什么、随机距离的原理是什么?当然最重要的是该工具的具体应用场景是什么?

对此感兴趣的同学可一起交流,本文源代码地址本文源代码

参考资料

1. 官方博客:OCCT 7.7.0 beta version is available - Forum Open Cascade Technology

2. 用户文档:BRepLib_PointCloudShape Class Reference - Open CASCADE Technology Documentation

3. Open Cascade 7.7.0 Beta 源代码:User account | OPEN CASCADE

转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16867753.html

posted @ 2022-11-07 22:35  Me伟  阅读(1173)  评论(1编辑  收藏  举报