Детальный алгоритм для CAD - PullRequest
13 голосов
/ 28 марта 2011

Я создаю программу для просмотра 3D-моделей САПР и хотел бы встроить автоматизированные покомпонентные виды.Все сборки, которые будут просмотрены, являются осесимметричными.Некоторые могут не быть, но большинство есть.Я хотел бы выяснить алгоритм автоматического перемещения деталей в сборке в разобранном виде.Вот пример того, чего я хочу достичь с помощью алгоритма (за исключением меток, конечно):

Exploded view

Единственное значение, с которым мне нужно работатьявляется центром ограничительной рамки каждой части.Если требуется больше информации, чем это, я могу рассчитать больше информации, но кажется, что этого должно быть достаточно.Грубый подход, который я имею в виду, заключается в том, чтобы рассчитать вектор от начала сборки до центра каждой детали вдоль осесимметричной оси, а затем вычислить радиальный вектор до центра детали относительно центральной оси.Оттуда мне нужно вычислить некоторые вычисления, которые могли бы масштабировать положение каждой части вдоль некоторой комбинации этих двух векторов.Это та часть, где я не совсем уверен, в каком направлении идти с этим.Изображение, которое я включил, показывает точную функциональность, которую я хотел бы, но я хочу иметь возможность масштабировать позицию по любому значению с плавающей запятой, чтобы развернуть или сжать разнесенный вид, при этом 1.0 - это оригинальная собранная модель.Есть идеи?

1 Ответ

11 голосов
/ 28 марта 2011

Ваш вопрос довольно широк, и поэтому мое объяснение стало несколько длинным.Я предложу два варианта алгоритма взрыва как для осевой, так и для радиальной обработки.

Чтобы проиллюстрировать их на примере, я буду использовать следующие числа (ограничивающие рамки только по оси, только пять частей):

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.

Другой возможностью было бы определить не масштабный коэффициент для оси, а постоянное расстояние детали 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 ко всем в третьейgroup.

Обратите внимание, что простой алгоритм масштабирования работает без специального руководства пользователя (если указан коэффициент масштабирования), а второй использует дополнительную информацию (группирование).

Надеюсь, это довольно долгообъяснение дает вам некоторые идеи, как действовать дальше.Если мои объяснения неясны в какой-то момент или у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь комментировать.

...