illumium.org

Главная › Блоги › Блог kayo

Моделируем оптику в… FreeCAD

kayo — Сб, 12/04/2014 - 20:37

Давно приглядываюсь к FreeCAD, но каждый раз при попытке серьёзно использовать этот пакет, натыкаюсь на разного рода недостатки и ограничения. Благо проект ещё довольно молод, и рано или поздно будет доведён до промышленного уровня. А пока будем продолжать говнокодить механику в OpenSCAD… или нет? Уже сейчас в FreeCAD есть весьма полезный инструментарий, который не имеет аналогов в лице других FOSS решений. Один из таких: режим эскиза. В этой статье мы применим его самым неожиданным из возможных способов… или самым, как раз таки, ожидаемым?

В общем, пристегнулись и…

«поехали!»

© простой советский парень

Режим эскиза в FreeCAD

Что же такое режим эскиза, и с чем его едят. Понятно, что технический эскиз, это не художественный набросок, нас не столько интересуют пропорции, сколько ограничения. FreeCAD в этом режиме позволяет нам работать с плоскими примитивами путём связывания их между собой ограничениями нескольких типов. Это могут быть как условные, так и размерные ограничения.

Набор примитивов весьма невелик:

  • Точка
  • Отрезок (включает две точки и задаёт прямую)
  • Дуга и окружность

Примеры условных ограничений:

  • Точка лежит на прямой (заданной отрезком)
  • Прямая, заданная отрезком, касается окружности (или дуги)
  • Точки совпадают
  • Прямые, заданные отрезками, параллельны
  • Отрезки равны
  • Точки симметричны относительно прямой, заданной отрезком

Примеры размерных ограничений:

  • Фиксированный радиус дуги или окружности
  • Фиксированная длина отрезка
  • Фиксированный угол между прямыми, заданными отрезками

Может показаться, что примитивов не достаточно, однако сложные примитивы в виде многоугольников (в том числе правильных) создаются из простых путём связывания их ограничениями. Например, чтобы создать гексагон, правильный шестигранник, можно создать цепочку связанных отрезков, соседние точки которых совпадают, затем сделать отрезки равными и задать углы между некоторыми из них. Вариантов может быть несколько, но выбирать надо тот, который задействует меньше всего ограничений.

Важная особенность режима эскиза в том, что примитивы можно использовать как по прямому назначению, для создания геометрии, так и для помощи в построениях. Эта фитча важна, и значение её трудно переоценить: изложенное в этой статье без вспомогательных построений сделать не получится.

Стоит отметить , что в работе с ограничениями не всё так просто и гладко, как хотелось бы. Во первых, по умолчанию при создании примитивов некоторые ограничения устанавливаются автоматически. Это не всегда удобно, но в случае чего эту особенность можно временно отключить. Во-вторых, в любой момент могут возникнуть противоречия между ограничениями. Решатель иногда задумывается, прежде чем выяснит это, а когда выяснит, показывает какие ограничения мешают поддерживать эскиз в валидном состоянии. В таких случаях одно из них, а то и несколько необходимо будет убрать.

Моделируем зеркала

Физика света, как мы знаем, вещь не сложная. В общем случае угол отражения равен углу падения, и всё, что нам нужно знать. Однако, нам может понадобиться интерактивно моделировать этот процесс.

Задача будет такая:

  • Есть сканер, лампа которого светит снизу на сканируемую плоскость
  • Есть слайд 35мм, который надо просветить насквозь сверху
  • Требуется получить зеркала правильных размеров и расположения так, чтобы свет от подсветки проецировался на слайд, равномерно освещая его поверхность
  • Сила света на единицу поверхности должна быть выше, чем прямолинейно излученная лампой подсветки, то есть нам понадобится не одно, а несколько зеркал

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

Подготовка

Итак, стартуем FreeCAD (на момент написания статьи у меня была установлена версия 0.14), переключаемся в режим создания эскизов (Sketcher), создаём новый эскиз в плоскости XZ. Для начала наметим источник света (портал, через который светит лампа) и приёмник (участок слайда). Я отключил автоматические условия, чтобы иметь полный контроль над процессом. Итак, чтобы всё было понятно, пойдём по шагам:

  1. Создаём отрезок
  2. Кладём его на плоскость: привязываем концы отрезка к прямой плоскости
  3. Поскольку мы знаем, что эффективная ширина кадра 35-миллиметровой плёнки равна 24 миллиметра, устанавливаем отрезку соответствующую длину
  4. Всё хорошо, но отрезок не по середине: выбираем концы и вертикальную прямую, устанавливаем ограничение симметрии

