14

我正在制作一个查看 3D CAD 模型的程序,并希望构建自动分解视图。将要查看的所有组件都是轴对称的。有些可能不是,但大多数是。我想找出一种算法,用于自动将装配中的零件移动到分解视图位置。这是我想通过算法实现的示例(当然减去标签):

分解图

我必须使用的唯一值是每个部分的边界框的中心。如果需要更多信息,我可以计算更多信息,但似乎应该足够了。我想到的粗略方法是沿轴对称轴计算从组件原点到每个零件中心的矢量,然后计算相对于中心轴到零件中心的径向矢量。从那里,我需要弄清楚一些计算,能够沿着这两个向量的某种组合来缩放每个部分的位置。这就是我不太确定该往哪个方向发展的部分。我包含的图像显示了我想要的确切功能,但我希望能够通过任何浮点值缩放位置以扩展或收缩分解视图,使用 1。0 是原始组装模型。有任何想法吗?

4

1 回答 1

14

你的问题很广泛,因此我的解释变得有点冗长。我将提出两种用于轴向和径向处理的爆炸算法变体。

为了举例说明它们,我将使用以下数字(仅沿轴的边界框,只有五个部分):

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

请注意,简单缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二种算法使用附加信息(分组)。

我希望这个相当长的解释能给你一些如何进一步进行的想法。如果我的解释在某些时候不清楚,或者您还有其他问题,请随时发表评论。

于 2011-03-28T18:55:38.200 回答