Opencascad中Cut操作与Location变换的关系
2016-09-02 10:39
246 查看
正常Cut情况
B物体发生位移情况
A物体发生位移情况
原因分析
解决思路
在实体建模算法中,Cut操作属于典型的Bool运算。入门教程详见:
http://www.cppblog.com/eryar/archive/2013/01/17/197357.aspx
然而,如果Cut操作的对象本身的Location(即本身的坐标系)发生过变换,会发生什么问题呢?
以2个TopoDS_Shape做cut操作为例。红色立方体为A,长宽为1000个单位;绿色立方体为B,长宽为500个单位。
注意A、B都在坐标原点,没有任何位置变换。
经过A = BRepAlgoAPI_Cut(A, B)变换前后的结果如下图所示:
(注意:为了看得更清楚,把绿色方块B向上移动了一些距离)
比如,如果我们先将B物体向x方向移动500单位,如下图所示:
现在做Cut操作能够得到正常结果?结果如下:
(注意:为了看得更清楚,把绿色方块B向上移动了一些距离)
看来A-B操作,B物体移动不影响结果。
如下图所示,在做Cut操作之前,将A物体向x方向移动500单位,如下图所示:
现在做Cut操作,结果如下:
注意,此时可以看到,虽然Cut操作后,A物体确实被正确的剪掉了A、B的交集部分,但是裁剪后的A物体同时还向x方向做了偏移。
这个偏移并不是我们想要的结果。我们希望A物体还是和Cut之前一样老老实实了待在原地。
为什么会发生这种情况?
坐标原点,以及坐标偏移Location。
坐标原点容易理解,而Location可以理解为描述整个空间变换(旋转,偏移)的矩阵,类似于OpenGL中的Model变换矩阵。
A物体在移动、Cut操作时候,其空间坐标发生的变换如下表所示:
于是问题的原因就出来了。Cut操作以后,A物体不但其坐标原点发生了偏移,而且其Location也保留了偏移,于是最终结果是偏移了2次。
具体解决思路如下:
1. 求解A的Location变换矩阵的逆矩阵;
2. 修改A的Location,使其移回原点;(相当于Location设置为单位矩阵)
3. 修改B的Location,使其相应移动;(左乘步骤1得出的逆矩阵)
4. Cut操作;
5. 重置A、B的Location。
下面是通过上面方法得到A移动的情况下Cut的结果。
注意此时A物体被选中,能够看到其轮廓边框。
代码如下:
B物体发生位移情况
A物体发生位移情况
原因分析
解决思路
在实体建模算法中,Cut操作属于典型的Bool运算。入门教程详见:
http://www.cppblog.com/eryar/archive/2013/01/17/197357.aspx
然而,如果Cut操作的对象本身的Location(即本身的坐标系)发生过变换,会发生什么问题呢?
正常Cut情况
下面以一个例子做说明。以2个TopoDS_Shape做cut操作为例。红色立方体为A,长宽为1000个单位;绿色立方体为B,长宽为500个单位。
注意A、B都在坐标原点,没有任何位置变换。
经过A = BRepAlgoAPI_Cut(A, B)变换前后的结果如下图所示:
(注意:为了看得更清楚,把绿色方块B向上移动了一些距离)
B物体发生位移情况
很多时候,在做A-B操作时,我们要把B物体移动部分单位。比如,如果我们先将B物体向x方向移动500单位,如下图所示:
现在做Cut操作能够得到正常结果?结果如下:
(注意:为了看得更清楚,把绿色方块B向上移动了一些距离)
看来A-B操作,B物体移动不影响结果。
A物体发生位移情况
同样的,如果A物体发生位移呢?如下图所示,在做Cut操作之前,将A物体向x方向移动500单位,如下图所示:
现在做Cut操作,结果如下:
注意,此时可以看到,虽然Cut操作后,A物体确实被正确的剪掉了A、B的交集部分,但是裁剪后的A物体同时还向x方向做了偏移。
这个偏移并不是我们想要的结果。我们希望A物体还是和Cut之前一样老老实实了待在原地。
为什么会发生这种情况?
原因分析
在OCC中,物体的空间坐标由2个因素决定:坐标原点,以及坐标偏移Location。
坐标原点容易理解,而Location可以理解为描述整个空间变换(旋转,偏移)的矩阵,类似于OpenGL中的Model变换矩阵。
A物体在移动、Cut操作时候,其空间坐标发生的变换如下表所示:
A物体 | 坐标原点 | Location |
---|---|---|
移动前 | (0,0,0) | 单位阵 |
Cut前 | (0,0,0) | x移动500 |
Cut后 | (500,0,0) | x移动500 |
解决思路
既然A-B的结果会保留A最终的偏移状态,一个直观的解决思路就是强制A-B操作时,A的Location为单位矩阵。具体解决思路如下:
1. 求解A的Location变换矩阵的逆矩阵;
2. 修改A的Location,使其移回原点;(相当于Location设置为单位矩阵)
3. 修改B的Location,使其相应移动;(左乘步骤1得出的逆矩阵)
4. Cut操作;
5. 重置A、B的Location。
下面是通过上面方法得到A移动的情况下Cut的结果。
注意此时A物体被选中,能够看到其轮廓边框。
代码如下:
TopLoc_Location locOld = shapeA.Location(); // 求解A的Location变换矩阵的逆矩阵; TopLoc_Location locInverted = shapeA.Location().Inverted(); // 修改A的Location,使其移回原点 shapeA.Location(TopLoc_Location()); // 修改B的Location,使其相应移动; shapeB.Location(locInverted * shapeB.Location()); // Cut shapeA = BRepAlgoAPI_Cut(shapeA, shapeB); // 重置A、B的Location。 shapeA.Location(locOld); shapeB.Location(locOld * shapeB.Location());
相关文章推荐
- 第5天(就业班) BOM、window对象、事件、location对象、screen对象、Dom编程根据属性找节点、通过关系找节点、添加附件、联动框、操作元素的css样式、正则表达式
- 一个双实体多对多关系的操作
- hibernate复杂映射关系下的删除操作和list类型映射的注意点
- linux进程关系操作
- 交换操作的重要意义,以及它与赋值,拷贝的关系
- IE-Internet操作选项设置与注册表项对应关系
- 关于NHibernate中关系表的操作
- GIS中点线面的空间关系(ArcMap的Select By Location)
- 数据库跟丽军学 之二 关系数据库操作语言SQL(Structured Query Language, 结构化查询语言)
- IE-Internet操作选项设置与注册表项对应关系
- JS 操作IE游览器常用函数:window.external,history,document.execCommand,window.location,WebBrowser.ExecWB
- C#中文件操作的各类的关系
- JAVA操作XML二(转换关系):String --document--xml --document--String
- 具有依赖关系的并行操作执行
- Hibernate 一张表细化操作及表之间继承关系的映射配置
- 在程序中使用事务,处理无外键关系的表与表间的操作。
- Java持久性API(JPA)第6讲——关系操作
- 利用ODBC实现Domino和关系的互操作
- C#中linq学习(Linq查询操作中的类型关系)示例
- 光脚丫学LINQ(012):LINQ查询操作中的类型关系