Перейти к публикации

Нужен алгоритм генерации STL!


Рекомендованные сообщения

Здраствуйте, уважаемые специалисты!

Нужен алгоритм генерации STL поверхности на уже имеющемся наборе примитивов (например есть поверхность, описанная плоскостями, сопряженными цилиндрами или другими функциями второго порядка, или облаком точек).

Задача состоит в моделировании с помощью треугольников криволинейной поверхности, форма которой зависит от времени.

Заранее спасибо!

С уважением!

Alexei

Ссылка на сообщение
Поделиться на других сайтах


Здраствуйте, уважаемые специалисты!

Нужен алгоритм генерации STL поверхности на уже имеющемся наборе примитивов (например есть поверхность, описанная плоскостями, сопряженными цилиндрами или другими функциями второго порядка, или облаком точек).

Задача состоит в моделировании с помощью треугольников криволинейной поверхности, форма которой зависит от времени.

Заранее спасибо!

С уважением!

Alexei

Так это что - "вручную" надо делать? Ведь почти каждый CAD имеет средство конвертации из STL и обратно.

Или смысл в чем-то другом?

Ссылка на сообщение
Поделиться на других сайтах

Да, нужно вручную написать алгоритм на фортране (или С).

А цель этой задачи - моделировать перемещающуюся поверхность в газодинамическом пакете.

Вроде, есть решения у программистов компьютерных игр и 3D графики вообще.

Но я с этим никогда не сталкивался. САПР ближе. Вот и подумал про STL.

Ссылка на сообщение
Поделиться на других сайтах

Да, нужно вручную написать алгоритм на фортране (или С).

А цель этой задачи - моделировать перемещающуюся поверхность в газодинамическом пакете.

Вроде, есть решения у программистов компьютерных игр и 3D графики вообще.

Но я с этим никогда не сталкивался. САПР ближе. Вот и подумал про STL.

Давайте упростим вопрос.

Что Вам нужно: из гладкого тела/поверхности сгенеировать формат STL

или из плоских тругольников сгенерировать/построить гладкое тело/поверхность?

Вот никак не пойму вопрос...

А уж перемещать его - это уж вопрос 3-й...

И вообще: есть целая "куча" газодинамических пакетов, в некоторых можно самому строить нужное тело, в некоторых можно импортировать тела, построенные CAD`ax...

Ссылка на сообщение
Поделиться на других сайтах

Нужно из гладкой поверхности сгенерировать STL. Даже формат STL не обязательно. Просто разбить поверхность на элементарные треугольники и запомнить их вершины. Затем треугольники по определенному алгоритму начнут двигаться в поле скоростей. Но это уже вторая задача.

Большинство коммерческих и некоммерческих CFD пакетов часто требуют небольшой или большой доработки. Имеется в виду написание пользовательских функций. Что брать чужой продукт, что свой доморощенный - все равно работа. Это уже личный выбор каждого.

Ссылка на сообщение
Поделиться на других сайтах

Нужно из гладкой поверхности сгенерировать STL. Даже формат STL не обязательно. Просто разбить поверхность на элементарные треугольники и запомнить их вершины. Затем треугольники по определенному алгоритму начнут двигаться в поле скоростей. Но это уже вторая задача.

Большинство коммерческих и некоммерческих CFD пакетов часто требуют небольшой или большой доработки. Имеется в виду написание пользовательских функций. Что брать чужой продукт, что свой доморощенный - все равно работа. Это уже личный выбор каждого.

Нужно из гладкой поверхности сгенерировать STL. Даже формат STL не обязательно. Просто разбить поверхность на элементарные треугольники и запомнить их вершины. Затем треугольники по определенному алгоритму начнут двигаться в поле скоростей. Но это уже вторая задача.

Большинство коммерческих и некоммерческих CFD пакетов часто требуют небольшой или большой доработки. Имеется в виду написание пользовательских функций. Что брать чужой продукт, что свой доморощенный - все равно работа. Это уже личный выбор каждого.

При записи тв. тела в формате STL из SolidWorks`a (в текстовом режиме) - получаем координаты всех вершин треугольников! Только надо определить порядок считывания этих координат. Этот файл имеет свой формат!

