Dav*_*ido 13 algorithm 3d cad exploded
我正在制作一个程序来查看3D CAD模型,并希望构建自动爆炸视图.将要查看的所有装配都是轴对称的.有些可能不是,但大多数是.我想找出一种算法,用于将装配体中的零件自动移动到爆炸视图位置.这是我想通过算法实现的一个例子(当然减去标签):
我必须使用的唯一值是每个部分的边界框的中心.如果需要更多信息,我可以计算更多信息,但似乎它应该足够了.我想到的粗略方法是计算从组件原点到轴对称轴每个零件中心的矢量,然后计算相对于中心轴到零件中心的径向矢量.从那里开始,我需要找出一些能够沿着这两个向量的某种组合来缩放每个部分位置的计算.那是我不太确定这个方向的部分.我包含的图像显示了我想要的确切功能,但我希望能够通过任何浮点值缩放位置以展开或收缩爆炸视图,其中1.0是原始的组装模型.有任何想法吗?
How*_*ard 12
你的问题相当广泛,因此我的解释变得有些冗长.我将提出两种用于轴向和径向治疗的爆炸算法变体.
为了用一个例子来说明它,我将使用以下数字(仅沿着轴的边界框,只有五个部分):
P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)
Run Code Online (Sandbox Code Playgroud)
虽然部分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]
Run Code Online (Sandbox Code Playgroud)
部件之间的距离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)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,差异为零,f=0但对于任何爆炸视图,距离很大程度上取决于单独部件的尺寸.如果尺寸变化较大,我认为这看起来不太好.
另外还有重叠部件
P5' - P4' : (22*f-4) - (20*f+4) = 2*f-8
Run Code Online (Sandbox Code Playgroud)
他们仍然重叠合理的f.
另一种可能性是不是为轴定义比例因子而是定义恒定的部分距离d.然后边界框将如下对齐:
P1': [ 0,10]
P2': [10,14]+d
P3': [14,16]+2*d
P4': [16,24]+3*d
P5': [18,26]+4*d+6
Run Code Online (Sandbox Code Playgroud)
请注意,在我们添加的最后一行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)
]
Run Code Online (Sandbox Code Playgroud)
您可能会看到我引入了两种不同类型的组:方形括号中的部件/组由算法处理,即在这样的组内的每个部件/子组之间添加间距,而圆形括号内的组不会爆炸.
到目前为止,我们没有处理径向爆炸,因为它很好地与轴处理分离.但同样两种方法也可以用于径向爆炸.但在我看来,第二种算法再次产生更令人愉快的结果.例如,这些组可以按照以下方式进行放射治疗:
[
(battery,switch,<many parts>,gear casing),
(switch,spring),
(handle top, lock knob)
]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们将向r第二组中的所有径向中心和2*r第三组中的所有径向中心添加一个附加组件.
请注意,简单缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二个使用附加信息(分组).
我希望这个相当长的解释会给你一些如何进一步思考的想法.如果我的解释在某些时候不清楚,或者如果您有其他问题,请随时发表评论.