Note: I made involute gear intermeshing demo for blender by cutting out everything from the source code that was not relevant. If you are looking for how to model intermeshing involute gears, in blender or something else, then this should prove very useful. And this includes how to get the two gears to intermmesh together correctly which is normally just left to manual adjustments rather then by calculation. Check the theory on this website if you want to understand more about how it works. You will notice that a lot of the difficult stuff that you normally find on the subject of involute gearing is avoided, as it is not needed. A lot of that was very useful in the past for economically producing gears, but with computer animations and 3D printing, it just gets in the way. You can find this version of the blender source code here. See the video here: https://youtu.be/VjP2MRtpev8
The history of geared CVTs is one of many failed attempts. Many even patented. Though none going so deep into the fundamentals of involute gearing as we have done. So here we present the proof for all to see. The source code is formatted for use in the free software package called blender, so it is accessible to all. All you need to know is in here. Everybody in the world can test it! We are not afraid, we are sure, we have tested it ourselves.
Instructions for using this source code: Go to www.blender.org and install the latest version of blender (its free). In blender go to the tab 'File', select the tab 'Open' and import the file '3d.blend' that you can download at the bottom of this website. Put the mouse on the invention and press the spacebar to start the animation.
General blender example source code for two spur gears intermeshing
(Helical, bevel and conical involute gear types are also possible)
def example_spur_gear_intermeshing(): # see: https://www.geartechnology.com/articles/30025-what-happens-if-science-proves-engineering-wrong # These variables you can set at will number_of_teeth_A = 8 number_of_teeth_B = 12 pressure_angle_in_degrees = 20 Offset = 0.5 # With 0 the teeth of both gears are the same thickness. Here we use 0.5 as an extreme example to test the formula height_of_the_gears = 5 # All calculations done here in radians pressure_angle = pi * pressure_angle_in_degrees / 180 # Calculate the distance of the axis of the gear to the centre point Pitch_Circle_Radius_A = reference_circle_radius(number_of_teeth_A, pressure_angle) # = number_of_teeth_A / cos(pressure_angle) Pitch_Circle_Radius_B = reference_circle_radius(number_of_teeth_B, pressure_angle) # = number_of_teeth_B / cos(pressure_angle) ''' Starting from the centre line of the root, the angle (all angles in rad) that we need to rotate over to reach the point where the involute curve of the tooth starts on the base circle is: "(π/(2⋅n)) + tan(Φ) - Φ", whereby "n" is the number of teeth of the gear and "Φ" is the pressure angle. ''' Start_Angle_A = Offset/number_of_teeth_A + start_angle_calc(pressure_angle, number_of_teeth_A) # = (0.5 * pi / number_of_teeth_A) + tan(pressure_angle) - pressure_angle Start_Angle_B = -Offset/number_of_teeth_B + start_angle_calc(pressure_angle, number_of_teeth_B) # = (0.5 * pi / number_of_teeth_A) + tan(pressure_angle) - pressure_angle # Set the colour gear A Spur_Gear_A_Colour = bpy.data.materials.new("Spur_Gear_A_Colour") Spur_Gear_A_Colour.diffuse_color = (1, 0, 0, 1) # Red Spur_Gear_A_Colour.metallic = 0 Spur_Gear_A_Colour.roughness = 0.3 # Set the colour gear B Spur_Gear_B_Colour = bpy.data.materials.new("Spur_Gear_B_Colour") Spur_Gear_B_Colour.diffuse_color = (0, 0.5, 0, 1) # Green Spur_Gear_B_Colour.metallic = 0 Spur_Gear_B_Colour.roughness = 0.3 # Draw spur gear A bpy.ops.mesh.add_3d_spur_gear( align='WORLD', location=(-Pitch_Circle_Radius_A, 0, 0), # note the "-" sign rotation=(0, 0, 0), number_of_teeth = number_of_teeth_A, # IntProperty number_of_extra_teeth = 0, # FloatProperty # 0 => Spur gear, else conical involute gear angle_start = Start_Angle_A, # FloatProperty # --- The rest are not used here, but they are shown for reference --- #helical_angle = , # FloatProperty - For making helical shaped gears #bevel_factor = , # FloatProperty - For making bevel shaped gears #start_at_extra_teeth = , # FloatProperty #centre_pressure_angle = , # FloatProperty #tip_cut_at_number_of_extra_teeth = , # FloatProperty #angle_resolution = , # FloatProperty #extra_root_depth = , # FloatProperty #extra_radius_root_circle = , # FloatProperty #half_gear = , # BoolProperty #is_pinion = , # BoolProperty #rotate_half_thooth = , # BoolProperty #top_of_cvt = , # BoolProperty ) Spur_Gear_A = bpy.context.object Spur_Gear_A.scale.z = height_of_the_gears Spur_Gear_A.active_material = Spur_Gear_A_Colour # Draw spur gear B bpy.ops.mesh.add_3d_spur_gear( align='WORLD', location=(Pitch_Circle_Radius_B, 0, 0), rotation=(0, 0, pi / number_of_teeth_B), # same as setting: rotate_half_thooth = True number_of_teeth = number_of_teeth_B, number_of_extra_teeth = 0, angle_start = Start_Angle_B, ) Spur_Gear_B = bpy.context.object Spur_Gear_B.scale.z = height_of_the_gears Spur_Gear_B.active_material = Spur_Gear_B_Colour # Animation Number_Of_Frames = 360 # prepare a scene ctx = bpy.context scn = ctx.scene objectToSelect = Spur_Gear_A objectToSelect.select_set(True) objectToSelect = Spur_Gear_B objectToSelect.select_set(True) scn.frame_start = 0 scn.frame_end = Number_Of_Frames - 2 # starts at 0 and the last one needs to be cut as it is the same as the first scn.frame_current = 0; Spur_Gear_A.keyframe_insert(data_path="rotation_euler", frame=scn.frame_current) Spur_Gear_B.keyframe_insert(data_path="rotation_euler", frame=scn.frame_current) Spur_Gear_A.rotation_euler = (0, 0, -2*pi) Spur_Gear_B.rotation_euler = (0, 0, (pi / number_of_teeth_B) + (number_of_teeth_A*2*pi/number_of_teeth_B)) scn.frame_current = Number_Of_Frames - 1; Spur_Gear_A.keyframe_insert(data_path="rotation_euler", frame=scn.frame_current) Spur_Gear_B.keyframe_insert(data_path="rotation_euler", frame=scn.frame_current) bpy.context.area.type = 'GRAPH_EDITOR' # Change screen to graph editor to do the next operation bpy.ops.graph.interpolation_type(type='LINEAR') # Set keyframe type to linear to avoid acceleration of the hands animation bpy.context.area.type = 'TEXT_EDITOR' # Change back to text editor bpy.ops.screen.animation_play() # Start the animation # set up the camera bpy.ops.object.camera_add(enter_editmode=False, align='VIEW', location=(Pitch_Circle_Radius_B - Pitch_Circle_Radius_A, 0, 100), rotation=(0, 0, 0)) bpy.context.object.data.type = 'ORTHO' bpy.context.object.data.ortho_scale = 46.6