Вот как он считывает: грубо говоря, по меридианам или по параллелям или еще как?

Да даже вручную взять 2-3 строки координат из этого файла и уже будет понят порядок "обхода" тв. тела.

Вот выдержка:

solid Деталь2

facet normal -2.227527e-002 -1.386013e-015 9.997519e-001

outer loop

vertex 2.333018e+001 0.000000e+000 4.994417e+001

vertex 2.500000e+001 0.000000e+000 5.000000e+001

vertex 2.500000e+001 8.500000e+001 5.000000e+001

endloop

endfacet

и т..д

Ссылка на сообщение
Поделиться на других сайтах

Вот как он считывает: грубо говоря, по меридианам или по параллелям или еще как?

Наверное, задаваясь допуском, взятым из настроек гонит точку насколько может далеко по U и V вектору, пока ошибка не сравняется с допуском. Ставит точку и так далее.
Ссылка на сообщение
Поделиться на других сайтах

Наверное, задаваясь допуском, взятым из настроек гонит точку насколько может далеко по U и V вектору, пока ошибка не сравняется с допуском. Ставит точку и так далее.

Похоже, так и есть. Потому что (в TEBISе) я могу изменять STL-тело по этим точкам, как мне нужно. И когда увеличиваешь значение допуска, число треугольников становится меньше, то есть как бы дальше продлевает расстояние по вектору.

Ссылка на сообщение
Поделиться на других сайтах

Цитата(ssv22 @ 19.12.08, 21:40)

Вот как он считывает: грубо говоря, по меридианам или по параллелям или еще как?

Наверное, задаваясь допуском, взятым из настроек гонит точку насколько может далеко по U и V вектору, пока ошибка не сравняется с допуском. Ставит точку и так далее.

--------------------

Ну это само собой: ведь получаем плоские треугольники вместо изогнутой поверхности - апроксимация идет в 3-х мерном пространстве!

... гонит точку насколько может далеко по U и V вектору, пока ошибка не сравняется с допуском....

Так для этого допуск и служит!

Но почему "далеко"? В смысле далеко от истинной поверхности? Типа что-то 3-х мерной хорды?

PS. в SW есть какая-то примочка, которая налагает на поверхность или сетку или точки, которые потом можно двигать...

Как в 3D Max`e.

Ссылка на сообщение
Поделиться на других сайтах

Нужен алгоритм генерации STL поверхности на уже имеющемся наборе примитивов (например есть поверхность, описанная плоскостями, сопряженными цилиндрами или другими функциями второго порядка, или облаком точек).

Задача состоит в моделировании с помощью треугольников криволинейной поверхности, форма которой зависит от времени.

Просто поищите по ключам Delanau, Voronoi triangulation, триангуляция Делане

И найдете и описание алгоритмов и готовые программы и библиотеки, которые сможете использовать

На выходе будете иметь сетку из треугольников.

Можете конечно и OpenCASCADE использовать. Но для вашей задачи это будет лишний этап и геморой

Ссылка на сообщение
Поделиться на других сайтах

Уважаемые коллеги!

Спасибо! Обрисовали сразу несколько подходов к решению.

Со своей стороны добавлю, что разработчики 3D графики используют алгоритм Marching Cubes для триангуляции.

Теперь осталось только выбрать наиболее эффективный и легко реализуемый (по возможности) метод.

Получу результаты - поделюсь.

С уважением!

Алексей

Ссылка на сообщение
Поделиться на других сайтах

Если не ошибаюсь в 3D Max`e существует таакой способ преобразования (по-моему та же триангуляция), т.е. рисуем "гладкую" поверхность, а потом ее

превращаем ее в набор треугольников. Вот только как выцапарать данные о вершинах - не помню. По-моему VBA там должен быть, а значит и можно.

