Как сделать изогнутый лист (куб) в OpenSCAD?
Как я могу изогнуть лист (куб)? Я хотел бы контролировать угол изгиба / кривой.
например
куб ([50,50,2]);
2 ответа
Вы можете rotate_extrude()
прямоугольник с параметром angle. Для этого требуется версия openscad 2016.xx или новее, см. Документацию. Необходимо установить снимок разработки, см. Скачать openscad
$fn= 360;
width = 10; // width of rectangle
height = 2; // height of rectangle
r = 50; // radius of the curve
a = 30; // angle of the curve
rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);
выглядит так:
Кривая определяется радиусом и углом. Я думаю, что это более реалистично, использовать другие размеры, такие как длина или dh в этом эскизе
и рассчитать радиус и угол
$fn= 360;
w = 10; // width of rectangle
h = 2; // height of rectangle
l = 25; // length of chord of the curve
dh = 2; // delta height of the curve
module curve(width, height, length, dh) {
// calculate radius and angle
r = ((length/2)*(length/2) - dh*dh)/(2*dh);
a = asin((length/2)/r);
rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);
}
curve(w, h, l, dh);
Я могу сделать это так, но было бы лучше, если бы вы указали изгиб / кривую в #degrees в качестве аргумента функции:
$fn=300;
module oval(w, h, height, center = false) {
scale([1, h/w, 1]) cylinder(h=height, r=w, center=center);
}
module curved(w,l,h) {
difference() {
oval(w,l,h);
translate([0.5,-1,-1]) color("red") oval(w,l+2,h+2);
}
}
curved(10,20,30);
Используя концепцию, используемую a_manthey_67, исправил математику и центрировал (выровнял хорду с осью y) получившийся объект:
module bentCube(width, height, length, dh) {
// calculate radius and angle
r = (length*length + 4*dh*dh)/(8*dh);
a = 2*asin(length/(2*r));
translate([-r,0,0]) rotate([0,0,-a/2])
rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);}
Или, если вам просто нужно что-то фиксированной длины и с определенным углом изгиба, сделайте следующее:
module curve(width, height, length, a) {
if( a > 0 ) {
r = (360 * (length/a)) / (2 * pi);
translate( [-r-height/2,0,0] )
rotate_extrude(angle = a)
translate([r, 0, 0])
square(size = [height, width], center = false);
} else {
translate( [-height/2,0,width] )
rotate( a=270, v=[1,0,0] )
linear_extrude( height = length )
square(size = [height, width], center = false);
}
}
В if (a > 0)
Оператор необходим для исключения, когда угол изгиба равен 0 (что при рисовании криволинейной поверхности приведет к бесконечному радиусу).