OpenCascade Sweep Algorithm
OpenCascade Sweep Algorithm
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的更多相关文章
- OpenCASCADE Root-Finding Algorithm
OpenCASCADE Root-Finding Algorithm eryar@163.com Abstract. A root-finding algorithm is a numerical m ...
- 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 ...
- Lua 架构 The Lua Architecture
转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...
- JVM自动内存管理学习笔记
对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...
- VRP相关知识整理
一.扩展问题分类: ★ the capacitated vehicle routing problem (CVRP) , 即classical VRP ★ the vehicle routing pr ...
- 03 Go 1.3 Release Notes
Go 1.3 Release Notes Introduction to Go 1.3 Changes to the supported operating systems and architect ...
- 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 ...
- 1. 垃圾收集简介 - GC参考手册
说明: 在本文中, Garbage Collection 翻译为 “垃圾收集”, garbage collector 翻译为 “垃圾收集器”; 一般认为, 垃圾回收 和 垃圾收集 是同义词. Mino ...
- Java 垃圾收集技术
前言 在计算机科学中,垃圾收回(GC: garbage collection)是内存自动管理的一种方式,它并不是同 Java 语言一起诞生的,实际上,早在 1959 年为了简化 Lisp 语言的手动内 ...
随机推荐
- grpc编译错误解决
berli@berli-VirtualBox:~/grpc$ make [MAKE] Generating cache.mk [C] Compiling src/core/lib/s ...
- Linux中的find命令
.递归查找(find 命令 是递归遍历文件夹的) 命令:find . -name “*.txt” //当前路径下递归查找以.txt结尾的文件夹 .不递归查找 find . -name “*.txt” ...
- Tuple assignment
It is often useful to swap the values of two variables. With conventional assignments, you have to u ...
- feign client传递对象
http://bbs.springcloud.cn/d/134-feign-client server端申明 @RestController public class HelloController ...
- MySQL格式化日期参数
MySQL格式化日期参数 %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀的月中的天 %d 月的天,数值(00-31) %e 月的天,数值(0-31) %f 微秒 %H 小时 (0 ...
- 未能加载文件或程序集“MICROSOFT.REPORTVIEWER.WEBFORMS …
此类问题说明没有安装 REPORT .请下载 ReportViewer.msi 安装包. 和sqlsysclrtypes.msi 两个都是对应版本的安装包. 这样再次启动就不会报错了.
- AngularJs轻松入门(六)表单校验
表单数据的校验对于提高WEB安全性意义不大,因为服务器接收到的请求不一定来自我们的前端页面,有可能来自别的站点,黑客可以自己做一个表单,把数据提交到我们的服务器(即跨站伪造请求),这样就绕过了前端页面 ...
- 【C#Windows 服务】 《三》Timer设置
一.工具: VS2015+NET Framework4.5. 二.操作: 1.计时器设置: 2.日志代码: 三.代码: 1.日志代码: 1 /// <summary> 2 /// Wind ...
- 把ISO文件当作光盘挂载
当不能挂载光盘或者U盘时候,只需要把ISO文件传到某个目录中,比如/data下,即可挂载,如下所示: mount -o loop /data/rhel-server-6.3-x86_64-dvd. ...
- 洛谷P2408 不同子串个数 后缀数组 + Height数组
## 题目描述: 给你一个长为 $N$ $(N<=10^5)$ 的字符串,求不同的子串的个数我们定义两个子串不同,当且仅当有这两个子串长度不一样 或者长度一样且有任意一位不一样.子串的定义:原字 ...