Или экспортировать в какой-то формат...

Еще не мешало-бы почитать что-нибудь о Direct-X и OpenGL. Вспоминается мне оттуда определение нормали к грани(фасетки)...

PS. мне кажется, что "Marching Cubes" это какое-то производное от Direct-X и OpenGL.

Хотя я может и ошибаюсь...

Ссылка на сообщение
Поделиться на других сайтах

Но почему "далеко"? В смысле далеко от истинной поверхности? Типа что-то 3-х мерной хорды?

Ну да, именно, пока расстояние от хорды до пов-сти не сравняется с допуском.

Просто поищите по ключам Delanau, Voronoi triangulation, триангуляция Делане. И найдете и описание алгоритмов и готовые программы и библиотеки, которые сможете использовать

Ну вот уже и взрослые советы подоспели)).

Вот только как выцапарать данные о вершинах - не помню.

Ну так сохранить в STL. Или в формате DirectX - он тоже дает инфу о вертексах.
Ссылка на сообщение
Поделиться на других сайтах

Задача состоит в моделировании с помощью треугольников криволинейной поверхности, форма которой зависит от времени.

В Solidworks можно с помощью API интерфейса можно подобное проработать, пример плывущего по волнам кораблика можно посмотреть здесь: <noindex>http://www.mikejwilson.com/solidworks/soli...ks_files-03.htm</noindex>
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • ДОБРЯК
      Нулевых частот может быть любое количество. Вот эта матрица не будет вырождена.    
    • Orchestra2603
      Речь идет о собственных векторах, связанных с нулевым СЗ. Вы же понимаете.
    • ДОБРЯК
      Для сложных систем их может быть и 100 и 200 и 1000...
    • maxx2000
      @Artas28так надо рецепт в массы нести, а то Ванёк ничему не научится
    • Orchestra2603
      Выкидываем не в смыле, что мы ее вырезаем.. Простите мне эту вольность)) Просто там две одинаковые строки. Достаточно рассмотреть только одну. Нет смысла хранить вторую строку в матрице, поскольку она ничего не привносит. Вы можете совершенно формально взять полученный i-й собственный вектор, умножить на матрицу K-lambda_i*M и получиь нулевой вектор.   На самом деле.. Мне прям пришлось прям подумать над аналогией с включением закрепления в статике. И это было полезно и интересно. Так что вам спасибо за "подгон", что называется )) Но все-таки разница есть ...   Вот у вас в статике:   И здесь действительно получается, что если мы зафиксируем, например, положив a=0, то это будет эквивалентно "выкидыванию" 1-го стобца и 2-й строки, и решению уже такой модифицированной невырожденной системы *в данном случае вообще тривиальной). При этом f2 просто станет узловой реакцией и определится как -f1 автоматически: К слову, можно положить любой a, не только нулевой. Результат будет такой же для сил, но прогибы, ясное дело, поменяются.   Но это отличается от нашей задачи на собственные значения. У нас нет внешних сил {f}.  А знaчит и упругие силы [K]{x} в системе должны быть равны нулю. И для нулевой собственной частоты мы по сути ищем такой набор перемещений, при которых в системе отсутствуют упругие силы.  И таких наборов перемещений бесконечно много. Вообще говоря, для трехмерных более сложных систем оказывается, что существует до 6-ти базисных векторов (понятно, что связанных с движениями как твердого целого), и любая линейная комбинация из этих векторов будет решением такой задачи. Но нам не нужно само решение! Нам нужен как раз сам базис пространства решений! Причем, сами вектора в этом базисе нас интересуют с точностью до множителя, ь.е. таких базисов можно напридумывать бесконечно много. Но нам нужен толкьо какой-то один базис, и всего-то. В этой простейшей задачке - это просто один вектор  {1, 1}. Можно взять {2,2} или {e,e} - не имеет значения, нас любой из них строит. И нам этого достаточно.    Обратите внимание, что этот вектор нельзя получить из задачи статики, где {f} ≠ {0}, положив какое-то значение для a, т.е. внедрив какое-то "закрепление" в вашей интерпретации.  Пожтому я убежден, что это другая задача, т дело тут не в закреплениях.   Не понимаю, про какую вы матрицу
    • Viktor2004
      Туда вроде наоборот заносится значение какое-то, но не считывается Смотрю чужие программы, там вроде только 8549 используют. При чем у них в программах циклы поболее моих, которыми я круги чертил O4198 ; #500=#8549 ; IF[ #8549 EQ 0 ] THEN ; #10409=0 ; ENDIF ; IF[ #8549 EQ 134 && #10409 EQ 0 && #10422 NE 0 ] THEN ; #10409=1 ; #10422=FIX[#10422 / 10] ; #10427=1 ; ENDIF ; IF[ #8549 EQ 48 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 0 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 49 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 1 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 50 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 2 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 51 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 3 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 52 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 4 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 53 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 5 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 54 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 6 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 55 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 7 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 56 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 8 ; #10427=1 ; ENDIF ; IF[ #8549 EQ 57 && #10409 EQ 0 ] THEN ; #10409=1 ; #10422=#10422 * 10 + 9 ; #10427=1 ; ENDIF ; IF[ #10422 GT 9999 ] THEN ; #10422=FIX[#10422 / 10] ; ENDIF ; IF[ #500 EQ 249 && #8500 EQ 4170 ] THEN ; #8500=4601 ; M99 ; ENDIF ; IF[ #500 EQ 240 ] THEN ; IF[ #8500 EQ 4174 || #8500 EQ 4173 || #8500 EQ 4177 ] THEN ; #8500=4170 ; M99 ; ENDIF ; IF[ #8500 EQ 4178 ] THEN ; #8500=4170 ; M99 ; ENDIF ; ENDIF ; IF[ #500 EQ 248 && #8500 EQ 4170 && D34.0 NE 0 ] THEN ; #8500=4174 ; M99 ; ENDIF ; IF[ #500 EQ 247 && #8500 EQ 4170 && D30.4 EQ 1 && D29.6 EQ 0 ] THEN ; #8500=4175 ; M99 ; ENDIF ; IF[ #500 EQ 246 && #8500 EQ 4170 && D35.0 EQ 1 && D35.4 EQ 1 ] THEN ; #8500=4178 ; M99 ; ENDIF ; IF[ #8549 EQ 152 && #10409 EQ 0 && #10422 EQ 5656 ] THEN ; #8500=4177 ; M99 ; ENDIF ; M99 ;  
    • nicomed
      Как победить проблему с блокированием сегментов эскиза не знаю. Поэтому пока полумеры... Ввел активацию чертежного листа после разрыва линии. Для разблокирования сегментов после закрытия программы двойным кликом активировать чертежный вид, где надо двигать сегменты эскиза. Добавил настройки. Можно настроить величину генерируемого зазора в  файле options.xml. По толщине и стилю линии, если кто подскажет как прочитать стиль и толщину выбранной кромки ( силуэтной кромки), то тогда можно будет "напосмотреть".   Пару раз натыкался на такой глюк - остается только один сегмент эскиза, грешу на рассинхронизацию работы солида и приложения. EdgeTrim_v3.3.zip
    • si-64
      да, это работает. спасибо. но как то особо не работал со слоями, нужно прямо заморачиваться(
    • nicomed
    • Stanislav
      Фрезеровка и токарка ЧПУ. Территориально Нижний Новгород, отправка в регионы ТК. Фрезеровка Алюминия и его сплавов, Латунь, Текстолиты, Сталь в небольших объемах. Токарка как цветные так и черный металлов и неметаллов. Габариты деталей для фрезеровки порядка 400мм*600мм. Оплата, пока что, наличные или на карту. Чертежи и модели отправлять на почту 0563506@mail.ru там же все согласования и обсуждения.
×
×
  • Создать...