2011-03-28 15 views
12

3D CADモデルを表示するプログラムを作成しており、自動分解ビューで構築したいと考えています。表示されるすべてのアセンブリは、軸対称です。いくつかはそうではないかもしれないが、大部分はそうである。アセンブリ内のパーツを分解したビュー位置に自動的に移動するアルゴリズムを理解したいと思います。ここで私は、アルゴリズム(マイナスもちろんのラベル)を介して達成するために何をしたいの例です。CADの分解図アルゴリズム

Exploded view

私はで動作するように持っている唯一の値は、各パーツのバウンディングボックスの中心です。それ以上の情報が必要な場合、私はより多くの情報を計算することができますが、十分なはずです。私が心に留めている大まかなアプローチは、アセンブリの原点から軸対称軸に沿った各パーツの中心までのベクトルを計算し、次に中心軸に対するパーツの中心までの半径ベクトルを計算することです。そこから、私はこれらの2つのベクトルのいくつかの組み合わせに沿って各部分の位置をスケールすることができるいくつかの計算を理解する必要があります。それは、私がこれをどのような方向に向けるのかがはっきりしていない部分です。私が含まれている画像は、私が望む正確な機能を示していますが、分解されたビューを拡大または縮小するために浮動小数点値で位置をスケールすることができます。何か案は?

答えて

9

あなたの質問はかなり広く、私の説明はやや長くなりました。私は軸方向と半径方向の両方の治療のための爆発アルゴリズムの2つの変形を提案します。部品P4からP1が互いに正確に触れながら、

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

P4P5:私は(、唯一の軸に沿ってのみ、5つの部分を境界ボックス)以下の数字を使用します例でそれらを説明するために

実際に重なっている。

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

スケーリング係数をfとすると、各境界ボックスの中心はfでスケーリングされますが、拡張子はスケーリングされません。部品は、その後、差がf=0ためではなく、任意のゼロであり、予想されたようP4からP1'部の間は、次に

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) 

によって与えられる

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] 

距離は、距離が強くサイズに依存するビューを分解することになります別々の部品の私はサイズのバリエーションが大きければ、これがあまりにも良く見えるとは思わない。重複する部分

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 

注最後の行に、我々は2つの部分を区別するために、すなわち重なり、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) 
] 

あなたは、私がグループの二つの異なる種類を導入していることが表示される場合があります。角括弧内の部品/グループは、アルゴリズムによって処理され、間隔は、すなわちそのようなグループ内の各パート/サブグループの間に追加されますが、中括弧内のグループは分解されません。

これまでは軸治療から切り離されていたため、半径方向の爆発は扱っていませんでした。しかし、やはり、ラジアル爆発の場合にも、どちらのアプローチも同じように使用できます。しかし、私の意見では、2番目のアルゴリズムはより快適な結果をもたらします。例えば。放射状の治療のために次のようにグループを行うことができる。この場合

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

我々は第三のグループ内のすべてのに追加の第二のグループ内のすべての半径方向中心に成分r2*rを追加します。

シンプルスケーリングアルゴリズムは特別なユーザーガイダンス(スケーリングファクタが与えられた後)なしで実行され、2番目のものは追加情報(グループ化)を使用します。

これよりかなり長い説明が、今後の進め方についてのご意見をお寄せください。私の説明がある時点で不明確な場合や、さらに質問がある場合は、お気軽にコメントしてください。

+1

ワウ。徹底的に+1。私がもっと与えることを望みます。 –