Можно заметить, что отрезок стал зелененьким, это значит, что он фактически зафиксирован:

fc_1.png

Продолжая в том же духе, добавляем портал прохождения света:

  1. Создаём отрезок справа, кладём его на плоскость
  2. Поскольку мы знаем пределы области печати, устанавливаем расстояние от правого конца отрезка до начала координат в 100 мм
  3. Левый конец закрепляем относительно границы слайда на расстоянии 16 мм (35-24+5)

Должно выглядеть как-то так:

fc_2.png

Добавляем «зеркало»

Добавим отрезок, который будет представлять собой зеркало.

А теперь пора начать делать вспомогательные построения:

  1. Создаём два вертикальных отрезка, которые будут представлять собой границы области прохождения светового потока
  2. Переключаем отрезки в режим вспомогательных линий
  3. Устанавливаем между ними ограничение параллельности
  4. Привязываем нижние концы отрезков к концам отрезка слайда
  5. Привязываем верхние концы отрезка к концам отрезка зеркала

Должно получиться что-то типа:

fc_3.png

Смещаем «зеркало» вправо в область над порталом подсветки для удобства дальнейшей работы. Далее:

  1. Добавляем ещё два параллельных «луча» в режиме вспомогательных линий
  2. Делаем один из лучей строго вертикальным
  3. Верхние их концы привязываем к границам зеркала
  4. Нижние — кладём на плоскость портала

Вот как это должно выглядеть:

fc_4.png

Скучно, не правда ли? Можно перемещать зеркало, но лучи «работают не правильно». Но это только пока.

«Прикручиваем» оптику

Настало время для маленькой цифровой магии. Мы должны заставить световой поток вести себя как свет, то есть угол отражения сделать равным углу падения. Однако, нас ожидает разочарование, ограничения равности углов в FreeCAD-е нет. Придётся включать мозги и выкручиваться, в этом то и состоит суть маленькой цифровой магии:

  1. Добавляем отрезок некоторой фиксированной длины
  2. Делаем его выходящим из точки отражения одного из «лучей»
  3. Устанавливаем ему ограничение перпендикулярности плоскости «зеркала»
  4. Размещаем по одной точке на падающем и отраженном «луче»
  5. Выделяем эти точки и созданный отрезок и делаем их симметричными относительно него

Вот что должно получиться:

fc_5.png

Теперь мы можем наблюдать как соблюдается оптическое правило: перемещая «зеркало», перемещаются «лучи», и ориентация «зеркала» и наоборот, перемещая «лучи», перемещается «зеркало» и меняется ориентация:

fc_6.png

fc_7.png

Как видно меняется не только ориентация и расположение зеркала, но и его размер, так, чтобы наиболее оптимально соответствовать прохождению светового потока. Поскольку лучи параллельны, то нам вполне достаточно всех этих ограничений, которые мы уже установили.

Чудим дальше

Далее таким же макаром можно создать ещё зеркал, если нужно, получив целую систему, вроде такой:

fc_8.png

Уж у кого на что фантазии хватит. Я привязал крайние лучи к границам портала подсветки, так чтобы единственным параметром, которым я мог бы рулить, была бы высота системы зеркал над плоскостью, а их размер и ориентация подстраивались бы автоматически.

Заключение

Когда получилось всё это проделать, я подумал, что наконец-то FreeCAD оказался практически полезен. Пусть данный инструментарий применён не совсем обычно (а может и вполне традиционно), но я не представляю, чем бы его можно было заменить, исключая ручное подсчитывание углов и рисование.

Желаю проекту FreeCAD бурного развития: побольше фитч, поменьше багов ><

ВложениеРазмер
design1.fcstd3.27 КБ
design5.fcstd4.78 КБ
  • freecad
  • зеркала
  • оптика
  • Бортовой журнал Иллюмиума

Отправить комментарий

Содержимое этого поля является приватным и не будет отображаться публично.
  • Доступные HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".

Подробнее о форматировании

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
   __     _____  ____    ____           _ 
/ /_ |__ / | _ \ |___ \ __ __ | |
| '_ \ / / | |_) | __) | \ \/ / | |
| (_) | / /_ | _ < / __/ > < | |
\___/ /____| |_| \_\ |_____| /_/\_\ |_|
Введите код, изображенный в стиле ASCII-арт.
RSS-материал

Навигация

  • Подшивки
  • Фотоальбомы

«Иллюмиум» на якоре.

Работает на Drupal, система с открытым исходным кодом.

(L) 2010, Illumium.Org. All rights reversed ^_~