До сих пор наше моделирование заключалось в простом назначении размеров нужным примитивам. Например, чтобы изобразить модель карамельки на палочке (пита Чупа-чупс) достаточно написать такой код:
//Палочка
color([1,1,1,1]) translate([0,0,50]) cylinder(100, 2, 3, true, $fn=50);
//Леденец
color([0.8,0.1,0.1, 0.5]) translate([0,0,100]) sphere(r=20, $fn=100);
Простой код, всего 2 объекта и всё вроде неплохо, но если изменить длину палочки, например до 200 мм, то картина станет такой:
Теперь, чтобы модель стала выглядеть так как выглядела раньше потребуется дополнительно настроить:
смещение палочки вверх;
толщину палочки (если нам важны её исходные пропорции)
положение шарика-леденца (поднять выше)
диаметр шарика-леденца (увеличить пропорционально палочке)
Иными словами придётся дополнительно переписать весь код, исправив от 4 до 8 разных цифр. Это не очень страшно если модель простая или изменения в будущем маловероятны, но что если всё же менять придётся!?
смещение палочки вверх;
толщину палочки (если нам важны её исходные пропорции)
положение шарика-леденца (поднять выше)
диаметр шарика-леденца (увеличить пропорционально палочке)
Тогда на помощь приходит параметрическое программирование.
Как понятно из названия, всё моделирование будет опираться на некоторые параметры, роль которых выполняют переменные. Поэтому теперь мы задаём размеры палочки от леденца не просто цифрами, а используя переменные. Это может выглядеть так:
dlina=100; //Длина палочки
rP=3; // Радиус палочки
cylinder(dlina, rP, rP, true, $fn=50); //Рисуем палочку
На первый взгляд ничего особенного, только дополнительная писанина, но теперь мы продолжим и зададим смещение палочки вверх (чтобы начало координат было не в середине палочки а в её основании) не просто цифрой, а выражением через имеющиеся параметры. Если присмотреться, то становится понятным, что поднять палочку надо на половину её высоты то есть на величину dlina/2 . Сделаем это:
dlina=100; //Длина палочки
rP=3; // Радиус палочки
color([1,1,1,1]) //Задаём цвет палочки
translate([0,0,dlina/2]) //Сдвигаем палочку вверх
cylinder(dlina, rP, rP, true, $fn=50); //Рисуем палочку
Прелесть такой записи в том, что сейчас можно просто задавать нужные размеры палочки и она сама будет перемещаться так, что нижним основанием всегда будет находиться в начале системы координат.
Теперь прибавим сюда леденец, но зададим его параметры так же через переменные. Заметим что его радиус был 20 мм в то время как длина палочки была 100 мм. Теперь если мы увеличи длину палочки в 2 раза, то и радиус леденца должен вырасти тоже в 2 раза. Чтобы это было так - привяжем радиус леденца к длине палочки. Исходя из первоначальных размеров видно что радиус леденца в 100/20=5 раз меньше чем длина палочки. Значит радиус леденца равен dlina/5 . Находится леденец своим центром на верхнем краю палочки, а значит смещён относительно начала координат вверх на длину палочки то есть на dlina . Запишем это в коде:
dlina=100; //Длина палочки
rP=3; // Радиус палочки
rL=dlina/5; //Высчитываем радиус леденца через длину палочки
color([1,1,1,1]) //Задаём цвет палочки
translate([0,0,dlina/2]) //Сдвигаем палочку вверх
cylinder(dlina, rP, rP, true, $fn=50); //Рисуем палочку
color([0.8,0.1,0.1, 0.5]) //Задаём цвет леденца
translate([0,0,dlina]) //Сдвигаем леденец вверх
sphere(r=rL, $fn=100); //Рисуем леденец
Теперь при изменении длины палочки происходит автоматический пересчёт всех нужных параметров и нам больше не требуется десятки раз изменять и исправлять весь код при этом.
Создайте параллелепипед с квадратным основанием. Высота параллелепипеда всегда должна быть в 3 раза больше длины стороны квадрата основания. Примечание: один параметр будет определять длину стороны квадрата основания, а через него будет задана высота основания.
2. Создайте 2 куба разных цветов, один из которых стоИт на другом и при этом длина его рёбер в 2 раза меньше того, что снизу . Создайте один параметр – длина ребра нижнего куба, остальные размеры и положения задайте через него.
3. Постройте модель гантели. У неё должно быть 2 параметра: первый - длина рукояти, второй - размер грузов гантели. Подробная инструкция по изготовлению гантели находится тут.