BRep Shapes Based on Tessellated Geometry

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

内容简介: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

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

查看所有标签

猜你喜欢:

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

JavaScript征途

JavaScript征途

朱印宏 / 电子工业出版社 / 2009-9 / 89.00元

《JavaScript征途》是一本学习JavaScript语言的权威书籍,在遵循语言学习的特殊规律基础上精心选材,力争做到统筹、有序,在结构上体现系统性和完整性。同时还重点挖掘JavaScript基于对象的开发精髓及函数式编程两个技术核心。《JavaScript征途》内容全面,由浅入深,包括6篇21章,主要内容包括:JavaScript语言的基本特性,开发简单的JavaScript程序,JavaS......一起来看看 《JavaScript征途》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码