176 lines
4.2 KiB
OpenSCAD

//$fn = 50;
module lowerLeg() {
translate([0, 0, -6]) union() {
translate([0, 0, 0]) cylinder(d1=1.5, d2=2.0, h=6);
translate([0, -0.25, 3.75]) scale([1, 1, 2]) sphere(1);
translate([0, 0, 6]) sphere(1);
}
}
module upperLeg() {
translate([0, 0, -6])
intersection() {
union() {
cylinder(d1=2.0, d2=2.75, h=6);
translate([0, 0.05, 3.5]) scale([1.30, 1.50, 4]) sphere(1);
}
cylinder(d1=3, d2=3.75, h=6);
}
}
module leg(footTilt = 0, calfTilt = 0, thighTilt =0) {
rotate([thighTilt, 0, 0])
union() {
upperLeg();
translate([0, 0, -5.75])
rotate([calfTilt, 0, 0])
union() {
lowerLeg();
translate([0, 0, -5.75])
rotate([footTilt, 0, 0])
translate([0, 1, 0])
scale([1, 2, 1]) sphere(1);
}
}
// foot
//translate([0, 1, 0]) rotate([0, 0, 0]) scale([1, 2, 1]) sphere(1);
//translate([0, 0, 0]) lowerLeg();
//translate([0, 0, 8.4]) upperLeg();
}
module upperArm() {
translate([0, 0, -5])
union() {
cylinder(d1=1.4, d2=1.8, h=5);
translate([0, -0.1, 3]) scale([0.85, 1, 2.75]) sphere(1);
translate([0, 0.25, 3]) scale([1.00, 1, 2.25]) sphere(1);
}
}
module lowerArm() {
translate([0, 0, -4.5]) cylinder(d1=1.25, d2=1.4, h=4.5);
translate([0, 0, -1.25]) scale([1, 1, 2.5]) sphere(0.80);
}
module arm(rotation = 0, flexion = 0, abduction = 0, elbowFlexion = 0) {
// shoulder
sphere(0.90);
rotate([flexion, abduction, rotation])
union() {
upperArm();
// elbow
translate([0, 0, -5]) sphere(0.7);
translate([0, 0, -5])
rotate([elbowFlexion, 0, 0])
union() {
lowerArm();
translate([0, 0, -4.5]) scale([1, 0.75, 1.5]) sphere(1);
}
}
}
module person(
// forward/backword, sideways, rotation
torso = [0, 0, 0],
// flexion, knee flexion, ankle flexion, abduction, rotation
leftLeg = [0, 0, 0, 0, 0],
rightLeg = [0, 0, 0, 0, 0],
// flexion, elbow flexion, abduction, rotation
leftArm = [0, 0, -90, 0],
rightArm = [0, 0, 90, 0]
) {
rotate([torso[0], torso[1], torso[2]])
union() {
// helmet
translate([0, 0, 9]) scale([2, 1.75, 2])
intersection() {
sphere(1);
translate([0, 0, 0.6]) cube([2, 2, 1], center=true);
}
// head & neck
translate([0, 0, 9]) scale([1.75, 1.5, 2]) sphere(1);
translate([0, 0, 7]) cylinder(d=1.5, h=2);
// torso
intersection() {
scale([3, 1.75, 1]) cylinder(r1=0.9, r2=1.1, h=7);
translate([0, 0, -0.5]) scale([8, 4, 8]) sphere(1);
}
// backpack
translate([0, -2, 4]) intersection() {
cube([4.5, 2, 6], center=true);
scale([3.5, 2, 3.5]) sphere(1);
}
// arms
translate([-3, 0, 6]) arm(
rotation = leftArm[3],
flexion = leftArm[0],
abduction = leftArm[2],
elbowFlexion = leftArm[1]);
translate([3, 0, 6]) arm(
rotation = rightArm[3],
flexion = rightArm[0],
abduction = rightArm[2],
elbowFlexion = rightArm[1]);
}
// pelvis
translate([0, 0, -0.5]) scale([3, 1.75, 2]) sphere(1);
// legs
translate([-1.5, 0, 0])
rotate([0, leftLeg[3], leftLeg[4]])
leg(
thighTilt = leftLeg[0],
calfTilt = leftLeg[1],
footTilt = leftLeg[2]);
translate([1.5, 0, 0])
rotate([0, rightLeg[3], rightLeg[4]])
leg(
thighTilt = rightLeg[0],
calfTilt = rightLeg[1],
footTilt = rightLeg[2]);
}
module soldier() {
difference() {
union() {
// base
translate([0, 0, 0.5]) cylinder(d=14, h=1, center=true);
// soldier
translate([0, 0, 12.25])
person(
torso = [-10, -3, -5],
leftLeg = [5, -15, -20, 20, 60],
rightLeg = [20, -24, 4, 0, -15],
leftArm = [-20, 100, 0, -30],
rightArm = [20, 130, -10, 45]);
// gun
translate([0, 4, 18])
rotate([-20, -10, -90])
union() {
translate([0, 0, 1]) cylinder(d=0.8, h=12, center=true);
translate([0, 0.4, -2]) cube([0.8, 1, 6], center=true);
translate([0, 0.6, -6]) rotate([10, 0, 0]) cube([0.8, 1.25, 4], center=true);
}
}
translate([0, 0, -0.499]) cylinder(d=14, h=1, center=true);
}
}
soldier();