BRep Shapes Based on Tessellated Geometry

eryar@163.com

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,命令参数如下图所示:

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模型:

Figure 2. Shaded STL model in 3D Viewer

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

Figure 3. Wireframe STL model in 3D Viewer

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

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 < )
{
theDI << "wrong number of parameters" << "\n";
return ;
}
else
{
if (theArgc == &&
strcmp("triangulation", theArgv[]) == )
{
// Read STL file to the triangulation.
Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDI, );
Handle(Poly_Triangulation) aTriangulation = RWStl::ReadFile (theArgv[], aProgress); TopoDS_Face aFace;
BRep_Builder aB;
aB.MakeFace(aFace);
aB.UpdateFace(aFace, aTriangulation);
DBRep::Set(theArgv[], aFace);
}
else
{
TopoDS_Shape aShape;
Standard_DISABLE_DEPRECATION_WARNINGS
StlAPI::Read(aShape, theArgv[]);
Standard_ENABLE_DEPRECATION_WARNINGS
DBRep::Set(theArgv[], aShape);
}
} return ;
}

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

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

4. Conclusion

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

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

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的更多相关文章

  1. Mesh BRep Shapes

    Mesh BRep Shapes eryar@163.com Abstract. 当对OpenCASCADE的BRep表示法的数据结构有了一定的理解后,建议可以自己实现一个显示数据生成的功能,即网格剖 ...

  2. Topology Shapes of OpenCascade BRep

    Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...

  3. 基于ACIS/HOOPS的3D应用开发简介 【转】

    (整理) 平台:                造型引擎——ACIS         显示引擎——Direct3D/OpenGL/GDI         应用框架——HOOPS   组件关系图     ...

  4. 行人检测(Pedestrian Detection)资源整合

    一.纸 评论文章分类: [1] D. Geronimo, and A. M.Lopez. Vision-based Pedestrian Protection Systems for Intellig ...

  5. paper 15 :整理的CV代码合集

    这篇blog,原来是西弗吉利亚大学的Li xin整理的,CV代码相当的全,不知道要经过多长时间的积累才会有这么丰富的资源,在此谢谢LI Xin .我现在分享给大家,希望可以共同进步!还有,我需要说一下 ...

  6. MYSQL 5.7 新增150多个新功能

    http://www.thecompletelistoffeatures.com/ There are over 150 new features in MySQL 5.7. The MySQL ma ...

  7. Using SetWindowRgn

    Using SetWindowRgn Home Back To Tips Page Introduction There are lots of interesting reasons for cre ...

  8. Actor::updateMassFromShapes

    unity报错Actor::updateMassFromShapes: Compute mesh inertia tensor failed for one of the actor's mesh s ...

  9. Gazebo機器人仿真學習探索筆記(四)模型編輯

    模型編輯主要是自定義編輯物體模型構建環境,也可以將多種模型組合爲新模型等,支持外部模型導入, 需要注意的導入模型格式有相應要求,否在無法導入成功, COLLADA (dae), STereoLitho ...

随机推荐

  1. thinkphp 中模型究竟是什么用?

    thinkphp 中模型究竟是什么用? 问题 似乎所有的操作都能在控制器中就能完成,模型除了几种验证之外,究竟是干什么用的,这个问题一直没理解透 解答 解答一 要明白这个问题,必须了解 MVC 历史. ...

  2. BZOJ 3130 二分+网络流

    思路: 不被题目忽悠就是思路 二分一下max 判一下等不等于最大流 搞定 7 9 1 1 2 3 1 3 3 2 3 3 3 4 2 3 5 2 3 6 1 4 7 2 5 7 2 6 7 2 这里有 ...

  3. Kali linux 2016.2(Rolling)里Metasploit的数据库

    为什么要在Metasploit里提及到数据库? 大家都知道,这么多信息,我怎样才能把它们整理好并保存起来?怎么展现给老大看,最后怎么体现在要提交的渗透测试报告中呢?   你的担忧真的很有必要,因为啊, ...

  4. MyBatis、JDBC、Hibernate区别

    从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作. 从功能上看, JDBC就是简单的建立数据库连接,然 ...

  5. css hover图片hover效果兼容ie8

    例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  6. IDL build

    For Developers‎ > ‎Design Documents‎ > ‎ IDL build 目录 1 Steps 2 GYP 3 Performance 3.1 Details ...

  7. cmd 操作命令

    1)cd 操作文件目录的 cd path #进入path cd / #返回到当前盘符的根目录 cd .. #返回到上级目录 2)dir 显示当前目录 dir #显示当前目录下的文件夹 dir path ...

  8. 紫书 习题 10-8 UVa 10622(gcd)

    把这个数质因数分解然后求因子个数的gcd就ok了. 一些细节 (1)这道题的质因数不需要存下来,每一次做完取一次gcd就ok了 (2)判断奇偶用ans & 1的时候要加括号, 位运算要注意括号 ...

  9. main()函数的形参

    main函数中的第一个参数argc代表的是向main函数传递的参数个数,第二个参数argv数组代表执行的程序名称和执行程序时输入的参数 #include <stdio.h> int mai ...

  10. Service绑定模式

    Service绑定模式      使用绑定的Service能够实现组件与Service的通信. 组件与被绑定的Service能够不归属于同一个应用程序.因此通过绑定Service能够实现进程间通信. ...