Opencascad中Cut操作与Location变换的关系
来源:互联网 发布:mac终端出现password 编辑:程序博客网 时间:2024/06/14 05:04
- 正常Cut情况
- 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操作时候,其空间坐标发生的变换如下表所示:
于是问题的原因就出来了。Cut操作以后,A物体不但其坐标原点发生了偏移,而且其Location也保留了偏移,于是最终结果是偏移了2次。
解决思路
既然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());// CutshapeA = BRepAlgoAPI_Cut(shapeA, shapeB); // 重置A、B的Location。shapeA.Location(locOld);shapeB.Location(locOld * shapeB.Location());
- Opencascad中Cut操作与Location变换的关系
- OpenGL中剪裁平面与模型视图变换的关系
- 傅立叶变换与图像处理的关系
- KL变换与PCA的关系
- JavaScript中location.host 与 location.hostname 的区别
- 关于 OpenGL 中平移矩阵变换与实体对象坐标平移的关系分析结论
- MATLAB FFT变换中,数字频率与模拟频率的转换关系
- 阐述信号与系统中三大变换(即傅里叶变换、拉普拉斯变换、Z变换)的关系
- Html5 Canvas 变换矩阵与坐标变形之间的关系
- Html5 Canvas 变换矩阵与坐标变形之间的关系
- [转]傅立叶变换与小波分析的关系
- Html5 Canvas 变换矩阵与坐标变形之间的关系
- iOS-矩阵与线性代数的关系____仿射变换
- Z变换零极点与收敛域的关系
- canvas变换与操作
- 信号处理中各种变换的关系图
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 常用微信集成(第三方sdk集成套路)-- 微信支付
- Android开发中在一个Activity中关闭另一个Activity
- 分布式消息队列
- 【用Cocos Creator给暗恋的女生写一个游戏(12)】——跨场景访问节点、存储数据、添加音效音乐、打包发布
- 【ios自动化测试】iOS自动化测试框架分析与选择
- Opencascad中Cut操作与Location变换的关系
- NoSQL Manager for MongoDB 连接配置
- Lua利用自定义函数打印_G内容
- Java(扩展Socket通信)
- LintCode之滑动窗口的中位数
- android 数据库的操作基础(二)
- Android Studio 和 Eclipse 中获取SHA1详解
- Android 解决不同进程发送KeyEvent 的问题
- 机器学习第四周