From 6687b4cafcbabcecd28e8a36c1bb409bd9294815 Mon Sep 17 00:00:00 2001 From: Garth Minette Date: Mon, 19 Apr 2021 14:55:50 -0700 Subject: [PATCH] Fixed bevel_gear() anchoring. --- gears.scad | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/gears.scad b/gears.scad index 52ea9bd..aea28db 100644 --- a/gears.scad +++ b/gears.scad @@ -900,7 +900,7 @@ function bevel_gear( teeth = 20, face_width = 10, pitch_angle = 45, - mate_teeth = undef, + mate_teeth, hide = 0, pressure_angle = 20, clearance = undef, @@ -908,7 +908,7 @@ function bevel_gear( cutter_radius = 30, spiral_angle = 35, left_handed = false, - slices = 1, + slices = 5, interior = false, mod, anchor = "pitchbase", @@ -921,7 +921,7 @@ function bevel_gear( pitch_angle = is_undef(mate_teeth)? pitch_angle : atan(teeth/mate_teeth), pr = pitch_radius(pitch, teeth), rr = root_radius(pitch, teeth, clearance, interior), - pitchoff = (pr-rr) * cos(pitch_angle), + pitchoff = (pr-rr) * sin(pitch_angle), ocone_rad = opp_ang_to_hyp(pr, pitch_angle), icone_rad = ocone_rad - face_width, cutter_radius = cutter_radius==0? 1000 : cutter_radius, @@ -932,9 +932,6 @@ function bevel_gear( radcpang = vang(radcp), sang = radcpang - (180-angC1), eang = radcpang - (180-angC2), - slice_us = [for (i=[0:1:slices]) i/slices], - apts = [for (u=slice_us) radcp + polar_to_xy(cutter_radius, lerp(sang,eang,u))], - polars = [for (p=apts) [vang(p)-90, norm(p)]], profile = gear_tooth_profile( pitch = pitch, teeth = teeth, @@ -946,12 +943,16 @@ function bevel_gear( center = true ), verts1 = [ - for (polar=polars) [ + for (v = lerpn(0,1,slices+1)) let( + p = radcp + polar_to_xy(cutter_radius, lerp(sang,eang,v)), + ang = vang(p)-90, + dist = norm(p) + ) [ let( - u = polar.y / ocone_rad, + u = dist / ocone_rad, m = up((1-u) * pr / tan(pitch_angle)) * up(pitchoff) * - zrot(polar.x/sin(pitch_angle)) * + zrot(ang/sin(pitch_angle)) * back(u * pr) * xrot(pitch_angle) * scale(u) @@ -960,8 +961,11 @@ function bevel_gear( each apply(xflip() * zrot(360*tooth/teeth) * m, path3d(profile)) ] ], - thickness = abs(verts1[0][0].z - last(verts1)[0].z), - vertices = [for (x=verts1) down(thickness/2, p=reverse(x))], + botz = verts1[0][0].z, + topz = last(verts1)[0].z, + thickness = abs(topz - botz), + cpz = (topz + botz) / 2, + vertices = [for (x=verts1) reverse(x)], sides_vnf = vnf_vertex_array(vertices, caps=false, col_wrap=true, reverse=true), top_verts = last(vertices), bot_verts = vertices[0], @@ -988,7 +992,8 @@ function bevel_gear( ], sides_vnf ]), - vnf = left_handed? vnf1 : xflip(p=vnf1), + lvnf = left_handed? vnf1 : xflip(p=vnf1), + vnf = down(cpz, p=lvnf), anchors = [ anchorpt("pitchbase", [0,0,pitchoff-thickness/2]), anchorpt("flattop", [0,0,thickness/2]), @@ -998,8 +1003,8 @@ function bevel_gear( module bevel_gear( - pitch = 3, - teeth = 11, + pitch = 5, + teeth = 20, face_width = 10, pitch_angle = 45, mate_teeth, @@ -1011,7 +1016,7 @@ module bevel_gear( cutter_radius = 30, spiral_angle = 35, left_handed = false, - slices = 1, + slices = 5, interior = false, mod, anchor = "pitchbase", @@ -1024,8 +1029,7 @@ module bevel_gear( pr = pitch_radius(pitch, teeth); ipr = pr - face_width*sin(pitch_angle); rr = root_radius(pitch, teeth, clearance, interior); - pitchoff = (pr-rr) * cos(pitch_angle); - thickness = face_width * cos(pitch_angle); + pitchoff = (pr-rr) * sin(pitch_angle); vnf = bevel_gear( pitch = pitch, teeth = teeth, @@ -1042,6 +1046,8 @@ module bevel_gear( interior = interior, anchor=CENTER ); + axis_zs = [for (p=vnf[0]) if(norm(point2d(p)) < EPSILON) p.z]; + thickness = max(axis_zs) - min(axis_zs); anchors = [ anchorpt("pitchbase", [0,0,pitchoff-thickness/2]), anchorpt("flattop", [0,0,thickness/2]), @@ -1288,7 +1294,7 @@ function worm( apply(zrot(a)*up(z), path3d(cross_sect)) ], rprofiles = [ for (prof=profiles) reverse(prof) ], - vnf1 = vnf_vertex_array(rprofiles, caps=true, col_wrap=true, style="quincunx"), + vnf1 = vnf_vertex_array(rprofiles, caps=true, col_wrap=true, style="min_edge"), vnf = left_handed? xflip(p=vnf1) : vnf1 ) reorient(anchor,spin,orient, d=d, l=l, p=vnf); @@ -1445,7 +1451,7 @@ function worm_gear( [gear_pts, ((i+1)%teeth)*face_pts, (i+1)*face_pts-1] ] ], - sides_vnf = vnf_vertex_array(profiles, caps=false, col_wrap=true, style="quincunx"), + sides_vnf = vnf_vertex_array(profiles, caps=false, col_wrap=true, style="min_edge"), vnf1 = vnf_merge([ [ [each top_verts, [0,0,top_verts[0].z]],