initial negative spar
openscad does not support 3d shape interpolation aside from hulls. oops.
This commit is contained in:
parent
015cbee1e6
commit
cd3580477a
2 changed files with 59 additions and 4 deletions
|
@ -2,12 +2,12 @@
|
||||||
/// the native unit is mm
|
/// the native unit is mm
|
||||||
|
|
||||||
const IN2MM: f32 = 25.4;
|
const IN2MM: f32 = 25.4;
|
||||||
pub const CHORD: f32 = 5.0 * IN2MM;
|
pub const CHORD: f32 = 7.0 * IN2MM;
|
||||||
pub const WING_TAPER: f32 = 0.6;
|
pub const WING_TAPER: f32 = 0.6;
|
||||||
pub const WINGSPAN: f32 = 45.0 * IN2MM;
|
pub const WINGSPAN: f32 = 45.0 * IN2MM;
|
||||||
pub const LENGTH: f32 = 30.0*IN2MM;
|
pub const LENGTH: f32 = 30.0*IN2MM;
|
||||||
/// strut count in the main wing
|
/// strut count in the main wing
|
||||||
pub const STRUTS: usize = 20;
|
pub const STRUTS: usize = 12;
|
||||||
pub const CARDBOARD_WIDTH: f32 = 2.4;
|
pub const CARDBOARD_WIDTH: f32 = 2.4;
|
||||||
/// length of each side of the triangular spar
|
/// length of each side of the triangular spar
|
||||||
pub const SPAR_SIDE_WIDTH: f32 = 0.75 * IN2MM;
|
pub const SPAR_SIDE_WIDTH: f32 = 0.75 * IN2MM;
|
||||||
|
@ -19,6 +19,8 @@ pub const RUDDER_CHORD: f32 = 3.0 *IN2MM;
|
||||||
pub const RUDDER_TAPER: f32 = 0.7;
|
pub const RUDDER_TAPER: f32 = 0.7;
|
||||||
pub const RUDDER_STRUTS: usize = 3;
|
pub const RUDDER_STRUTS: usize = 3;
|
||||||
pub const ELEVATOR_HEIGHT: f32 = 8.0 *IN2MM;
|
pub const ELEVATOR_HEIGHT: f32 = 8.0 *IN2MM;
|
||||||
pub const ELEVATOR_CHORD: f32 = 3.0 *IN2MM;
|
pub const ELEVATOR_CHORD: f32 = 5.0 *IN2MM;
|
||||||
pub const ELEVATOR_TAPER: f32 = 0.7;
|
pub const ELEVATOR_TAPER: f32 = 0.7;
|
||||||
pub const ELEVATOR_STRUTS: usize = 3;
|
pub const ELEVATOR_STRUTS: usize = 4;
|
||||||
|
pub const STOCK_HEIGHT: f32 = 25.0 *IN2MM;
|
||||||
|
pub const STOCK_WIDTH: f32 = 36.0 *IN2MM;
|
||||||
|
|
53
src/main.rs
53
src/main.rs
|
@ -37,13 +37,16 @@ fn main() {
|
||||||
// struts
|
// struts
|
||||||
for port in [true,false] {
|
for port in [true,false] {
|
||||||
let mut wing = wing(&wing_airfoil, STRUTS/2, WINGSPAN/2.0, CHORD, CHORD * WING_TAPER, SparType::Top);
|
let mut wing = wing(&wing_airfoil, STRUTS/2, WINGSPAN/2.0, CHORD, CHORD * WING_TAPER, SparType::Top);
|
||||||
|
let top_spar = topwing_spar(&wing_airfoil, STRUTS/2, WINGSPAN/2.0, CHORD, CHORD * WING_TAPER);
|
||||||
wing = scad!(Translate(vec3(0.0, FUSELAGE_GAP,0.0)); wing);
|
wing = scad!(Translate(vec3(0.0, FUSELAGE_GAP,0.0)); wing);
|
||||||
|
wing.add_child(top_spar);
|
||||||
if port {
|
if port {
|
||||||
wing = scad!(Mirror(vec3(0.0, 1.0, 0.0)); wing);
|
wing = scad!(Mirror(vec3(0.0, 1.0, 0.0)); wing);
|
||||||
}
|
}
|
||||||
wing_transform.add_child(wing);
|
wing_transform.add_child(wing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// spars
|
// spars
|
||||||
|
|
||||||
// "fuselage"
|
// "fuselage"
|
||||||
|
@ -116,6 +119,10 @@ fn strut(airfoil: &Airfoil, chord: f32, width: f32, spar: &SparType) -> ScadObje
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extrude_strut(shape, strut_hole, width, chord)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn extrude_strut(shape: ScadObject, strut_hole: ScadObject, width: f32, chord: f32) -> ScadObject {
|
||||||
let mut strut_shape = scad!(Difference);
|
let mut strut_shape = scad!(Difference);
|
||||||
strut_shape.add_child(shape);
|
strut_shape.add_child(shape);
|
||||||
strut_shape.add_child(strut_hole);
|
strut_shape.add_child(strut_hole);
|
||||||
|
@ -210,6 +217,52 @@ fn wing(aerofoil: &Airfoil, struts: usize, length: f32, chord: f32, taper: f32,
|
||||||
wing
|
wing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn topwing_spar(aerofoil: &Airfoil, struts: usize, length: f32, chord: f32, taper: f32) -> ScadObject {
|
||||||
|
let mut wing = scad!(Translate(vec3(0.0,0.0,0.0)));
|
||||||
|
|
||||||
|
let mut last_segment : Option<ScadObject> = None;
|
||||||
|
let mut pre_vis = scad!(Union);
|
||||||
|
|
||||||
|
// struts
|
||||||
|
for strut_idx in 0..struts + 1 {
|
||||||
|
|
||||||
|
let gap = length/struts as f32;
|
||||||
|
|
||||||
|
let chord = lerp(chord, taper, strut_idx as f32 / struts as f32);
|
||||||
|
|
||||||
|
let spacing = strut_idx as f32 * gap;
|
||||||
|
|
||||||
|
let shape = topspar_negative(&aerofoil, chord, 0.1..0.6);
|
||||||
|
let extruded = extrude_strut(shape.clone(), scad!(Union), CARDBOARD_WIDTH, chord);
|
||||||
|
|
||||||
|
let mut transform = scad!(Translate(vec3(0.0, spacing ,0.0)));
|
||||||
|
transform.add_child(extruded);
|
||||||
|
|
||||||
|
|
||||||
|
// in betweens
|
||||||
|
if let Some(last) = last_segment {
|
||||||
|
let mut hull = scad!(Hull);
|
||||||
|
hull.add_child(last);
|
||||||
|
hull.add_child(shape.clone());
|
||||||
|
|
||||||
|
let unit: Vector3<f32> = Vector3::new(1.0, 1.0, 1.0);
|
||||||
|
hull = scad!(Scale(unit * chord); hull);
|
||||||
|
|
||||||
|
hull = scad!(Rotate(90.0, vec3(1.0, 0.0, 0.0)); hull);
|
||||||
|
|
||||||
|
transform.add_child(hull);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_vis.add_child(transform);
|
||||||
|
|
||||||
|
last_segment = Some(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
wing.add_child(pre_vis);
|
||||||
|
|
||||||
|
wing
|
||||||
|
}
|
||||||
|
|
||||||
pub fn points_in_range(input: &Vec<Point>, range: Range<f32>) -> Vec<Point> {
|
pub fn points_in_range(input: &Vec<Point>, range: Range<f32>) -> Vec<Point> {
|
||||||
let mut last_point: Option<Point> = None;
|
let mut last_point: Option<Point> = None;
|
||||||
let mut distance: f32 = 0.0;
|
let mut distance: f32 = 0.0;
|
||||||
|
|
Loading…
Reference in a new issue