转载请注明原文链接:https://blog.csdn.net/Mechanicoder/article/details/127328298
1. 简介
OCC官方在2022年10月3日发布 7.7 Beta 版,其中一个更新为:一个用于生成拓扑模型上的点集的工具方法。
Introduced new tool BRepLib_PointCloudShape generating a point set for a
topological shape.
参考新功能说明文档和用户文档,其主要功能:在距离模型表面指定距离内生成点集,可以用来模拟激光扫描模型所得到的点云,提供两种生成方式:
- 根据设定的点集密度值自动生成点集;
- 根据模型三角形网格顶点生成。[文档特别注明该方法非线程安全]
2. 测试效果
使用三个模型进行测试,效果如下:
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://blog.csdn.net/Mechanicoder/article/details/127328298