Я пытаюсь создать веерный канал в opencad, сплющивая воздуховод с круглого на овальный. Есть ли способ сделать это в opencad? Если нет, есть ли другой программный способ создания 3D-модели такого типа?
Спасибо, Деннис.
Я пытаюсь создать веерный канал в opencad, сплющивая воздуховод с круглого на овальный. Есть ли способ сделать это в opencad? Если нет, есть ли другой программный способ создания 3D-модели такого типа?
Спасибо, Деннис.
Предполагая, что под «овалом» вы подразумеваете эллипс, тогда следующее создает сплошное сужение от круга к эллипсу:
Delta=0.01;
module connector (height,radius,eccentricity) {
hull() {
linear_extrude(height=Delta)
circle(r=radius);
translate([0,0,height - Delta])
linear_extrude(height=Delta)
scale([1,eccentricity])
circle(r=radius);
}
}
connector(20,6,0.6);
Вы можете сделать трубку, вычитая меньшую версию:
module tube(height, radius, eccentricity=1, thickness) {
difference() {
connector(height,radius,eccentricity);
translate([0,0,-(Delta+thickness)])
connector(height + 2* (Delta +thickness) ,radius-thickness, eccentricity);
}
}
tube(20,8,0.6,2);
но толщина стенки будет неравномерной. Чтобы сделать однородную стену, используйте minkowski, чтобы добавить стену:
module tube(height, radius, eccentricity=1, thickness) {
difference() {
minkowski() {
connector(height,radius,eccentricity);
cylinder(height=height,r=thickness);
}
translate([0,0,-(Delta+thickness)])
connector(height + 2* (Delta +thickness) ,radius, eccentricity);
}
}
tube(20,8,0.6,2);
Есть еще один способ, используя параметр «масштаб» в linear_extrude(). Он «масштабирует 2D-форму на это значение по высоте экструзии. Масштаб может быть скалярным или векторным» (Документация). Используя вектор с масштабным коэффициентом x и y, вы получаете желаемую модификацию:
d = 2; // height of ellipsoid, diameter of bottom circle
t = 0.25; // wall thickness
w = 4; // width of ellipsoid
l = 10; // length of extrusion
module ellipsoid(diameter, width, height) {
linear_extrude(height = height, scale = [width/diameter,1]) circle(d = diameter);
}
difference() {
ellipsoid(d,w,l);
ellipsoid(d-2*t,w-2*t,l);
}
Мне нравится ответ Криса Уоллеса, но в Minkwoski была ошибка, она должна быть h=Delta
.
module tube(height, radius, eccentricity=1, thickness) {
difference() {
minkowski() {
connector(height,radius,eccentricity);
cylinder(h=Delta,r=thickness);
}
translate([0,0,-(Delta+thickness)])
connector(height + 2* (Delta +thickness) ,radius, eccentricity);
}
}
tube(20,8,0.6,2);
Я не знаю, как сделать это напрямую, но могу представить, как можно приблизиться к этому с помощью ряда сложенных друг на друга срезов.
Начните с круга и создайте цикл, который плавно изменяет коэффициент масштабирования с круга на овал по мере добавления фрагментов в стопку. Это даст вам ступенчатую поверхность. Если это для приложения 3D-печати, если вы сделаете толщину среза такой же, как высота слоя, вы можете даже не заметить.