14

3D CAD モデルを表示するプログラムを作成しており、自動分解図を組み込みたいと考えています。表示されるアセンブリはすべて軸対称です。そうでない人もいるかもしれませんが、大多数はそうです。アセンブリ内のパーツを分解図の位置に自動的に移動するアルゴリズムを見つけたいと思います。アルゴリズムを使用して達成したいことの例を次に示します (もちろん、ラベルは除きます)。

分解図

私が使用しなければならない唯一の値は、各パーツのバウンディング ボックスの中心です。それ以上の情報が必要な場合は、さらに情報を計算できますが、それで十分なようです。私が念頭に置いている大まかなアプローチは、軸対称軸に沿ってアセンブリの原点から各パーツの中心までのベクトルを計算し、次に中心軸に対してパーツの中心までの放射状ベクトルを計算することです。そこから、これら 2 つのベクトルの組み合わせに沿って各パーツの位置をスケーリングできる計算を行う必要があります。それは、これでどの方向に進むべきかよくわからない部分です。私が含めた画像は、私が望む正確な機能を示していますが、分解図を1で拡大または縮小するために、浮動小数点値で位置をスケーリングできるようにしたいと考えています. 0 は元の組み立て済みモデルです。何か案は?

4

1 に答える 1

14

あなたの質問は非常に広いので、私の説明はどういうわけか長くなりました。軸方向と半径方向の両方の処理について、爆発アルゴリズムの 2 つのバリエーションを提案します。

例でそれらを説明するために、次の数字を使用します (軸に沿った境界ボックスのみ、5 つの部分のみ)。

P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)

パーツ同士P1P4ぴったりと接触しP4P5実際に重なっています。

最初のものは、あなたが提案したように、基本的に距離を係数でスケーリングするアルゴリズムです。部品のサイズがアセンブリ内だけでなく、重なり合う部品でも大きく異なる場合に問題が発生します(たとえば、軸に沿った例では、円歯車の延長はビットホルダーよりもはるかに小さいです)。

スケーリング係数を とすると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 に対してまだ重なり合っています。

もう 1 つの可能性は、軸のスケーリング係数ではなく、一定のパーツ距離を定義することです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。つまり、2 つの部分を区別するために重複しています。

このアルゴリズムは上記のケースを(私の意見では)より良い方法で処理しますが、他の複数の部分をカバーし、グループ化に含めるべきではない部分に特別な注意を払う必要があります(例:あなたの場合は上部を処理します)。

1 つの可能性は、最初のステップでパーツをグループにグループ化し、次にこれらのグループの境界ボックスにアルゴリズムを適用することです。その後、複数のサブグループをカバーする部分を省略して、各グループの部分に再度適用できます。あなたの場合は次のようになります(ネストされたグループ化が可能であることに注意してください):

[
    ([battery,(switch,circuit switch),motor],handle top),
    motor cog, 
    tri-cog,
    red-cog,
    circle-cog,
    bit-holder,
    (gear casing,spring,lock knob)
]

2 つの異なる種類のグループを導入したことがわかるかもしれません: 角括弧内のパーツ/グループはアルゴリズムによって処理されます。つまり、そのようなグループ内の各パーツ/サブグループ間にスペースが追加されますが、丸括弧内のグループは分解されません。

これまでは、軸の処理から適切に分離されているため、放射状の爆発を処理していませんでした。しかし、放射状の爆発にも同じ両方のアプローチを使用できます。しかし、私の意見では、2 番目のアルゴリズムの方がより快適な結果が得られます。例えば、グループは放射状治療のために次のように行うことができます:

 [
     (battery,switch,<many parts>,gear casing),
     (switch,spring),
     (handle top, lock knob)
 ]

この場合、追加のコンポーネントrを 2 番目のグループのすべての半径中心と2*r3 番目のグループのすべてに追加します。

単純なスケーリング アルゴリズムは特別なユーザー ガイダンスなしで (スケーリング係数が与えられると) 実行されるのに対し、2 番目のアルゴリズムは追加情報 (グループ化) を使用することに注意してください。

このかなり長い説明が、さらに先に進む方法についてのアイデアを提供してくれることを願っています。私の説明が不明な点がある場合、またはさらに質問がある場合は、お気軽にコメントしてください。

于 2011-03-28T18:55:38.200 に答える