--- /dev/null
+infty = 100;
+eps = 0.01;
+
+center_l = 16;
+foam_w = 3;
+center_thick = 1.5;
+side_thick = 1.0;
+
+body_w = center_l + 2*9;
+front_l = 5;
+rear_l = 8;
+
+side_angle = 40; // smaller is narrower part (angle from the direction of flight)
+
+difference() {
+ // main body
+ translate([-foam_w/2-side_thick, -body_w/2, -rear_l-center_thick])
+ cube([foam_w + 2*side_thick, body_w, rear_l + center_thick + front_l]);
+ // front slot
+ translate([-foam_w/2, -body_w/2-eps, 0])
+ cube([foam_w, body_w+2*eps, front_l + eps]);
+ // inner slanted sides
+ for(y = [-1, 1]) scale([1, y, 1])
+ translate([0, center_l/2, 0])
+ rotate([side_angle, 0, 0])
+ translate([-foam_w/2, 0, -infty/2])
+ cube([foam_w, infty, infty]);
+ // outer hole for rudder
+ intersection() {
+ hull() for (y = [-1:1]) scale([1, y, 1]) {
+ translate([0, center_l/2, 0])
+ rotate([side_angle, 0, 0])
+ translate([-infty/2, -center_thick, -infty])
+ cube([infty, eps, infty]);
+ }
+ translate([-infty/2, -infty/2, -infty-center_thick])
+ cube(infty);
+ }
+ // debug
+ // translate([-infty, -infty/2, -infty/2])
+ // cube(infty);
+}