OpenCASCADE General Transformation
OpenCASCADE General Transformation
Abstract. OpenCASCADE provides a general transformation class: gp_GTrsf. It can be a transformation from gp, an affinity, or you can define your own transformation giving the matrix of transformation. The general transformation contains the vectorial part of the transformation and the translation part. A GTrsf transformation is only applicable to coordinates. Be careful if you apply such a transformation to all points of a geometric object, as this can change the nature of the object and thus render it incoherent. Typically a circle is transformed into an ellipse by an affinity transformation. To avoid modifying the nature of an object, use a gp_Trsf transformation instead, as objects of this class respect the nature of geometric objects.
Key Words. OpenCASCADE, Transformation, Affinity Transformation
1. Introduction
仿射变换(Affinity Transformation)是指线性变换后接着平移。因此,仿射变换的集合是线性变换的超集,任何线性变换都是仿射变换,但不是所有的仿射变换都是线性变换。
仿射变换的定义如下:在空间直角坐标系下,点(x,y,z)与点(x’, y’,z’)之间的变换
称为仿射变换。如果采用特殊的齐次坐标来表达,仿射变换也可用下列形式:
空间仿射变换是把平面变换到平面,直线变换到直线。两个平行平面的像也是平行的。共线三点的的简单比是不变量。平行六面体的体积是权为1的相对不变量。
OpenCASCADE的TKMath库中提供了这上仿射变换类gp_GTrsf,它能执行比gp_Trsf更通用的变换。对于TopoDS_Shape,OpenCASCADE分别提供了如下两个类进行变换:
v BRepBuilderAPI_GTransform
v BRepBuilderAPI_Transform
本文在OpenCASCADE Draw Test Harness中给出这两个类实现变换的结果。如果不想改变几何的特性,只想改变模型的位置或朝向,建议采用BRepBuilderAPI_Transform。
2.BRepBuilderAPI_Transform
OpenCASCADE中使用算法BRepBuilderAPI_Transform来实现:平移、旋转、缩放及镜像变换。在Draw Test Harness中实现的函数代码如下所示:
static Standard_Integer transform(Draw_Interpretor& di,Standard_Integer n,const char** a)
{
if (n <= ) return ; gp_Trsf T;
Standard_Integer last = n;
const char* aName = a[]; Standard_Boolean isBasic = Standard_False; if (!strcmp(aName,"reset")) {
}
else {
isBasic = (aName[] == 'b');
aName++; if (!strcmp(aName,"move")) {
if (n < ) return ;
TopoDS_Shape SL = DBRep::Get(a[n-]);
if (SL.IsNull()) return ;
T = SL.Location().Transformation();
last = n-;
}
else if (!strcmp(aName,"translate")) {
if (n < ) return ;
T.SetTranslation(gp_Vec(Draw::Atof(a[n-]),Draw::Atof(a[n-]),Draw::Atof(a[n-])));
last = n-;
}
else if (!strcmp(aName,"rotate")) {
if (n < ) return ;
T.SetRotation(gp_Ax1(gp_Pnt(Draw::Atof(a[n-]),Draw::Atof(a[n-]),Draw::Atof(a[n-])),
gp_Vec(Draw::Atof(a[n-]),Draw::Atof(a[n-]),Draw::Atof(a[n-]))),
Draw::Atof(a[n-])* (M_PI / 180.0));
last = n-;
}
else if (!strcmp(aName,"mirror")) {
if (n < ) return ;
T.SetMirror(gp_Ax2(gp_Pnt(Draw::Atof(a[n-]),Draw::Atof(a[n-]),Draw::Atof(a[n-])),
gp_Vec(Draw::Atof(a[n-]),Draw::Atof(a[n-]),Draw::Atof(a[n-]))));
last = n-;
}
else if (!strcmp(aName,"scale")) {
if (n < ) return ;
T.SetScale(gp_Pnt(Draw::Atof(a[n-]),Draw::Atof(a[n-]),Draw::Atof(a[n-])),Draw::Atof(a[n-]));
last = n-;
}
} if (T.Form() == gp_Identity || isBasic) {
TopLoc_Location L(T);
for (Standard_Integer i = ; i < last; i++) {
TopoDS_Shape S = DBRep::Get(a[i]);
if (S.IsNull())
di << a[i] << " is not a valid shape\n";
else
DBRep::Set(a[i],S.Located(L));
}
}
else {
BRepBuilderAPI_Transform trf(T);
for (Standard_Integer i = ; i < last; i++) {
TopoDS_Shape S = DBRep::Get(a[i]);
if (S.IsNull()) {
di << a[i] << " is not a valid shape\n";
}
else {
trf.Perform(S);
if (!trf.IsDone())
return ;
DBRep::Set(a[i],trf.Shape());
}
}
}
return ;
}
下面给出应用Tcl脚本来实现这些变换的例子:
# create a file source toto.tcl
# toto.tcl code:
pload ALL
#create a sphere
psphere s 3
ttranslate s 25 0 12.
for {set i 0} {$i < 360} {incr i 20} {
copy s s$i
trotate s$i 0 0 0 0 0 1 $i
vdisplay s$i
}
# create two cylinders
pcylinder c1 30 5
copy c1 c2
ttranslate c2 0 0 20
vdisplay c1 c2 s
脚本运行效果如下图所示:
Figure 2.1 Transform Tcl demo
从Draw中实现的函数来看,移动、旋转及缩放变换都是使用类
BRepBuilderAPI_Transformation来实现。Tcl脚本中先创建出一个球体,再平移后,复制13份,最后又创建出两个圆柱体。如果要对TopoDS_Shape进行变换且不改变其中的几何性质,建议都使用这个类来完成。
3.BRepBuilderAPI_GTransform
在OpenCASCADE也可使用仿射变换BRepBuilderAPI_GTransform来对形状实现上述变换操作,还可提供变形的变换,因此仿射变换是更一般的变换方法。在Draw中实现的函数代码如下所示:
// gtransform
//=======================================================================
static Standard_Integer deform(Draw_Interpretor& di,Standard_Integer n,const char** a)
{
if (n <= 1) return 1;
Standard_Integer last = n;
gp_Trsf T;
gp_GTrsf GT(T);
// gp_Mat rot(Draw::Atof(a[last-3]),0,0,0,Draw::Atof(a[last-2]),0,0,0,Draw::Atof(a[last-1]));
gp_Mat rot(Draw::Atof(a[3]),0,0,0,Draw::Atof(a[4]),0,0,0,Draw::Atof(a[5]));
GT.SetVectorialPart(rot);
last -= 3;
BRepBuilderAPI_GTransform gtrf(GT);
BRepBuilderAPI_NurbsConvert nbscv;
// for (Standard_Integer i = 1; i < last; i++) {
// TopoDS_Shape S = DBRep::Get(a[i]);
TopoDS_Shape S = DBRep::Get(a[2]);
if (S.IsNull()) {
//cout << a[2] << " is not a valid shape" << endl;
di << a[2] << " is not a valid shape" << "\n";
}
else {
gtrf.Perform(S);
if (gtrf.IsDone()){
DBRep::Set(a[1],gtrf.Shape());
}
else {
return 1;
}
}
return 0;
}
根据仿射变换的定义,给定一个球面的数学表达式:
应用如下的仿射变换,将会得到一个椭球面:
由变换公式解得:
将它代入球面方程得到:
在Draw中使用BRepBuilderAPI_GTransform变换得到如下图所示:
Figure 3.1 Shape Deformation
关于仿射变换有个重要定理:一般仿射变换是正交变换、沿着三个互相正交方向的压缩或放大和平移这三者的乘积。上述命令的实现代码就是设置了仿射矩阵中的a,b和c值,从而达到对模型变形的效果。
4.Conclusion
在
三维建模软件中经常需要对模型的位置和其朝向进行变换,如果不想改变模型中的几何特性,在OpenCASCADE中建议使用类
BRepBuilderAPI_Transform来实现。如果需要对模型进行更通用的变换即仿射变换,可以使用类
BRepBuilderAPI_GTransform来实现。使用此类后,会改变模型中的几何特性,必须谨慎使用。
5. References
1. OpenCASCADE, OpenCASCADE Draw Test Harness User Guide, 2014
2. 苏步表, 华宣积. 应用几何教程. 复旦大学出版社. 2012
3. Fletcher Dunn. 3D Math Primer for Graphics and Game Development. Wordware. 2002
PDF Version: OpenCASCADE General Transformation
OpenCASCADE General Transformation的更多相关文章
- (zhuan) Attention in Neural Networks and How to Use It
Adam Kosiorek About Attention in Neural Networks and How to Use It this blog comes from: http://akos ...
- OpenCASCADE AIS Manipulator
OpenCASCADE AIS Manipulator eryar@163.com Abstract. OpenCASCADE7.1.0 introduces new built-in interac ...
- OpenCASCADE Shape Location
OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...
- OpenCASCADE Ring Type Spring Modeling
OpenCASCADE Ring Type Spring Modeling eryar@163.com Abstract. The general method to directly create ...
- A Simple OpenCASCADE Qt Demo-occQt
A Simple OpenCASCADE Qt Demo-occQt eryar@163.com Abstract. OpenCASCADE have provided the Qt samples ...
- OpenCASCADE View Manipulator
OpenCASCADE View Manipulator eryar@163.com Abstract. When you finish modeling objects in the scene, ...
- OpenCASCADE Coordinate Transforms
OpenCASCADE Coordinate Transforms eryar@163.com Abstract. The purpose of the OpenGL graphics process ...
- OpenCASCADE Camera
OpenCASCADE Camera eryar@163.com Abstract. OpenCASCADE introduce a new class Graphic3d_Camera for th ...
- OpenCASCADE Quaternion
OpenCASCADE Quaternion eryar@163.com Abstract. The quaternions are members of a noncommutative divis ...
随机推荐
- zabbix身份验证流程解析&绕过身份验证的方法
由于实验室产品的监控模块的需求,需要绕过zabbix的验证模块,实现从二级平台到zabbix的无缝接入. 测试发现,zabbix的身份验证并不是想象的那么简单,为了实现功能,遂进行源码分析. zabb ...
- Linux内核补丁批量自动下载工具
Linux kernel官网cgit工具不支持按变更代码进行补丁搜索,想到个办法就是把补丁都抓下来,这样可以在本地搜索.花了2个小时写了个小工具,话不多说,直接看效果: E:\docs\TOOLS\p ...
- [机器学习] 深度学习之caffe1——软件配置与测试
caffe的编译配置真的是很让人头疼啊,不知道试过多少次了~~~ 重装系统了七八次,搞得linux的一些常用命令倒是很熟悉了~~~ 我有洁癖~~~某一个点上出了错,我一定要把它搞好了,再重新来一次,我 ...
- MySQL多表查询
第一种: select a.a1,a.a2,a.a3,b.b2,c.c2,d.d2 from a,b,c,d where a.a1=b.b1 and b.b1=c.c1 and c.c1=d.d1 第 ...
- Ubuntu创建桌面快捷方式
默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok,如图: 上面的方法是通过系统自 ...
- Python 爬虫2——环境配置
关于环境配置的操作,其实非常简单,假如不使用第三方的框架的话,只需要安装Python即可完成后续的操作. 一.Python的安装和配置: windows系统的安装配置过程如下,假如是Mac系统,可参考 ...
- 关于“模仿"和”创新“
互联网刚刚进入中国的前10年,国内互联网企业基本处于模仿和学习阶段.三大门户新浪.搜狐和网易,师从雅虎:现在如日中天的BAT三巨头,百度学习谷歌.阿里巴巴学习亚马逊和EBAY.腾讯学习ICQ. 关于模 ...
- ActionMapping
在Struts中,ActionServlet只是任务的分派者,它依请求分配任务给其它的对象来执行,而分配的依据是请求的URI以及struts-config.xml的<action-mapping ...
- php中htmlspecialchars()函数和addslashes()函数的使用和区别
在防止被注入攻击时,常会用到两个函数:htmlspecialchars()和addslashes()函数.这两个函数都是对特殊字符进行转义. 1)addslashes()作用及使用 addslashe ...
- Visual Studio 2015 如何将全英界面转成中文
1 启动VS2015程序,在菜单栏中找到tools 2 在弹出的下拉窗口中选中options 3 此时弹出的对话框,选中Environment下的international setting 4 点击获 ...