你的问题很广泛,因此我的解释变得有点冗长。我将提出两种用于轴向和径向处理的爆炸算法变体。
为了举例说明它们,我将使用以下数字(仅沿轴的边界框,只有五个部分):
P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)
虽然零件P1
完全P4
相互接触,P4
并且P5
实际上重叠。
第一个是一种算法,它基本上按一个因子缩放距离,例如你提出的。如果组件中的零件尺寸差异很大,但重叠零件也会受到影响(例如,在您的示例中,沿轴的圆形齿轮的延伸比钻头支架小得多)。
设缩放因子为f
,则每个边界框的中心缩放f
,但扩展不是。那么零件将是
P1: 5 + [-5,5] => P1': 5*f + [-5,5]
P2: 12 + [-2,2] => P2': 12*f + [-2,2]
P3: 15 + [-1,1] => P3': 15*f + [-1,1]
P4: 20 + [-4,4] => P4': 20*f + [-4,4]
P5: 22 + [-4,4] => P5': 22*f + [-4,4]
P1'
零件之间的距离P4
然后由下式给出
P2' - P1' : (12*f-2) - (5*f+5) = 7*(f-1)
P3' - P2' : (15*f-1) - (12*f+2) = 3*(f-1)
P4' - P3' : (20*f-4) - (15*f+1) = 5*(f-5)
正如预期的那样,差异为零,f=0
但对于任何分解视图,距离很大程度上取决于单独零件的尺寸。如果尺寸的变化更大,我认为这看起来不会太好。
另外对于重叠部分
P5' - P4' : (22*f-4) - (20*f+4) = 2*f-8
它们仍然重叠合理的 f。
另一种可能性是不定义轴的比例因子,而是定义一个恒定的 part-distance d
。然后边界框将如下对齐:
P1': [ 0,10]
P2': [10,14]+d
P3': [14,16]+2*d
P4': [16,24]+3*d
P5': [18,26]+4*d+6
请注意,在最后一行中我们添加了24-8=6
,即重叠以区分两个部分。
虽然此算法以(在我看来)更好的方式处理上述情况,但我们必须特别注意覆盖多个其他部分且不应包含在分组中的部分(例如,您的案例中的手柄顶部)。
一种可能性是在第一步中将零件分组,然后将算法应用于这些组的边界框。之后,它可以再次应用于每个组中的部分,省略覆盖多个子组的部分。在您的情况下,它将是(注意嵌套分组是可能的):
[
([battery,(switch,circuit switch),motor],handle top),
motor cog,
tri-cog,
red-cog,
circle-cog,
bit-holder,
(gear casing,spring,lock knob)
]
您可能会看到我介绍了两种不同类型的组:方括号中的部分/组由算法处理,即在这样的组内的每个部分/子组之间添加间距,而圆括号内的组不会分解。
到目前为止,我们还没有处理径向爆炸,因为它很好地与轴处理分离。但是同样的两种方法也可以用于径向爆炸。但在我看来,第二种算法再次产生了更令人愉快的结果。例如,对于放射治疗,可以按如下方式进行组:
[
(battery,switch,<many parts>,gear casing),
(switch,spring),
(handle top, lock knob)
]
r
在这种情况下,我们将向第二组中的所有径向中心和第三组中的所有径向中心添加一个附加组件2*r
。
请注意,简单缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二种算法使用附加信息(分组)。
我希望这个相当长的解释能给你一些如何进一步进行的想法。如果我的解释在某些时候不清楚,或者您还有其他问题,请随时发表评论。