OpenCascade Sweep Algorithm

eryar@163.com

Abstract. Sweeps are the objects you obtain by sweeping a profile along a path. Sweep is a very useful modeling algorithm. The paper focus on the introduction of the sweep algorithms in the opencascade.

Key Words. Sweep, Prism, Revol, Pipe, Frenet Trihedron,

1. Introduction

随着计算机技术的发展和普及,计算机辅助设计与制造(CAD/CAM)技术也得到了迅猛发展,它们推动许多领域的设计革命,计算机辅助设计与制造技术的发展和应用水平已经成为衡量一个国家现代化水平的重要标志之一。

最近中兴事件在国内引起了大家的广泛讨论,由于目前国内还制造不出能替代的芯片,所以可以从中找到与发达国家之间的差距,其实在CAD领域又何尝不是这样呢?不过在通用CAD方面,国内有一些软件厂家,有替代产品。而在行业CAD方面,一直是国外软件的天下。

原来国内有些声音是“造不如买,买不如租”,引进了许多国外软件。这些国外软件是很优秀,极大地提高了生产力。如果一直买,不思进取,结果应该会像中兴一样。如果自己造,刚开始是需要投入很大的成本,但是后面优势是不言而喻的。

国际上的三维内核目前功能相对齐全,开源的只有OpenCASCADE。国内的相关内核只从《计算机图形学》的书上见过,没有看过实物。还有一些软件厂商收购的国外内核。开源的OpenCASCADE用来学习造型相关算法还是很不错的。通过学习源码,不仅可以知其然,还可以做到知其所以然。

本文主要对OpenCASCADE中的Sweep扫掠算法的用法进行介绍,先会正确使用。正确使用是研究其实现原理的基础。

扫掠算法是图形学中很常见的造型算法,就是将指定的轮廓Profile沿着一条路径Path扫掠来得到模型。点扫掠得到边;边扫掠得到面;面扫掠得到体。

Figure 1. Generating a sweep

类BRepPrimAPI_MakeSweep是扫掠算法的基类,如下图所示:

从其派生的几个类分别用于:

l BRepPrimAPI_MakePrism:生成线性扫掠;

l BRepPrimAPI_MakeRevol:生成旋转扫掠;

l BRepOffsetAPI_MakePipeShell: 生成通用的扫掠;

下面对这几种情况分别进行说明。

2.Prism

通过类BRepPrimAPI_MakePrism可以创建线性扫掠,也就是拉伸体。在Draw Test Harness中可以使用命令prism来创建拉伸体。

polyline p                

prism r p   

vdisplay p r

在Draw Test Harness中运行上述命令,可以得到一个线性拉伸体,如下图所示:

其中红色为轮廓Profile,经过线性扫掠得到右边所示的拉伸体。

3.Revol

通过类BRepPrimAPI_MakeRevol可以创建旋转扫掠,也就是旋转体。在Draw Test Harness中可以使用命令revol来创建旋转体。

polyline p                

revol r p       

vdisplay p r

在Draw Test Harness中运行上述命令,可以得到一个旋转体,如下图所示:

其中红色为轮廓Profile,经过旋转扫掠得到右边所示的旋转体。

4.Pipe Shell

通用的扫掠算法使用类BRepOffAPI_MakePipeShell,在Draw Test Harness中使用如下命令:

l mksweep

l addsweep

l deletesweep

l sestsweep

l buildsweep

其中setsweep命令有如下选项:

setsweep options [arg1 [arg2 [...]]] : options are :

   -FR : Tangent and Normal are given by Frenet trihedron

   -CF : Tangente is given by Frenet, the Normal is computed to minimize the torsion

   -DT : discrete trihedron

   -DX Surf : Tangent and Normal are given by Darboux trihedron,

       Surf have to be a shell or a face

   -CN dx dy dz : BiNormal is given by dx dy dz

   -FX Tx Ty TZ [Nx Ny Nz] : Tangent and Normal are fixed

   -G guide  |(Plan|ACR)  ||(no contact|contact|contact on border) : with guide

-FR选项:切矢和法向由Frenet标架确定;

-CF选项:切矢由Frenet标架指定,法向通过计算最小扭转来确定;

-DT选项:切矢和法向由Darboux标架确定;

-CN选项:副法向由指定的dx, dy, dz确定;

-FT:切矢和法向是固定的;

下面通过例子来说明setsweep中这些标架选项的原理。

polyline p             

circle c       0.2

mkedge e c

wire w e

mksweep p

addsweep w

setsweep -FX   

buildsweep r -C

vdisplay p w r

运行上述Draw Test Harness脚本得到如下图所示模型:

通过setsweep -FX 1 0 0 使轮廓Profile沿着扫掠路径Path移动时,法向始终为X轴方向。

将setsweep设置为FR,即使Profile沿着Path移动时采用Frenet标架,更改后的脚本如下:

mksweep p

addsweep w

setsweep -FR

buildsweep r -C

vdisplay p w r

由上图可以看出,轮廓Profile沿着路径Path移动时,轮廓的法向始终与路径平行,即与路径的切线一致。

通过上面命令的对比可以理解setsweep中的选项原理了。关于更多形式的标架,如Darboux标架之类的,可以自己搜索学习。

其中buildsweep命令有如下选项:

buildsweep result [-M/-C/-R] [-S] [tol] : options are

   -M : Discontinuities are treated by Modfication of

        the sweeping mode : it is the default

   -C : Discontinuities are treated like Right Corner

        Treatement is Extent && Intersect

   -R : Discontinuities are treated like Round Corner

        Treatement is Intersect and Fill

   -S : To build a Solid

