BRep Shapes Based on Tessellated Geometry

栏目: 编程工具 · 发布时间: 7年前

内容简介:Key Words. BRep Shape, Tessellated Geometry, Mesh, STLOCCTOCC7.3.0

BRep Shapes Based on Tessellated Geometry

Key Words. BRep Shape, Tessellated Geometry, Mesh, STL

1. Introduction

OCCT TopoDS 允许定义只包含显示数据的 BRep 体,如只包含边的显示数据:多段线;面的显示数据:网格,而不包含几何曲线和曲面。只包含显示数据的 BRep 体有时候很有用,如只需要显示一下而不对其做任何修改。但是 OCC7.3.0 版本之前是不支持这些显示数据的。这里说的不支持的意思是不支持显示数据的功能,如不能显示只包含显示数据的 BRep 体等等。

OCC7.3.0 版本之后陆续想添加对只包含显示数据的 BRep 的支持,包括如下功能:

l 计算包围盒;

l 计算网格面积;

l 计算两个 BRep 之间的距离;

l 计算 HLR (隐藏线消除);

相关的内容在其官网上,网址: https://tracker.dev.opencascade.org/view.php?id=28125

2. Display Mesh

OCC 中支持的网格文件只有 STL 文件,在 Draw Test Harness 中提供了读取 STL 文件的命令 readstl ,命令参数如下图所示:

BRep Shapes Based on Tessellated Geometry  

Figure 1. Draw readstl command

第一个参数 shape 是读取 STL 生成的 BRep 名称;

第二个参数 file STL 文件名;

第三个参数 triangulation 是可选参数,如果输入 triangulation ,则采用新的方式即直接生成网格;否则采用原来的方式,即将网格的每个三角形生成一个 TopoDS_Face

下面将这些命令写在一个 Tcl 脚本文件中,把 OCC 数据 data 文件夹中的 STL 文件进行显示,

pload ALL
readstl s [pwd]/data/stl/bearing.stl triangulation
vdisplay s

下面对上述脚本进行解释。

第一行 pload ALL 是加载 OCC 所有的脚本命令;

第二行使用 readstl 命令,且设置成 triangulation 读取模式;

第三行是在三维视图窗口中显示读取的 STL 模型;

直接在 Draw Test Harness 中输入上述命令也可以,反正只有几行。或者把这几行命令保存成一个文件,再使用 source 命令来加载也可以。下面是在 3D Viewer 中显示读取的 STL 模型:

BRep Shapes Based on Tessellated Geometry

Figure 2. Shaded STL model in 3D Viewer

使用快捷键 S/W 来切换显示模式, S 表示 Shaded ,是着色渲染模式; W 表示 Wireframe ,是线框显示模式。下图为切换到线框显示模式的效果:

BRep Shapes Based on Tessellated Geometry

Figure 3. Wireframe STL model in 3D Viewer

从上图可知,采用直接显示网格的方式显示的 STL 模型在线框模式的时候,效果不是很理想。一般的三维软件对于这种网格的线框模式就是直接显示每个三角形。如下图所示:

BRep Shapes Based on Tessellated Geometry

Figure 4. Wireframe of the STL model

所以,如果有需要在 OCC 中显示 STL 模型的线框,则需要自己再作处理,可以选择一些边加到 BRep 体中,不一定像上图所示那样显示每一个网格三角形。

3. Source Code

根据原来介绍的通过 Draw 的命令查找其源实现的方法,找到 readstl 命令的源码在文件 XSDRAWSTLVRML.cxx 中,源码如下所示:

//=============================================================================
//function : readstl
//purpose  : Reads stl file
//=============================================================================
static Standard_Integer readstl(Draw_Interpretor& theDI,
                                Standard_Integer theArgc,
                                const char** theArgv)
{
  if (theArgc < 3)
  {
    theDI << "wrong number of parameters" << "\n";
    return 1;
  }
  else
  {
    if (theArgc == 4 &&
        strcmp("triangulation", theArgv[3]) == 0)
    {
      // Read STL file to the triangulation.
      Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDI, 1);
      Handle(Poly_Triangulation) aTriangulation = RWStl::ReadFile (theArgv[2], aProgress);
      TopoDS_Face aFace;
      BRep_Builder aB;
      aB.MakeFace(aFace);
      aB.UpdateFace(aFace, aTriangulation);
      DBRep::Set(theArgv[1], aFace);
    }
    else
    {
      TopoDS_Shape aShape;
      Standard_DISABLE_DEPRECATION_WARNINGS
      StlAPI::Read(aShape, theArgv[2]);
      Standard_ENABLE_DEPRECATION_WARNINGS
      DBRep::Set(theArgv[1], aShape);
    }
  }
  return 0;
}

当使用选项 triangulation 时,采用新的读取 STL 函数得到网格数据,再用 BRep 体的底层函数生成一个 TopoDS_Face ,直接将网格数据 aTriangulation 设置在 Face 中。

当不使用选项 triangulation 时,还是采用老的方式来读取 STL 模型。老的方式读取速度慢,且将网格中每个三角形生成一个 TopoDS_Face ,占用大量内存,是效率不高的方式,所以标记为作废状态。开发者应尽量采用新的方式。

4. Conclusion

OCC7.3 版本开始支持只包含显示数据的 BRep 体,这样只包含显示数据的 BRep 体可以直接显示,与原来的将网格数据中的每个三角形都生成 TopoDS_Face 的方式相比,将会大大提高显示效率。

因为网格数据中没有包含线框的信息,所以直接显示的网格模型切换到线框模式的效果不好,有时甚至不显示线框。

BRep Shapes Based on Tessellated Geometry

Figure 5 Propeller STL model

上图所示的 STL 螺旋桨模型切换到线线框模式后,就没有了。这时 OCC 的选择功能也不能使用,即选不中这个模型了。

如果要显示网格模型的线框,需要自己根据实际情况添加一些 Edge 以达到理想效果。

5. References

1. https://tracker.dev.opencascade.org/view.php?id=28125

为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。

BRep Shapes Based on Tessellated Geometry

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Zero to One

Zero to One

Peter Thiel、Blake Masters / Crown Business / 2014-9-16 / USD 27.00

“This book delivers completely new and refreshing ideas on how to create value in the world.” - Mark Zuckerberg, CEO of Facebook “Peter Thiel has built multiple breakthrough companies, and ......一起来看看 《Zero to One》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具