// // To do list // // Bolt // Nut // remove extra pistons - redefine crankshaft // lighting // Bearings // Alternator connections // Resize Engine pulley - 4", retexture // spline belts // redefine engine block // parameterize // belt texture and reference point // Reference points on wheels // // Camera [angle] // sky-sphere // wrench // Background Image // Ground texture // // chain sprocket // layout lines // transparent composition guide - always in line with camera // lighting guides // global_settings{ assumed_gamma 2 // change if the image is too pale radiosity{ recursion_limit 1 } } // Include Files #include "colors.inc" #include "textures.inc" #include "metals.inc" #include "woods.inc" #include "stones1.inc" #include "debug.inc" #include "shapes.inc" #include "functions.inc" Set_Debug (true) // Light Sources //light_source{ <0, 200, 100> color rgb<1, 1, 1>} #declare Light1 = <0, 80, 10>; #declare Target1 = <0, 24, -24>; #declare Light2 = <0, 80, 60>; // rotated 120 #declare Target2 = <10, 0, 12>; #declare Light3 = <0, 80, 60>; // rotated 240 #declare Target3 = <0, 0, 12>; #declare Light4 = <-50, 80, 12>; // Highlight Coupling #declare Target4 = <0, 40, 6>; light_source{ Light1 color White spotlight radius 30 falloff 90 tightness 50 point_at Target1 } //cylinder { Light1, Target1, 0.1 pigment {color Yellow transmit 0.8}} light_source{ Light2 color White * 0.6 spotlight radius 30 falloff 90 tightness 50 rotate y*120 point_at Target2 } //cylinder { Light2, Target2, 0.5 rotate y*120 pigment {color Yellow transmit 0.8}} light_source{ Light3 color White*0.6 spotlight radius 30 falloff 90 tightness 50 rotate y*240 point_at Target3 } //cylinder { Light3, Target3, 0.1 rotate y*240 pigment {color Yellow transmit 0.8}} light_source{ Light4 color White spotlight radius 30 falloff 90 tightness 50 point_at Target4 //fade_distance 5 //fade_power 2 //circular //orient //adaptive 0 } //cylinder { Light4, Target4, 0.1 pigment {color Yellow transmit 0.8}} // An area light (creates soft shadows) // WARNING: This special light can significantly slow down rendering times! light_source { 0*x // light's position (translated below) color rgb 1.0 // light's color area_light <8, 0, 0> <0, 0, 8> // lights spread out across this distance (x * z) 4, 4 // total number of lights in grid (4x*4z = 16 lights) adaptive 0 // 0,1,2,3... jitter // adds random softening of light circular // make the shape of the light circular orient // orient light translate <-40, 80, 0> // position of light } /* sky ------------------------------------------------------------------- sky_sphere{ pigment{ gradient <0,1,0> color_map{ [0 color rgb<1,1,1>] [0.4 color rgb<1,1,1>] [0.6 color rgb<1,1,1>] [1.0 color rgb<1,1,1>] } scale 2 } } end of sky_sphere */ sky_sphere { pigment { gradient y color_map { [ 1.0 color White ] [ 0.5 color CornflowerBlue ] } scale 2 translate -1 } } /*plane {y,0 pigment { color Gray90} //pigment { color Cyan} normal {quilted .1 scale 20 } //pigment{ brick White, Blue brick_size <10, 1, 10> mortar 0.5 } } */ cylinder { <0,0,0>, <0,-1,0>, 40 texture {pigment { color Gray90} normal {granite 0.2}}} //------------------------------------------------------------------------ // labeled axes #declare dia = 20; #declare len = 20; #declare letters = 5; #declare refs = union { sphere {<0,0,0> 2} torus { dia, 0.5} cylinder { <0,0,0>, <0,0,dia>, 0.5} text { ttf "arial.ttf" "0" 0.1, 0 scale letters translate <0, 0, dia+5>} cylinder { <0,0,0>, , 0.5 rotate y*120} text { ttf "arial.ttf" "120" 0.1, 0 scale letters translate <0, 0, dia+5> rotate y*120} cylinder { <0,0,0>, , 0.5 rotate y*240} text { ttf "arial.ttf" "240" 0.1, 0 scale letters translate <0, 0, dia+5> rotate y*240} cylinder { <2*dia,0,0>, <2*dia+len,0,0>, 0.5} cone { <2*dia+len,0,0>, 1, <2*dia+len+2,0,0>, 0} text { ttf "arial.ttf" "+x" 0.1, // extrusion depth 0 // spacing between characters (default = 0) scale letters rotate -y*45 translate <2*dia+len+5, 0, 0> no_shadow } cylinder { <2*dia, 5, 0>, <2*dia, 5+len, 0>, 0.5 no_shadow} cone { <2*dia, 5+len, 0>, 1, <2*dia, 5+len+2, 0>, 0} text { ttf "arial.ttf" "+y" 0.1, // extrusion depth 0 // spacing between characters (default = 0) scale letters rotate -y*45 translate <2*dia, 5+len+5, 0> no_shadow } cylinder { <2*dia, 0, 5>, <2*dia, 0, 5+len>, 0.5} cone { <2*dia, 0, 5+len>, 1, <2*dia, 0, 5+len+2>, 0} text { ttf "arial.ttf" "+z" 0.1, // extrusion depth 0 // spacing between characters (default = 0) scale letters rotate -y*45 translate <2*dia+5, 0, len> no_shadow } } //object {refs} // Variables #declare Frame_Width = 18; #declare Frame_Height = 48; #declare Frame_Depth = 24; #declare Frame_Thickness = 0.75; #declare Small_Radius = 2; #declare Big_Radius = 9; #declare Belt_width = 1; #declare Top = Frame_Height- 2 - Small_Radius; #declare Bottom = 18; #declare Alternator_Dia = 4; #declare Alternator_Offset = Frame_Width/2+Alternator_Dia/2+Small_Radius+Belt_width/2; #declare Alternator_height = Bottom+10; #declare P = sqrt ((Top-Bottom)*(Top-Bottom) - (Alternator_Offset * Alternator_Offset)); #declare theta = 2*acos ((Big_Radius - Small_Radius)/P); #declare theta_d = degrees(theta); #declare belt_length = 2*P*sin(theta/2); #declare belt_angle = degrees(asin (Alternator_Offset/P)); #declare P2 = Top-(Bottom+5); #declare theta2 = 2*acos ((Big_Radius - Small_Radius)/P2); #declare theta2_d = degrees(theta2); #declare belt_length2 = 2*P2*sin(theta2/2); #declare rotation = clock*360; #declare StepUp1 = rotation*(Big_Radius/Small_Radius); #declare StepUp2 = StepUp1*(Big_Radius/Small_Radius); #declare rotationAngle = radians(rotation); #debug concat(" clock = ", str(clock, 3,4)) #debug "\n" #debug concat(" rotation = ", str(rotation, 3,4)) #debug "\n" #debug concat(" rotationAngle = ", str(rotationAngle, 3,4)) #debug "\n" #declare Vertical_Displacement = 4/2; #declare Inset = 1; #declare PistonRod = (2*Vertical_Displacement)+Inset+4; #declare CW_rad = Inset+Vertical_Displacement; #declare rotation2 = rotation+90; #declare rotation3 = rotation+180; #declare rotation4 = rotation+270; #declare rotationAngle =radians(rotation); #declare rotationAngle2=radians(rotation2); #declare rotationAngle3=radians(rotation3); #declare rotationAngle4=radians(rotation4); #declare rodRotation1 = asin(Vertical_Displacement*sin(rotationAngle )/PistonRod); #declare rodRotation2 = asin(Vertical_Displacement*sin(rotationAngle2)/PistonRod); #declare rodRotation3 = asin(Vertical_Displacement*sin(rotationAngle3)/PistonRod); #declare rodRotation4 = asin(Vertical_Displacement*sin(rotationAngle4)/PistonRod); #declare Inset1 = 0;//Inset*cos(rotationAngle ); #declare Inset2 = 0;//Inset*cos(rotationAngle2); #declare Inset3 = 0;//Inset*cos(rotationAngle3); #declare Inset4 = 0;//Inset*cos(rotationAngle4); #declare stroke1 = Vertical_Displacement*-cos(rotationAngle ); #declare stroke2 = Vertical_Displacement*-cos(rotationAngle2); #declare stroke3 = Vertical_Displacement*-cos(rotationAngle3); #declare stroke4 = Vertical_Displacement*-cos(rotationAngle4); #declare Treadle_thickness = 1.5; #declare Pivot = Frame_Width/2-1; #declare Pivot_Height = 5+Bottom-(Vertical_Displacement/2)-PistonRod-4-Treadle_thickness+2; #declare Treadle_Height = Pivot_Height+0.5; //Bottom+5-PistonRod-4+(stroke1+stroke4)/2; #declare Treadle_Angle = degrees( atan2 ( (Bottom+5-PistonRod-4+stroke4)-(Pivot_Height+Treadle_thickness), Pivot ) ); #declare Battery_Size = <8, 7.75, 6.75>; #declare length = 2; #declare tpi = -1/5; #declare OD = 0.25; #declare ID = OD/3; #declare nutsize = 1; #declare Exploded1 = 0; // 0 = Normal View, 1 = Exploded diagram with arrows #declare Exp_coupling = 8; #declare Exp_nut = 2; #declare Exp_bolt = 5; #declare Exp_shaft = 12; // Camera Positions #declare View = array[9][6] // Array [Rows] [Columns] { {-270, 80, 90, 50, 17, -12}, // CAMERA [0] = View from LEFT FRONT {-5, 200, 4, 0, 50, 2}, // CAMERA [1] = View from TOP {270, 80, -120, -50, 17, 12}, // CAMERA [2] = View from Angle REAR {0, 60, 250, 0, Top, 0}, // CAMERA [3] = View from TREADLE FRONT {Battery_Size.x*9, 100, -12, Battery_Size.x*1.5, 0, -12}, // CAMERA [4] = Look at Battery {-40, 22, -6, 4, 25, -12}, // CAMERA [5] = ZOOM into Engine {0, Top, -250, 0, Bottom, 0}, // CAMERA [6] = View from TREADLE Rear {-60, 90, 65, 0, 45, 4} // CAMERA [7] = ZOOM onto Pulley connection {0, 60, 150, 0, 0, 10}, // CAMERA [8] = Look at TOOLS } #declare Camera = 0; #declare Camera_Selected = camera { angle 15 location right -x*image_width/image_height look_at } camera { Camera_Selected } #declare Angle2Origin = atan2d((View [Camera] [0] - View [Camera] [3]), (View [Camera] [2] - View [Camera] [5])); //#declare VAngle = atan2d((View [Camera] [0] - View [Camera] [3]), (View [Camera] [1] - View [Camera] [4])); #debug concat(" Camera Angle = ", str(Angle2Origin, 3,4)) #debug "\n" #declare Text_size = 2.5; #declare Text_line = Top+8; text { ttf "arial.ttf" "Treadle Powered Generator" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Design by Pat Delany" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Model and animation by" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Bill Walker" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "using POV-Ray and" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Dave's Targa Animator" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "opensourcemachinetools.org" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Special thanks to:" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Friederich A. Lohmueller" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Rune Skovbo Johansen" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" "Dave Mason" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" " Henry Walker" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" " Peter Walker" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" " Laura Simms" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; text { ttf "arial.ttf" " Andrew Lagos" 0.1, 0 scale Text_size rotate y*Angle2Origin translate <0, Text_line, 10>} #declare Text_line = Text_line - Text_size; /*box { <-50, 0, -50> <100, 100, -50> pigment { image_map { "Background.bmp"} scale <100, 100, 1>} rotate -y*45} */ // Textures #declare Board = texture { pigment { wood color_map { [.4 rgb <.84, .73, .6>] [.6 rgb <.8, .7, .6>] } quick_color Brown } normal { average normal_map { [1 wood .4 slope_map { [0.0 <0.0, 0>] [0.5 <0.5, 1>] [1.0 <1.0, 0>] } turbulence .5 scale <10,10, 1>*10 rotate y*90] [1 wood .6 slope_map { [0 <0,0>] [.5 <.5,1>] [1 <1,0>] } turbulence .4 scale <10,10,2>*6] } } finish { specular 0 roughness 1 reflection 0 ambient 0.1 diffuse 0.5 } } #declare Board2 = texture { pigment { wood color_map { [.4 rgb <.84, .73, .6>] [.6 rgb <.8, .7, .6>] } quick_color Brown } normal { average normal_map { [1 wood .4 slope_map { [0.0 <0.0, 0>] [0.5 <0.5, 1>] [1.0 <1.0, 0>] } turbulence .5 scale <10,10, 1>*10 rotate y*90] [1 wood .6 slope_map { [0 <0,0>] [.5 <.5,1>] [1 <1,0>] } turbulence .4 scale <10,10,2>*6] } } finish { specular 0 roughness 1 reflection 0 ambient 0.1 diffuse 0.5 } scale 0.5 rotate z*90 } #declare S = 100; // Variable S needed for Rust texture #declare rust = texture { pigment { wrinkles color_map { // [ 0.0 rgbft <0.827451, 0.4, 0.113725, 0.0, 0.0> ] [ 0.291815 rgbft <0.705882, 0.329412, 0.141176, 0.0, 0.0> ] [ 0.569395 rgbft <0.929412, 0.490196, 0.207843, 0.0, 0.0> ] // [ 0.761566 rgbft <0.729412, 0.462745, 0.207843, 0.0, 0.0> ] [0.761566 color rgb <0.87451, 0.380392, 0.082353>] [ 0.857651 rgbft <0.611765, 0.470588, 0.266667, 0.0, 0.0> ] [ 1.0 rgbft <0.752941, 0.447059, 0.188235, 0.0, 0.0> ] } turbulence <0.9931, 0.4938, 0.0195>*S octaves 8 omega 0.7132 lambda 2.2602 frequency 0.7355 phase 1.22 poly_wave 1.013 warp { turbulence <1.668, 1.522, 2.948>*S octaves 10 omega 0.647 lambda 2.035 } quick_color Red*0.5 } normal { wrinkles, 1000 scale 0.5*S normal_map { [0.3 granite , 0.85 scale 0.2*S] [1.0 bumps , 1.2 scale .7*S] } warp { turbulence <1.668, 1.522, 2.948>*S octaves 10 omega 0.647 lambda 2.035 } } finish { ambient 0 diffuse 0.45 specular .1 roughness 0.5 crand 0.015 } } #declare Pulley = F_MetalC; #declare Shaft = F_MetalC; #declare Belt = texture { pigment { color Black } finish { phong .6} } #declare Alt = F_MetalB; #declare Block = texture { pigment { color Red quick_color Yellow transmit 0 } finish { specular 0 ambient 0.5 diffuse 0.2 reflection 0.1 phong 0.3 phong_size 1 } } #declare Negative = texture { pigment { color Red } } #declare Line = texture { pigment { color Green } finish { specular 0.6 ambient 0.8 diffuse 0.1 reflection 0 phong 0.8 //phong_size 0.1 } } #declare Pistons = F_MetalE; #declare Yellowtex = texture { pigment { color <1.0,1.0,0.0> } finish {phong 1} } #declare Leadtex = texture { pigment { color <0.3,0.3,0.3> } finish {phong 1} } #declare Penciltex = texture { pigment { wood turbulence 0.0 color_map { [0.0 color <0.7,0.6,0.4>] [1.0 color <0.8,0.7,0.6>] } scale 0.1 rotate 88*x translate 0.5 } } //######################################################################################### // definition of scene objects // #declare Spoke = cylinder { <-Big_Radius, 0, 0>, < Big_Radius, 0, 0>, Belt_width/2 } #declare Big_Pulley = union { union { difference { torus {Big_Radius, Belt_width/2} torus {Big_Radius+Belt_width/2, Belt_width/2} } cylinder {<0, -Belt_width/2, 0>, <0, Belt_width/2, 0>, Big_Radius} //object {Spoke} //object {Spoke rotate y*120} //object {Spoke rotate y*-120} texture { Board2 } } sphere { <0, 0, -(Big_Radius-1)> .1 pigment { color Red}} // Make radius = Belt_width to see ref point } #declare Small_Pulley = difference { cylinder { <0, -Belt_width/2, 0>, < 0, Belt_width/2, 0>, Small_Radius } torus { Small_Radius, Belt_width/2} cylinder { <0, -(Belt_width/2+0.5), 0>, < 0, Belt_width/2+0.1, 0>, 0.1 pigment { color Red}} } #declare Counterweight = difference { cylinder { <0, 0, 1>, <0, 0, 0.5>, CW_rad } cylinder { <-CW_rad, -CW_rad, 1.1>, <-CW_rad, -CW_rad, 0.4>, CW_rad*0.8 } cylinder { , , CW_rad*0.8 } } #declare Counterweights = union { object { Counterweight } object { Counterweight translate -z*1.5} cylinder { <0, -CW_rad+Inset, 1.1>, <0, -CW_rad+Inset, -1.1>, 0.5 } } #declare Pistonrod = cylinder { <0, 0, 0>, <0, PistonRod, 0>, 0.5 } #declare Piston1 = union { object {Pistonrod rotate -z*degrees(rodRotation1) translate <0,-PistonRod+stroke1,0>} cylinder { <0, 0, 0>, <0, -4, 0>, 1.5 rotate z*Treadle_Angle translate <0,-PistonRod+stroke1,0>} } #declare Piston2 = union { object {Pistonrod rotate -z*degrees(rodRotation2) translate <0,-PistonRod+stroke2,0>} cylinder { <0, 0, 0>, <0, -4, 0>, 1.5 rotate z*Treadle_Angle translate <0, -PistonRod+stroke2,0> } } #declare Piston3 = union { object {Pistonrod rotate -z*degrees(rodRotation3) translate <0,-PistonRod+stroke3,0>} cylinder { <0, 0, 0>, <0, -4, 0>, 1.5 rotate z*Treadle_Angle translate <0,-PistonRod+stroke3,0>} } #declare Piston4 = union { object {Pistonrod rotate -z*degrees(rodRotation4) translate <0,-PistonRod+stroke4,0>} cylinder { <0, 0, 0>, <0, -4, 0>, 1.5 rotate z*Treadle_Angle translate <0,-PistonRod+stroke4,0>} } #declare Crankshaft = union { object {Counterweights rotate z*rotation translate <0, Bottom+5, -(Frame_Depth/5)>} object {Counterweights rotate z*rotation2 translate <0, Bottom+5, -(2*Frame_Depth/5)>} object {Counterweights rotate z*rotation3 translate <0, Bottom+5, -(3*Frame_Depth/5)>} object {Counterweights rotate z*rotation4 translate <0, Bottom+5, -(4*Frame_Depth/5)>} // object { Piston1 translate <0, Bottom+5, -(Frame_Depth/5)> } // object { Piston2 translate <0, Bottom+5, -(2*Frame_Depth/5)> } // object { Piston3 translate <0, Bottom+5, -(3*Frame_Depth/5)> } object { Piston4 translate <0, Bottom+5, -(4*Frame_Depth/5)> } } #declare EngineBlock = superellipsoid {<0.25, 0.25> scale } #declare Engine = difference{ object { EngineBlock texture { Block } } object { EngineBlock scale 0.9 texture { Block } } plane {x, 0 texture { rust } } plane {y, -2*Vertical_Displacement texture { rust } } } #declare Alternator = superellipsoid {<1, 0.25>} #declare Post = superellipsoid {<1, 0.25> scale <1/2, 1/2, 1>} #declare Battery = superellipsoid {<0.1, 0.1> scale Battery_Size/2 } #declare Battery_position = <8, Battery_Size.y/2, Battery_Size.z*2+2>; object { Battery translate texture { pigment {Gray10} } } object { Post rotate x*90 translate pigment {Gray40}} object { Post rotate x*90 translate pigment {Gray40}} #declare Ground = sphere_sweep { cubic_spline 11, , .25 //unplotted point , .25 //Back of alternator , .25 //extend back , .25 //center of bend , .25 //end of bend , .25 //to front of alternator , .25 //control point 1/2 way down , .25 //on ground over to battery post , .25 //on ground over to battery post , .25 //on ground over to battery post , .25 //unplotted point } #declare Neg = sphere_sweep { cubic_spline 11, , .25 //unplotted point , .25 //Back of alternator , .25 //extend back , .25 //center of bend , .25 //end of bend , .25 //to front of alternator , .25 //control point 1/2 way down , .25 //on ground over to battery post , .25 //on ground over to battery post , .25 //on ground over to battery post , .25 //unplotted point } //########################################[FRONT VIEW COMPONENTS] ################################################# //############################################################################################ // Alternator Belt //############################################################################################ // -------------- dimensions ----------- #local R1 = Big_Radius; // big wheel radius #local R2 = Small_Radius; // small wheel radius #local Dist = vlength (<0,Top,0>-);// axis distance #local Link_N = 120;// number of links // -------------- calculations --------- #local Ri = R1-R2; #local C_Angle = degrees(asin(Ri/Dist)); // chain linear length #local LLen=sqrt(pow(Dist,2)-pow(Ri,2)); // segment angle and length #local Ang1 = 180+2*C_Angle; #local Ang2 = 180-2*C_Angle; #local Len1 = Ang1/360*2*pi*R1; #local Len2 = Ang2/360*2*pi*R2; // total length #local C_Len = 2*LLen+Len1+Len2; #local Link_L = C_Len / Link_N; #declare Link = // the chain link cone{<0,-Belt_width/2,0>, Belt_width/4, <0,Belt_width/2,0>, Belt_width/2} //Move texture down to loop and vary color with position along belt /* //Diagnostic references sphere{<0,Top,0>,0.5 texture{pigment{color Red}}} cylinder { <-Dist,0,0>, <0,0,0> , 0.25 rotate z*VAngleD(<-Dist,Top,0>-<0,Top,0>,<0,Top,0>-) translate <0,Top,0> rotate y*180} sphere{,0.5 texture{pigment{color Red}}} */ #declare Sag = 1; //-------------------------------------- #local Ani=clock*Link_L;// animation! #declare Alternator_Belt = union{ //------------------------------- #local Nr = Link_N; // start loop #while (Nr > 0) //#local Pos = mod(Nr*Link_L+Ani, C_Len); #local Pos = mod(Nr*Link_L+(pi*2*R1*StepUp1), C_Len); // Change code to move link actual distance #if (Nr = Link_N) #local Link_texture = texture{pigment{color Gray30}} #else #local Link_texture = texture{pigment{color Black}} #end //------------------------------------- #if(Pos< Len1 ) // Counterclockwise around Big pulley #local Rot1 = Pos/Len1*Ang1; object{Link texture{Link_texture} translate<0, R1, 0> rotate<0, 0,-Rot1+C_Angle> } // text { ttf "arial.ttf" str(Nr, 3,0) 0.1, 0 scale Text_size translate <0, Belt_width, 0> translate<0, R1, 0> rotate<0, 0,-Rot1+C_Angle>} /* #if (Nr = Link_N) sphere { <0,0,0>, Belt_width pigment {color Green} translate <0, Belt_width, 0> translate<0, R1, 0> rotate<0, 0,-Rot1+C_Angle>} #end */ #end //-------------------------------- #if((Pos>Len1) & (Pos<=Len1+LLen)) #local LPos = Pos-Len1; // Counterclockwise from Big pulley to small pulley #local Linksag = Sag*sin((pi/LLen)*LPos); object{Link texture{Link_texture} rotate z*180 translate<-LPos, -R1-Linksag, 0> rotate<0, 0,-C_Angle> } // text { ttf "arial.ttf" str(Nr, 3,0) 0.1, 0 scale Text_size translate <0, Belt_width, 0> rotate z*180 translate<-LPos, -R1-Linksag, 0> rotate<0, 0,-C_Angle>} #end //-------------------------------- #if((Pos>Len1+LLen ) // wrap around small pulley & (Pos<= Len1+LLen+Len2)) #local Rot2 = (Pos-Len1-LLen)/Len2*Ang2; object{Link texture{Link_texture} translate<0,R2,0> rotate<0, 0, -Rot2-C_Angle-180> translate<-Dist,0,0> } // text { ttf "arial.ttf" str(Nr, 3,0) 0.1, 0 scale Text_size translate <0, Belt_width, 0> translate<0,R2,0> rotate<0, 0, -Rot2-C_Angle-180> translate<-Dist,0,0>} #end //-------------------------------- #if((Pos>Len1+LLen+Len2) // Counterclockwise from Small pulley to big pulley & (Pos <= Len1+LLen+Len2+LLen)) #local LPos = Pos-(Len1+LLen+Len2); #local Linksag = Sag*sin((pi/LLen)*LPos); // Calculate chain sag object{Link texture{Link_texture} translate // Move link by sag amount rotate<0, 0, C_Angle> translate<-Dist, 0, 0> } // text { ttf "arial.ttf" str(Nr, 3,0) 0.1, 0 scale Text_size translate <0, Belt_width, 0> translate rotate<0, 0, C_Angle> translate<-Dist, 0, 0>} #end //-------------------------------- #local Nr = Nr - 1; // next Nr #end // --------------- end of loop rotate z*VAngleD(<-Dist,Top,0>-<0,Top,0>,<0,Top,0>-) translate <0,Top,0> rotate y*180 } // Nut and Bolt #declare threads = union { isosurface { function{ f_helix1( x,y,z, 1, // number of helixes, (1 = single helix, 2 = double helix etc.) 5*2*pi, // period, turns on the length of 2*pi ID, // minor radius, OD, // major radius, 1, // shape parameter, 2.0, // cross section type, // (0.0 to 1.0 = square ... rounded to circle // over 2.0 to 3.0 = rounded to diamond and concave diamond 0 ) // cross section rotation angle } contained_by { box {<-OD*2, 0, -OD*2> } } threshold 0 max_gradient 1.3 accuracy 0.0001 all_intersections } cylinder { <0, 0, 0>, <0, length, 0>, OD pigment {Gray20}} } #declare nut_body = box {<-nutsize/2, 0.01, -nutsize/2> } object {threads translate y*Small_Radius/2 rotate z*StepUp1 //Animation Rotation StepUp1 translate <0, (Top)+Exploded1*Exp_bolt, 1.5+Belt_width*2> texture { Rust finish {ambient 0}} } // Bolt Hex head isosurface {function { f_hex_x (x,y,z, 1) } contained_by { box {<-1, -1, 0> <1, 1, -0.25> } } threshold 0.1 scale <5, 5, 1> rotate x*90 translate y*length texture { Rust finish {ambient 0}} translate y*Small_Radius/2 rotate z*StepUp1 //Animation Rotation StepUp1 translate <0, (Top)+Exploded1*Exp_bolt, 1.5+Belt_width*2> } // Square nut difference { object {nut_body texture { Rust finish {ambient 0}}} object {threads pigment { color Gray50}} translate y*Small_Radius/2 rotate z*StepUp1 //Animation Rotation StepUp1 translate <0, (Top)+Exploded1*Exp_nut, 1.5+Belt_width*2> } // Big pulley turning alternator object {Big_Pulley rotate x*90 rotate z*StepUp1 //Animation Rotation StepUp1 translate <0, Top, 1.5> } // Wooden part on Big wheel For Coupling to Big pulley #declare Coupling_shaft = difference{ cylinder { <0, -Belt_width*2, 0>, < 0, Belt_width*2, 0>, Small_Radius rotate x*90 texture { Board2 translate y*10} } object { nut_body scale 1.2 translate <0, Small_Radius-0.25, 0>} } object { Coupling_shaft rotate z*StepUp1 //Animation Rotation StepUp1 translate <0, Top, (1.5+Belt_width*2)> } #declare coupling_thickness = Small_Radius+0.5; #declare coupling = difference { cylinder { <0, -Belt_width*2, 0>, < 0, Belt_width*2, 0>, coupling_thickness } cylinder { <0, -(Belt_width*2+1), 0>, < 0, Belt_width*2+1, 0>, Small_Radius } cylinder { <0, 0, 0>, < 0, 0, -(coupling_thickness+1)>, 0.5 pigment {color White} } rotate x*90 } object { coupling rotate z*StepUp1 //Animation Rotation StepUp1 translate <0, Top, (1.5+Belt_width*2)+Exploded1*Exp_coupling> texture {Shaft} } //########################################[START ELPLODED VIEW COMPONENTS] ################################################# // exploded view additions #if ( Exploded1 = 1 ) // yellow assembly line //cylinder { <0, Top, (1.5+Belt_width*2)>, <0, (Top+Small_Radius+Belt_width/2)+Exploded1*Exp_bolt, (1.5+Belt_width*2)>, 0.125 pigment { color Yellow}} #declare Bolt_line = sphere_sweep { linear_spline 8, <0, Top, (1.5+Belt_width*2)>, .125 // Shaft <0, Top+Small_Radius+2, (1.5+Belt_width*2)>, .125 // Up out of hole <0, Top+Small_Radius+2, 1.5+Belt_width*2+Exploded1+2.5>, .125 // To shaft flat <0, Top+Small_Radius+.25, 1.5+Belt_width*2+Exploded1+2.5>, .125 // Down toward shaft <0, Top+Small_Radius+.25, (1.5+Belt_width*2)+Exploded1*Exp_coupling>, .125 // To Coupling hole <0, Top+Small_Radius+3, (1.5+Belt_width*2)+Exploded1*Exp_coupling>, .125 // Up out of coupling hole <0, Top+Small_Radius+3, (1.5+Belt_width*2)>, .125 // Back to wheel <0, (Top+Small_Radius+Belt_width/2)+Exploded1*Exp_bolt, (1.5+Belt_width*2)>, .125 // Up to Bolt } object {Bolt_line texture { Line} no_shadow no_reflection} //object { coupling_exp texture {pigment {color Yellow } }} #declare coupling_exp = difference { cylinder { <0, 0, 1.5>, < 0, 0, 1.5+Exploded1*Exp_coupling>, Small_Radius+0.01 } cylinder { <0, 0, 1.5>, < 0, 0, 1.5+Exploded1*Exp_coupling>, Small_Radius } plane {x, 0} rotate -z*30 translate y*Top } #declare coupling_arrow = union { cylinder { <0, Top, (1.5+Belt_width*2)+Exploded1*Exp_coupling>, <0, Top, (1.5+Belt_width*2)>, .125} cone { <0, Top, (1.5+Belt_width*2)>, 0.25, <0, Top, 1.5>, 0} } object { coupling_arrow translate -x*Small_Radius texture { Line } } difference{ cylinder { <0, Top, 6+Exploded1*Exp_shaft>, <0, Top, -(Frame_Depth+4)>, 0.5 } box { <-1, Top+0.25, 1.5+Belt_width*2+Exploded1+2> <1, Top+1, 1.5+Belt_width*2+Exploded1+3> pigment { color White} } texture { Shaft } } #else // Draw regular length top shaft cylinder { <0, Top, 6+Exploded1*Exp_shaft>, <0, Top, -(Frame_Depth+4)>, 0.5 texture { Shaft } } #end //########################################[END ELPLODED VIEW COMPONENTS] ################################################# // Alternator components object {Alternator scale translate texture { Alt }} cylinder { <0, 0, -2>, <0, 0, 2>, 0.5 rotate x*90 rotate z*StepUp2 //Animation Rotation StepUp2 translate texture { Shaft } } object {Small_Pulley rotate x*90 rotate z*StepUp2 //Animation Rotation StepUp2 translate texture { Pulley } } object {Alternator_Belt translate z*1.5} //########################################[CENTER SECTION COMPONENTS] ################################################# box { <-Frame_Width/2, 0, -Frame_Thickness/2>, < Frame_Width/2, Frame_Height, Frame_Thickness/2> texture{ Board } } object {Engine translate <0, Bottom+5, -Frame_Depth/2> } // Crankshaft axis cylinder { <0,Bottom+5,3>, <0,Bottom+5,-(Frame_Depth+3)>, 0.5 texture { Shaft }} object {Crankshaft texture {Shaft} } #declare Treadle = box { <-Frame_Width*2, 0, -Frame_Thickness/2>, < Frame_Width*2, 1.5, -Frame_Depth> } object {Treadle translate x*Pivot // Moves pivot point to origin rotate z*Treadle_Angle // Rotates around origin translate <-Pivot, Treadle_Height, 0> texture{ Board rotate y*90 } } //Treadle pivot cylinder { <-Pivot, 0, 3>, <-Frame_Width/2+2, 0, -(Frame_Depth+3)>, 0.5 translate <0, Pivot_Height, 0> texture { Shaft } } // Rear #################################################### box { <-Frame_Width/2, 0, -Frame_Depth>, < Frame_Width/2, Frame_Height, -Frame_Depth+0.75> texture{ Board } } object {Big_Pulley rotate x*90 rotate z*90 rotate z*rotation translate <0, Bottom+5, -(Frame_Depth+1.5)> texture { Board2 } } object {Small_Pulley rotate x*90 rotate z*StepUp1 translate <0, Top, -(Frame_Depth+1.5)> texture { Board2 } } //############################################################################################ // Drive Belt //############################################################################################ // -------------- dimensions ----------- #local R1 = Big_Radius; // big wheel radius #local R2 = Small_Radius; // small wheel radius #local Dist = vlength (<0,Top,0>-<0,Bottom+5,0>);// axis distance #local Link_N = 120;// number of links // -------------- calculations --------- #local Ri = R1-R2; #local C_Angle = degrees(asin(Ri/Dist)); // chain linear length #local LLen=sqrt(pow(Dist,2)-pow(Ri,2)); // segment angle and length #local Ang1 = 180+2*C_Angle; #local Ang2 = 180-2*C_Angle; #local Len1 = Ang1/360*2*pi*R1; #local Len2 = Ang2/360*2*pi*R2; // total length #local C_Len = 2*LLen+Len1+Len2; #local Link_L = C_Len / Link_N; #declare Link = // the chain link cone{<0,-Belt_width/2,0>, Belt_width/4, <0,Belt_width/2,0>, Belt_width/2 texture{pigment{color Black}}} /* sphere{<0,Top,0>,0.5 texture{pigment{color Red}}} cylinder { <-Dist,0,0>, <0,0,0> , 0.25 rotate z*VAngleD(<-Dist,Top,0>-<0,Top,0>,<0,Top,0>-<0,Bottom+5,0>) translate <0,Top,0> rotate y*180} sphere{<0,Bottom+5,0>,0.5 texture{pigment{color Red}}} */ //-------------------------------------- #local Ani=clock*Link_L;// animation! #declare Drive_Belt = union{ //------------------------------- #local Nr = 0; // start loop #while (Nr < Link_N) //#local Pos = mod(Nr*Link_L+Ani,C_Len); #local Pos = mod(Nr*Link_L+(pi*2*R1*StepUp1), C_Len); // Change code to move link actual distance #if (Nr = Link_N) #local Link_texture = texture{pigment{color Gray30}} #else #local Link_texture = texture{pigment{color Black}} #end //------------------------------------- #if(Pos< Len1 ) // front down #local Rot1 = Pos/Len1*Ang1; object{Link translate<0,R1,0> rotate<0,0,-Rot1 +C_Angle> } #end //-------------------------------- #if((Pos>Len1) & (Pos<=Len1+LLen)) #local LPos = Pos-Len1; // clockwise from small pulley to big pulley object{Link rotate z*180 translate<-LPos,-R1,0> rotate<0,0,-C_Angle> } #end //-------------------------------- #if((Pos>Len1+LLen ) // wrap around small pulley & (Pos<= Len1+LLen+Len2)) #local Rot2 = (Pos-Len1-LLen)/Len2*Ang2; object{Link translate<0,R2,0> rotate<0,0,-Rot2-C_Angle-180> translate<-Dist,0,0> } #end //-------------------------------- #if((Pos>Len1+LLen+Len2) // clockwise from big pulley to small pulley & (Pos <= Len1+LLen+Len2+LLen)) #local LPos = Pos-(Len1+LLen+Len2); object{Link translate rotate<0,0,C_Angle> translate<-Dist,0,0> } #end //-------------------------------- #local Nr = Nr + 1; // next Nr #end // --------------- end of loop rotate -z*VAngleD(<-Dist,Top,0>-<0,Top,0>,<0,Top,0>-<0,Bottom+5,0>) translate <0,Bottom+5,-(Frame_Depth+1.5)> } // ########################################################################################### object {Drive_Belt} //#################################################### object {Ground texture {Belt} } object {Neg texture {Negative} } #declare Speedsquare = difference { union { box { <0,0,8> <8,1,8.2>} box { <0,0.4,0> <8,0.6,8>} } plane { z, 0 rotate -y*45} cylinder {<1,0,3>, <1,1,3>, 0.25} cylinder {<5,0,7>, <5,1,7>, 0.25} box { <0,0,0.25> rotate -y*45 translate <1,0,3>} } object {Speedsquare rotate -y*30 translate z*15 texture { pigment { color Gray70} } } #declare Pencil = intersection { union { cone { <0,0,0> 0.5 <0,1.6,0> 0.1 } cone { <0,1.6,0> 0.1 <0,2.0,0> 0 texture {Leadtex} } cylinder { <0,0.2,0> <0,-13,0> 0.5 } texture {Penciltex} } box {<0.35,2,1> <-0.35,-14,-1> rotate 000*y texture {Yellowtex}} box {<0.35,2,1> <-0.35,-14,-1> rotate 120*y texture {Yellowtex}} box {<0.35,2,1> <-0.35,-14,-1> rotate 240*y texture {Yellowtex}} translate 13*y } object {Pencil rotate x*90 rotate -y*120 translate <3,0.5,10>} #declare Plastic = material { texture {pigment {color transmit 0.9} normal { granite .05}} interior {ior 1.5}} #declare Screwdriver = union { sphere { 0.0, 7/8 scale x*0.6 material {Plastic} translate -x*0.25 } difference{ prism { linear_sweep // or conic_sweep for tapering to a point linear_spline // linear_spline | quadratic_spline | cubic_spline | bezier_spline -1.25, // height 1 1.25, // height 2 7, // number of points // (--- the points ---)x,z < cosd( 0), sind( 0)>, < cosd( 60), sind( 60)>, < cosd(120), sind(120)>, < cosd(180), sind(180)>, < cosd(240), sind(240)>, < cosd(300), sind(300)>, < cosd(360), sind(360)> material {Plastic}} sphere { <0,0,0>, 1.45 inverse material {Plastic}} box { <0.99*cosd( 0),-1.25, 0.99*sind( 0)>, <0.99*cosd( 60), 1.25, 0.99*sind( 60)> pigment {color Red}} box { <0.99*cosd( 120),-1.25, 0.99*sind( 120)>, <0.99*cosd( 180), 1.25, 0.99*sind( 180)> pigment {color Red}} box { <0.99*cosd( 240),-1.25, 0.99*sind( 240)>, <0.99*cosd( 300), 1.25, 0.99*sind( 300)> pigment {color Red}} rotate z*90 translate x*1.25 } #declare Blue_part = difference{ cylinder {<0,-.625,0>, <0,.625,0> 1} torus { 3, 2.3} rotate z*90 translate x*(2.5+.625) } object { Blue_part texture { pigment {Blue} finish { specular 0.6 } } } #declare Ring_1 = trace (Blue_part, <(2.5+.625+(0.625/6)*1), 1, 0>, -<(2.5+.625+(0.625/6)*1), 1, 0>+<(2.5+.625+(0.625/6)*1),-1,0>); #declare Ring_2 = trace (Blue_part, <(2.5+.625+(0.625/6)*2), 1, 0>, -<(2.5+.625+(0.625/6)*2), 1, 0>+<(2.5+.625+(0.625/6)*2),-1,0>); #declare Ring_3 = trace (Blue_part, <(2.5+.625+(0.625/6)*3), 1, 0>, -<(2.5+.625+(0.625/6)*3), 1, 0>+<(2.5+.625+(0.625/6)*3),-1,0>); #declare Ring_4 = trace (Blue_part, <(2.5+.625+(0.625/6)*4), 1, 0>, -<(2.5+.625+(0.625/6)*4), 1, 0>+<(2.5+.625+(0.625/6)*4),-1,0>); difference { object { Blue_part } cylinder { <(2.5+.625+(0.625/6)*4), 0, 0>, <(2.5+1.75),0,0>, Ring_4.y+(Ring_4.y-Ring_3.y) inverse} texture { pigment {Blue} finish { specular 0.6 } } } torus { Ring_1.y, .05 rotate z*90 translate x*(2.5+.625+(0.625/6)*1) texture { pigment {Blue} finish { specular 0.6 } }} torus { Ring_2.y, .05 rotate z*90 translate x*(2.5+.625+(0.625/6)*2) texture { pigment {Blue} finish { specular 0.6 } }} torus { Ring_3.y, .05 rotate z*90 translate x*(2.5+.625+(0.625/6)*3) texture { pigment {Blue} finish { specular 0.6 } }} torus { Ring_4.y, .05 rotate z*90 translate x*(2.5+.625+(0.625/6)*4) texture { pigment {Blue} finish { specular 0.6 } }} box{<-1.5,-.125,-.125> <4,0.25,0.25> rotate x*45 translate x*(2.5+1.5-.625) texture { pigment {Gray70} normal { bumps .5} finish{specular 0.6} } } } // End Union object { Screwdriver rotate y*90 translate <5, 0.5, 20> } #declare Hole = union { cylinder {<0.5,-1, 0>, <0.5, 1.1, 0>, 0.5} box {<0, -1, 0>, <1, 1.1, 3>} cylinder {<0.5,-1, 3>, <0.5, 1.1, 3>, 0.5} } #declare HandSaw = union { difference{ box { <0,0,0>, <6,1,6> texture {pigment{Brown}}} plane {x,0 rotate y*10} plane {x,5 rotate y*10 inverse} plane {z,0 rotate -y*7} object {Hole rotate y*10 translate <2,0,1.5> } object {Hole rotate y*10 translate <-0.1,0,1.5> } object {Hole scale x*2 translate <5,0,.5> } sphere { <3,0.6,2.6> 3.7 inverse} } difference{ box { <5,0.5-(1/32),0>, <25,0.5+(1/32),6> texture {pigment{Gray50}}} plane {z,0 rotate -y*7} cylinder {<24,-1, 5>, <24, 1.1, 5>, 0.25} } blob{ cylinder {<5,-0.1, 4.5>, <5, 1.1, 4.5>, 0.25, 1} threshold 0 texture {pigment{Gray50}}} blob{ cylinder {<4.5,-0.1, 3>, <4.5, 1.1, 3>, 0.25, 1} threshold 0 texture {pigment{Gray50}}} blob{ cylinder {<4.5,-0.1, 1.5>, <4.5, 1.1, 1.5>, 0.25, 1} threshold 0 texture {pigment{Gray50}}} } object {HandSaw rotate y*100 translate <10, 0.5, 30>} //#################################################### /* // Y-axis dimensions cylinder { <-Frame_Width/2, 0 ,0>, <-Frame_Width/2, Frame_Height, 0>, 0.25 pigment { color Yellow}} cylinder { <-Frame_Width/2, Bottom+5, 0>, <0, Bottom+5, 0>, 0.25 pigment {color Yellow}} cylinder { <-Frame_Width/2, Pivot_Height, 0>, <-Pivot, Pivot_Height, 0>, 0.25 pigment {color Yellow}} cylinder { <-Frame_Width/2, Bottom, 0>, , 0.25 pigment {color Yellow}} cylinder { <-Frame_Width/2, (Bottom+5-PistonRod-4+stroke4), 0>, <0, (Bottom+5-PistonRod-4+stroke4), 0>, 0.25 pigment {color Yellow}} cylinder { <-Frame_Width/2, (Pivot_Height+Treadle_thickness), 0>, <0, (Pivot_Height+Treadle_thickness), 0>, 0.25 pigment {color Yellow}} // Z-axis dimensions cylinder { <0, Top+Big_Radius, 0>, <0, Top+Big_Radius, 1.5+Belt_width>, 0.25 pigment { color Red}} cylinder { , , 0.25 pigment { color Red}} cylinder { , , 0.25 pigment { color Red}} cylinder { , , 0.25 pigment { color Red}} */ //object {Piston3 translate y*Bottom+5} // Debugging information #debug "####################################################" #debug "########### Debuggung Information #################" #debug "\n" #debug concat(" Pivot = ", str(Pivot, 3,4)) #debug "\n" #debug concat(" Pivot_Height = ", str(Pivot_Height, 3,0)) #debug "\n" #debug concat(" Treadle_Height = ", str(Treadle_Height, 3,0)) #debug "\n" #debug concat(" Bottom = ", str(Bottom, 3,0)) #debug "\n" #debug concat(" (Bottom+5-PistonRod-4+stroke4) = ", str((Bottom+5-PistonRod-4+stroke4), 3,0)) #debug "\n" #debug concat(" (Pivot_Height+Treadle_thickness) = ", str((Pivot_Height+Treadle_thickness), 3,0)) #debug "\n" #debug concat(" Treadle_Angle = ", str(Treadle_Angle, 3,0)) #debug "\n" #debug "####################################################" #debug "\n" /* #declare Wedge2 = difference { sphere {<0,0,0>, 1+Big_Radius+Belt_width/2} plane {x,0 rotate y*(theta2_d/2) inverse} plane {x,0 rotate -y*(theta2_d/2) } } //object {Wedge2} cylinder { , <5+Alternator_Offset+Alternator_Dia, Bottom, -2>, 0.5 } difference { cone{<5+Alternator_Offset+Alternator_Dia, Bottom, -2>, 2, <10+Alternator_Offset+Alternator_Dia/2, Bottom, -2>, 0 } box {<0.5, -3, 3> <1, 3, -3> translate x*(5+Alternator_Offset+Alternator_Dia) translate y*Bottom translate z*-2} box {<1.5, -3, 3> <2, 3, -3> translate x*(5+Alternator_Offset+Alternator_Dia) translate y*Bottom translate z*-2} no_shadow no_reflection } #declare Bolt_Head = intersection { difference { sphere { <0,0,0>, 1 texture { Rust finish {ambient 0} } } box { <-1.1, -0.15, -1.1> <-0.15, 0.15, 1.1> } } box {<-1,-1,-1><0.35, 1, 1>} scale <0.75, 1.5, 1.5> rotate -x*45 } #declare Bolt_Shaft = union { object { Disk_X scale <2.5, 0.75, 0.75 > } cone { <2.5, 0,0>, 0.75, <2.65,0,0>,0.55 } } #declare TW=0.5; #declare Thread = union { cone { <-TW/2,0,0>, 0.75, <0,0,0>,1 } cone { < 0.0,0,0>, 1.00, ,0.75 } rotate z*7 } #declare Bolt = union { object { Bolt_Head translate -x*2.5 } intersection { union { object { Bolt_Shaft } object { Thread translate x * 4.5 * TW } object { Thread translate x * 4.0 * TW } object { Thread translate x * 3.5 * TW } object { Thread translate x * 3.0 * TW } object { Thread translate x * 2.5 * TW } object { Thread translate x * 2.0 * TW } object { Thread translate x * 1.5 * TW } object { Thread translate x * 1.0 * TW } object { Thread translate x * 0.5 * TW } object { Thread translate x * 0.0 * TW } object { Thread translate -x * 0.5 * TW } object { Thread translate -x * 1.0 * TW } object { Thread translate -x * 1.5 * TW } object { Thread translate -x * 2.0 * TW } object { Thread translate -x * 2.5 * TW } object { Thread translate -x * 3.0 * TW } object { Thread translate -x * 3.5 * TW } object { Thread translate -x * 4.0 * TW } scale <1, 0.85, 0.85> } cylinder {<-3.5, 0, 0> <2.75, 0, 0>, 0.83 } } texture { Rust finish {ambient 0}} bounded_by { cylinder {<-3.45, 0,0> <2.5,0,0>,1.5 } } } //------------------------------------------------------------------- //#declare BoltHead = 0.25; //#declare Corner = radians(72.5); #declare Bolt = prism { linear_spline Small_Radius, 2*coupling_thickness, 7, , , , , , , } //object {Bolt scale 0.5 rotate -z*90 translate <0, (Top+Small_Radius+Belt_width/2)+Exploded1*4, 1.5+Belt_width*2>} // OLD Alternator Belt union { difference { torus {Big_Radius+Belt_width/2, Belt_width/2} box{ <0, -(1+Belt_width/2), 1+Big_Radius+Belt_width/2> <1+Big_Radius+Belt_width/2, 1+Belt_width/2, -0.5> } box{ <0,-(1+Belt_width/2), 1+Big_Radius+Belt_width/2> <1+Big_Radius+Belt_width/2, 1+Belt_width/2, -0.5> rotate -y*(theta_d-90)*0.97} } difference { torus {Small_Radius+Belt_width/2, Belt_width/2} box{ <-1, -(1+Belt_width/2), 1+Small_Radius+Belt_width/2> <1+Small_Radius+Belt_width/2, 1+Belt_width/2, 0> } box{ <-1,-(1+Belt_width/2), 1+Small_Radius+Belt_width/2> <1+Small_Radius+Belt_width/2, 1+Belt_width/2, 0> rotate y*(theta_d-90)*1.1} rotate -y*belt_angle rotate y*180 translate } cylinder { , , Belt_width/2} cylinder { <(Big_Radius+Belt_width/2)*cos(-theta_d*2), 0, (Big_Radius+Belt_width/2)*sin(-theta_d*2)>, , Belt_width/2} } // OLD Drive Belt union { difference { torus {Big_Radius+Belt_width/2, Belt_width/2} object {Wedge2} } difference { torus {Small_Radius+Belt_width/2, Belt_width/2} object {Wedge2 inverse} translate z*(Top-(Bottom+5)) } cylinder { <-(Big_Radius+(Belt_width/2))*sin(theta2_d/2), 0, (Big_Radius+(Belt_width/4))*cos(theta2_d/2)>, <-(Small_Radius+Belt_width/4)*sin(theta2_d/2), 0, (Top-(Bottom+5))+((Small_Radius-Belt_width/2)*sin(theta2_d/2))>, Belt_width/2 } cylinder { <(Big_Radius+Belt_width/2)*sin(theta2_d/2), 0, (Big_Radius+(Belt_width/4))*cos(theta2_d/2)>, <(Small_Radius+Belt_width/4)*sin(theta2_d/2), 0, (Top-(Bottom+5))+((Small_Radius-Belt_width/2)*sin(theta2_d/2))>, Belt_width/2} } ############################################################################################## // -------------- dimensions ----------- #local R1 = 0.15; // big wheel radius #local R2 = 0.075; // small wheel radius #local Dist = 0.30;// axis distance #local Link_N = 30;// number of links // -------------- calculations --------- #local Ri = R1-R2; #local C_Angle = degrees(asin(Ri/Dist)); // chain linear length #local LLen=sqrt(pow(Dist,2)-pow(Ri,2)); // segment angle and length #local Ang1 = 180+2*C_Angle; #local Ang2 = 180-2*C_Angle; #local Len1 = Ang1/360*2*pi*R1; #local Len2 = Ang2/360*2*pi*R2; // total length #local C_Len = 2*LLen+Len1+Len2; #local Link_L = C_Len / Link_N; #declare Link = // the chain link sphere{<0,0,0>,0.0075 texture{Chrome_Metal}} //-------------------------------------- #local Ani=clock*Link_Len;// animation! union{ //------------------------------- #local Nr = 0; // start loop #while (Nr < Link_N) #local Pos = mod(Nr*Link_L+Ani,C_Len); //------------------------------------- #if(Pos< Len1 ) // front down #local Rot1 = Pos/Len1*Ang1; object{Link translate<0,R1,0> rotate<0,0,-Rot1 +C_Angle>} #end //-------------------------------- #if((Pos>Len1) & (Pos<=Len1+LLen)) #local LPos = Pos-Len1; // base side object{Link translate<-LPos,-R1,0> rotate<0,0,-C_Angle>} #end //-------------------------------- #if((Pos>Len1+LLen ) // back up & (Pos<= Len1+LLen+Len2)) #local Rot2 = (Pos-Len1-LLen)/Len2*Ang2; object{Link translate<0,R2,0> rotate<0,0,-Rot2-C_Angle-180> translate<-Dist,0,0>} #end //-------------------------------- #if((Pos>Len1+LLen+Len2) // up forward & (Pos <= Len1+LLen+Len2+LLen)) #local LPos = Pos-(Len1+LLen+Len2); object{Link translate rotate<0,0,C_Angle> translate<-Dist,0,0>} #end //-------------------------------- #local Nr = Nr + 1; // next Nr #end // --------------- end of loop } */