buildsweep有指定不连续的处理方式及是否生成实体。其中

n -C:将路径Path中不连续的地方通过延长和相交进行处理;

n -R:将路径Path中不连续的地方通过相交和填充进行处理;

下面通过例子来说明buildsweep中选项的用法。通过运行下面的Draw 脚本:

polyline p                

circle c       0.2

mkedge e c

wire w e

mksweep p

addsweep w

buildsweep r -C

vdisplay p w r

在buildsweep时使用-C选项,得到效果如下图所示:

将上述脚本中更改一下buildsweep的选项,由-C改为-R,即:

buildsweep r -R

得到的效果如下图所示:

由上面两个结果对比可以理解buildsweep的-C和-R选项了。

5.Conclusion

OpenCASCADE提供了扫掠造型的算法。对于扫掠造型的两个特例Prism和Revol,提供了类BrepPrimAPI_MakePrism和BRepPrimAPI_MakeRevol来分别生成拉伸体和和旋转体。

对于通用的扫掠造型算法,提供了类BRepOffsetAPI_MakePipeShell来生成。使用这个类的时候需要注意轮廓Profile在扫掠路径Path上的标架及扫掠路径曲线不连续的处理。

6.References

1. OpenCASCADE Modeling Algorithms.

2. 詹海生. 李光鑫. 马志欣. 基于ACIS的几何造型技术与系统开发. 清华大学出版社. 2002

3. 陈维桓. 微分几何. 北京大学出版社.

OpenCascade Sweep Algorithm的更多相关文章

  1. OpenCASCADE Root-Finding Algorithm

    OpenCASCADE Root-Finding Algorithm eryar@163.com Abstract. A root-finding algorithm is a numerical m ...

  2. Apply Newton Method to Find Extrema in OPEN CASCADE

    Apply Newton Method to Find Extrema in OPEN CASCADE eryar@163.com Abstract. In calculus, Newton’s me ...

  3. Lua 架构 The Lua Architecture

    转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...

  4. JVM自动内存管理学习笔记

    对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...

  5. VRP相关知识整理

    一.扩展问题分类: ★ the capacitated vehicle routing problem (CVRP) , 即classical VRP ★ the vehicle routing pr ...

  6. 03 Go 1.3 Release Notes

    Go 1.3 Release Notes Introduction to Go 1.3 Changes to the supported operating systems and architect ...

  7. Attacking JavaScript Engines: A case study of JavaScriptCore and CVE-2016-4622(转)

    转:http://phrack.org/papers/attacking_javascript_engines.html Title : Attacking JavaScript Engines: A ...

  8. 1. 垃圾收集简介 - GC参考手册

    说明: 在本文中, Garbage Collection 翻译为 “垃圾收集”, garbage collector 翻译为 “垃圾收集器”; 一般认为, 垃圾回收 和 垃圾收集 是同义词. Mino ...

  9. Java 垃圾收集技术

    前言 在计算机科学中,垃圾收回(GC: garbage collection)是内存自动管理的一种方式,它并不是同 Java 语言一起诞生的,实际上,早在 1959 年为了简化 Lisp 语言的手动内 ...

随机推荐

  1. [NOIP2015模拟10.22] 最小代价 解题报告 (最小生成树)

    Description 给出一幅由n个点m条边构成的无向带权图.其中有些点是黑点,其他点是白点.现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得 ...

  2. spring mvc给参数起别名

    需求: 将http报文请求(保护body和url)中的参数传递给Controller时支持使用别名. 举例: 下面两条请求报文的结果是一致的. http://example.com/foo?jobTy ...

  3. Tomcat下没有编译后的class文件

    输出的路径是否正确: Default output folder: 如果tomcat下还没有classes文件则没有编译好 需要重新引入jar包, clean工程,并重新部署项目. 这样就会在tomc ...

  4. Node+Deployd+MongoDB安装问题

    首先:祝大家新年快乐!然后:最近在看一本angular教程,教程里面需要装一些软件(node,deployd,mongodb),当三个装完后在doc命令行下运行项目时出现问题了 mongodb已经按照 ...

  5. 最小生成树(MST) prim() 算法 kruskal()算法 A - 还是畅通工程

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离. 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公 ...

  6. Git 内部原理 - (5)引用规格 (6) 传输协议

    引用规格 纵观全书,我们已经使用过一些诸如远程分支到本地引用的简单映射方式,但这种映射可以更复杂. 假设你添加了这样一个远程版本库: $ git remote add origin https://g ...

  7. POJ2104 K-th Number(整体二分)

    题解 又一次做这个题上一次用的是线段树上二分.这次用的是整体二分.结果: (第一个是整体二分) 整体二分就是对于所有查询都二分一个值.然后根据能不能成立把询问修改分成两部分,然后第二部分继承第一部分的 ...

  8. [NOIP2015提高组]子串

    题目:洛谷P2679.Vijos P1982.codevs4560.UOJ#149. 题目大意:有长度为n的A串和长度为m的B串.现在要从A串中取出k个互不重叠的子串,使它们按顺序相连后得到B串.问有 ...

  9. [NOIP1999]进制位(搜索)

    P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...

  10. unity SystemInfo类 获得电量battery

    我觉得用Unity 开发最爽的地方, 不是unity跨平台,而是用其他语言,要用很复杂的逻辑才能完成的功能,unity用一两句代码就能搞定 就比如说获取Android 系统的电量,不用发广播,不用申请 ...