Add skull faceplate/grille raised over the speaker opening
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
<!-- Skull: "death-skull" by sbed, from game-icons.net - CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/). Background rect removed. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#fff" d="M255.997 16.004c-120 0-239.997 60-239.997 149.998C16 226.002 61 256 61 316c0 45-15 45-15 75 0 14.998 48.01 32.002 89.998 44.998v60h239.997v-60s90.567-27.957 90-45c-.933-27.947-15-30-15-74.998 0-30 45.642-91.42 44.998-149.998 0-90-119.998-149.998-239.996-149.998zm-90 179.997c33.137 0 60 26.864 60 60 0 33.136-26.863 60-60 60C132.863 316 106 289.136 106 256c0-33.136 26.862-60 59.998-60zm179.998 0c33.136 0 60 26.864 60 60 0 33.136-26.864 60-60 60-33.136 0-60-26.864-60-60 0-33.136 26.864-60 60-60zm-89.998 105c15 0 45 60 45 75 0 29.998 0 29.998-15 29.998h-60c-15 0-15 0-15-30 0-15 30-74.998 45-74.998z"/></svg>
|
||||
|
After Width: | Height: | Size: 837 B |
@@ -103,5 +103,66 @@ module hookBaseInside()
|
||||
speakerRetainer();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Skull faceplate / grille
|
||||
// A round faceplate, raised proud of the front face, that fully
|
||||
// overlaps the 45mm speaker opening and fuses to the solid front
|
||||
// wall around it. A skull face is cut through it as the speaker
|
||||
// grille - eye sockets and nasal opening come straight from the
|
||||
// icon, plus a row of added tooth slots in the jaw.
|
||||
// skull.svg: "death-skull" by sbed / game-icons.net - CC BY 3.0
|
||||
// https://game-icons.net/1x1/sbed/death-skull.html
|
||||
//---------------------------------------------------------------
|
||||
plateDia = 50; // faceplate diameter (> 45mm opening -> fused rim)
|
||||
plateRaise = 2.6; // mm proud of the front face
|
||||
plateEmbed = 1.5; // mm the plate sinks into the front wall (weld)
|
||||
skullFaceW = 46; // skull width across the plate
|
||||
skullMaskD = 44; // opened-up disc around the skull -> the grille voids
|
||||
frontOuterX = shellInsideLength + 2*wallThickness; // X of the outer front face
|
||||
speakerYc = 27; // speaker opening centre (Y)
|
||||
speakerZc = 28.6; // speaker opening centre (Z)
|
||||
|
||||
// skull.svg imports at ~180.6mm wide (512-unit viewBox at 72dpi)
|
||||
skullImportW = 180.6;
|
||||
|
||||
module skullArt() { import("skull.svg", center = true); }
|
||||
|
||||
// The faceplate is a solid disc. The grille is the skull's negative
|
||||
// space: inside a centre disc, everything that is NOT skull bone is
|
||||
// opened up - eye sockets, nasal opening and the crescent gaps around
|
||||
// the cranium and jaw. The bone itself stays as plate material, so the
|
||||
// disc is never cut through and the skull reads by its voids.
|
||||
module grille2D()
|
||||
{
|
||||
difference()
|
||||
{
|
||||
circle(d = plateDia, $fn = 160);
|
||||
difference()
|
||||
{
|
||||
circle(d = skullMaskD, $fn = 150);
|
||||
scale(skullFaceW / skullImportW) skullArt();
|
||||
}
|
||||
// teeth: a row of slots cut into the jaw for extra grille area
|
||||
for (i = [-2 : 2])
|
||||
translate([i * 4.4, -15.5]) square([2.2, 7], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
module skullFaceplate()
|
||||
{
|
||||
// hookBaseOutside() shares the inner-corner origin:
|
||||
// global = hookCoord + [wallThickness, wallThickness, basePlaneThickness]
|
||||
translate([-wallThickness, -wallThickness, -basePlaneThickness])
|
||||
translate([frontOuterX - plateEmbed, speakerYc, speakerZc])
|
||||
rotate([90, 0, 90]) // 2D x->Y, 2D y->Z, extrude->+X
|
||||
linear_extrude(plateRaise + plateEmbed)
|
||||
grille2D();
|
||||
}
|
||||
|
||||
module hookBaseOutside()
|
||||
{
|
||||
skullFaceplate();
|
||||
}
|
||||
|
||||
showOrientation = true;
|
||||
YAPPgenerate();
|
||||
|
||||
+27067
-9959
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user