Opencascad中Cut操作与Location变换的关系

在实体建模算法中,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

于是问题的原因就出来了。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());

// Cut
shapeA = BRepAlgoAPI_Cut(shapeA, shapeB);   

// 重置A、B的Location。
shapeA.Location(locOld);
shapeB.Location(locOld * shapeB.Location());
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页