# A nice table fan model # Written for Irit by # Uriel Cohen & Yaniv Frishman # Januar 1996 ###### Fan Body # cross curve - cross-section of the base of the fan CURVE1 = cbspline(3, list( ctlpt(P3,1.000000, -0.567951, 0, 0.383367), ctlpt(P3,1.000000, 0.401623, 0, 0.383367), ctlpt(P3,1.000000, 0.466531, 0, 0.330629), ctlpt(P3,1.000000, 0.523327, 0, 0.229209), ctlpt(P3,1.000000, 0.519270, 0, 0.176471), ctlpt(P3,1.000000, 0.462475, 0, 0.176471), ctlpt(P3,1.000000, 0.462475, 0, 0.139959) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 4.000000, 5.000000, 5.000000, 5.000000 ) ); # trans to min x=0, min z = 0 CROSS_1_1 = CURVE1 * trans(vector(0.567951, 0, -0.139959)); # generate reflection matrices REF_Z_MAT = homomat( list( list( 1, 0, 0, 0 ), list( 0, 1, 0, 0 ), list( 0, 0, -1, 0 ), list( 0, 0, 0, 1 ) ) ); REF_X_MAT = homomat( list( list( -1, 0, 0, 0 ), list( 0, 1, 0, 0 ), list( 0, 0, 1, 0 ), list( 0, 0, 0, 1 ) ) ); REF_Y_MAT = homomat( list( list( 1, 0, 0, 0), list( 0,-1, 0, 0), list( 0, 0, 1, 0), list( 0, 0, 0, 1))); # 3 symmetrical cross curves CROSS_1_N1 = CROSS_1_1 * REF_Z_MAT; CROSS_N1_1 = CROSS_1_1 * REF_X_MAT; CROSS_N1_N1 = CROSS_N1_1 * REF_Z_MAT; attrib(CROSS_1_N1, "rgb", "255, 255, 255" ): attrib(CROSS_N1_1, "rgb", "255, 55, 255" ): attrib(CROSS_N1_N1, "rgb", "55, 55, 255" ): # add into one curve and generate (ruled) surface CROSS_TOP = (-CROSS_1_1) + (CROSS_N1_1); CROSS_BOT= CROSS_TOP * REF_Z_MAT; CROSS = CROSS_TOP + (-CROSS_BOT); CROSS_COVER = ruledsrf(CROSS_TOP, CROSS_BOT); # axis curve CURVE2 = cbspline(3, list( ctlpt(P3,1.000000, 1.498638, 0, -1.934775), ctlpt(P3,1.000000, 0.430063, 0, -1.908922), ctlpt(P3,1.000000, -0.397222, 0, -1.883070), ctlpt(P3,1.000000, -1.967767, 0, -1.785409), ctlpt(P3,1.000000, -1.899913, 0, -0.750635), ctlpt(P3,1.000000, -1.017810, 0, 0.122985), ctlpt(P3,1.000000, -0.576759, 0, 0.589482), ctlpt(P3,1.000000, -0.195080, 0, 1.055978), ctlpt(P3,1.000000, 0.203562, 0, 1.547920), ctlpt(P3,1.000000, 0.203562, 0, 2.039861), ctlpt(P3,1.000000, 0.203562, 0, 2.07) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 4.000000, 5.000000, 6.000000, 7.000000, 8.000000, 9.000000, 9.000000, 9 ) ); # scale curve SCURVE3 = cbezier(list(ctlpt(E2, 0, 1), ctlpt(E2, 0.5, 0.35), ctlpt(E2, 1, 0.3))); # rotate and scale CURVE1 = CROSS * rotx(90); CURVE2_TRANS = rotx(90) * roty(90) * SCALE(VECTOR(0.8, 0.8, 0.8)); CURVE2 = CURVE2 * CURVE2_TRANS; ###### Top and Bottom Covers of Fan Base Surface BASE_COVER = CROSS_COVER * rotx(90) * trans(vector(1.498638, 0, -1.934775) * CURVE2_TRANS); TOP_COVER = CROSS_COVER * scale(vector(0.3, 0.3, 0.3)) * trans(vector(0.203562, 0, 2.07) * CURVE2_TRANS); attrib(BASE_COVER,"rgb","255, 255, 255"); attrib(TOP_COVER,"rgb","255, 255, 255"); ###### Fan Base # generate fan base using swept surface FAN_BASE = swpsclsrf(CURVE1, CURVE2, SCURVE3, VECTOR(0, 0, 1), 2); attrib(FAN_BASE,"rgb","255, 255, 255"); ###### Switches SWITCH_BASE = box(vector(0, 0, 0), 1, 0.4, 0.05); BUTTON = box(vector(0, 0, 0), 0.16, 0.16, 0.16); BUTTON0 = BUTTON * trans(vector(0.22, 0.12, 0.03)); BUTTON1 = BUTTON0 * trans(vector(0.2, 0, 0)); BUTTON2 = BUTTON1 * trans(vector(0.2, 0, 0)); OUT_BOX = box(vector(0.2, 0.1, 0.02), 0.6, 0.2, 0.1); SWITCH_BASE = SWITCH_BASE - OUT_BOX; attrib(BUTTON0, "rgb", "100, 100, 100" ); attrib(BUTTON0, "rgb", "200, 150, 150" ); attrib(BUTTON1, "rgb", "255, 200, 200" ); attrib(BUTTON2, "rgb", "255, 0, 0" ); attrib(SWITCH_BASE, "rgb", "25, 25, 255" ); SWITCHES = list(SWITCH_BASE, BUTTON0, BUTTON1, BUTTON2); SWITCHES = SWITCHES * rotx(90) * trans(vector(1.498638, 0, -1.934775) * CURVE2_TRANS); SWITCHES = SWITCHES * trans(vector(-0.5, -0.235, 0.2)); ###### Joint Between Body and Engine # generate 2 bounding curves of joint JOINT_BASE = CROSS * scale(vector(0.3, 0.3, 0.3)) * trans(vector(0.203562, 0, 2.07) * CURVE2_TRANS); JOINT_TOP = CROSS* scale(vector(0.3, 0.3, 0.3)) * scale(vector(1, 1, 1.3))* trans(vector(0.203562, 0, 2.07) * CURVE2_TRANS); JOINT_TOP = JOINT_TOP * trans(vector(0,-0.5,0)); JOINT_VOL = ruledsrf(JOINT_BASE, JOINT_TOP); ###### Joint Screw JOINT_SCREW = cylin(vector(0, 0, 0), vector(0.7, 0, 0), 0.04); JOINT_SCREW = JOINT_SCREW * trans(vector(-0.35, -0.35, 0)); #move to middle of joint JOINT_MID_TRANS = trans(vector(0.203562, 0, 2.07) * CURVE2_TRANS); JOINT_SCREW = JOINT_SCREW * JOINT_MID_TRANS; attrib(JOINT_SCREW, "rgb", "255, 0, 120"); # box to remove from joint volume JOINT_OUT_BOX = box(vector(0, 0, 0), 0.2, 0.35, 0.2) * trans(Vector(0, -0.1, 0)); JOINT_OUT_BOX = JOINT_OUT_BOX * JOINT_MID_TRANS * trans(vector(-0.1, -0.07, -0.07)); #move to middle of joint;; JOINT_OUT_BOX = JOINT_OUT_BOX * scale(vector(1.3, 1.3, 1.3)); JOINT_OUT_BOX = JOINT_OUT_BOX - JOINT_SCREW; attrib(JOINT_OUT_BOX, "rgb", "0, 255, 0"); ################ ################ ## FIX HERE (Closing the object) JOINT_VOL = JOINT_VOL * box(vector(0.6, -1.66, 0.0), -1.2, -0.48, -0.3); JOINT_CSG_BOX = JOINT_OUT_BOX * scale(vector(1.15, 1, 1)) * trans(vector(0,0.07,0)); JOINT_VOL = JOINT_VOL - JOINT_CSG_BOX; JOINT_VOL = JOINT_VOL - JOINT_SCREW; attrib(JOINT_VOL,"rgb","255, 255, 255"); ###### Engine ENGINE_CROSS_N1 = cbspline(3, list( ctlpt(P3, 1.000000, -0.402740, 0, 0.591781), ctlpt(P3, 1.000000, -0.558904, 0, 0.591781), ctlpt(P3, 1.000000, -0.780822, 0, 0.594521), ctlpt(P3, 1.000000, -0.830137, 0, 0.534247), ctlpt(P3, 1.000000, -0.865753, 0, 0.386301), ctlpt(P3, 1.000000, -0.865753, 0, 0.216438), ctlpt(P3, 1.000000, -0.865753, 0, 0.027397), ctlpt(P3, 1.000000, -0.865753, 0, -0.131507), ctlpt(P3, 1.000000, -0.830137, 0, -0.224658), ctlpt(P3, 1.000000, -0.780822, 0, -0.265753), ctlpt(P3, 1.000000, -0.558904, 0, -0.265753), ctlpt(P3, 1.000000, -0.402740, 0, -0.265753) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 4.000000, 5.000000, 6.000000, 7.000000, 8.000000, 9.000000, 10.000000, 10.000000, 10.000000 ) ); ENGINE_CROSS_N1 = ENGINE_CROSS_N1 * trans(Vector(0.402740, 0.265753, 0)); ENGINE_CROSS_1 = ENGINE_CROSS_N1 * REF_X_MAT; BACK_ENG_COVER = ruledsrf(ENGINE_CROSS_1, ENGINE_CROSS_N1); ENG_MAT = scale(Vector(1.2, 1.2, 1.2)) * trans(Vector(0, 1.3, 0)); FRONT_ENG_COVER = BACK_ENG_COVER * ENG_MAT; ENG_COVER_CROSS_BACK = ENGINE_CROSS_N1 + (-ENGINE_CROSS_1); ENG_COVER_CROSS_FRONT = ENG_COVER_CROSS_BACK * ENG_MAT; ENG_COVER = ruledsrf(ENG_COVER_CROSS_BACK, ENG_COVER_CROSS_FRONT); ENGINE = list(BACK_ENG_COVER, FRONT_ENG_COVER, ENG_COVER); ENGINE = ENGINE * scale(Vector(1.25, 1.25, 1.25)) * rotx(-90) * trans(Vector(0, -3.2, 1.35)); #RECT_HOLE = ctlpt(E2, 2, 0.25) + ctlpt(E2, 2, 0.75) + ctlpt(E2, 2.5, 0.75) + ctlpt(E2, 2.5, 0.25) + ctlpt(E2, 2, 0.25); #RECT_HOLE = RECT_HOLE * trans(Vector(0, 0.2, 0)); #BACK_ENG_COVER = trimsrf(BACK_ENG_COVER, RECT_HOLE, false); ###### Handle # scaling curve for main part of handle SCALE_CURVE = CBSPLINE(3, list( ctlpt(P2, 1.000000, -0.653144, 1.000000), ctlpt(P2, 1.000000, -0.515213, 1.000000), ctlpt(P2, 1.000000, -0.365112, 0.951318), ctlpt(P2, 1.000000, -0.251521, 0.841785), ctlpt(P2, 1.000000, -0.150101, 0.780933), ctlpt(P2, 1.000000, -0.024341, 0.728195), ctlpt(P2, 1.000000, 0.101420, 0.707911), ctlpt(P2, 1.000000, 0.206897, 0.707911) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 4.000000, 5.000000, 6.000000, 6.000000, 6.000000 ) ); pt = nil(); pt_crvtr = nil(); for ( i = 0, 0.5, 6, ( pt = ceval( SCALE_CURVE, i ) ): snoc(circle(vector(0, 1-coord(pt, 2), i*0.25), coord(pt, 2)), pt_crvtr) ); HANDLE = sfromcrvs(pt_crvtr, 3); attrib(HANDLE, "rgb", "55, 55, 255" ): HANDLE1 = HANDLE * REF_Z_MAT; HANDLE_F1 = list(HANDLE, HANDLE1); HANDLE_F2 = HANDLE_F1 * trans(vector(0, 0, 3)); HANDLE_FN1 = HANDLE_F1 * trans(vector(0, 0, -3)); HANDLE_FN2 = HANDLE_FN1 * trans(vector(0, 0, -3)); # handle side (conn. to body) HANDLE_SIDE_AXIS = CBSPLINE(3, list( ctlpt(P3, 1.000000, -0.519270, 0, 0.204868), ctlpt(P3, 1.000000, -0.401623, 0, 0.204868), ctlpt(P3, 1.000000, -0.186613, 0, 0.196755), ctlpt(P3, 1.000000, -0.170385, 0, -0.042596), ctlpt(P3, 1.000000, -0.170385, 0, -0.123732) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 3.000000, 3.000000 ) ); HANDLE_SIDE_AXIS = HANDLE_SIDE_AXIS * trans(vector(0.170385, 0, 0.123732)); HANDLE_SIDE_AXIS = HANDLE_SIDE_AXIS * scale(vector(8.5,8.5,8.5)); HANDLE_SIDE_AXIS = HANDLE_SIDE_AXIS * rotz(90); SIDE_CROSS = circle(vector(0,0,0),0.707911); HANDLE_CURVE1 = sweepsrf(SIDE_CROSS, HANDLE_SIDE_AXIS,vector(1,0,0)); attrib(HANDLE_CURVE1, "rgb", "55, 55, 255" ): HANDLE_CURVE1 = HANDLE_CURVE1 * trans(vector(0, 1-0.707911, 4.5)); HANDLE_CURVE2 = HANDLE_CURVE1 * REF_Z_MAT * trans(vector(0, 0, -3)); F_HANDLE = list(HANDLE_F1,HANDLE_F2,HANDLE_FN1,HANDLE_FN2,HANDLE_CURVE1,HANDLE_CURVE2); F_HANDLE = F_HANDLE * trans(vector(0, 0, 1.5)) * scale(vector(0.05, 0.05, 0.05)) * roty(90) * rotx(180) * trans(Vector(0, -3.7, 0)); ###### Defining the fan FAN = list(FAN_BASE, BASE_COVER, TOP_COVER, SWITCHES, JOINT_VOL, JOINT_SCREW, JOINT_OUT_BOX, ENGINE,F_HANDLE); ###### Fan Blades CURVE1 = CBSPLINE(3, list( ctlpt(P3, 1.000000, 0.104854, 0, 0.466768), ctlpt(P3, 1.000000, 0.104854, 0, 0.324708), ctlpt(P3, 1.000000, 0.121766, 0, 0.054118) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 1.000000, 1.000000 ) ); CURVE2 = CBSPLINE(3, list( ctlpt(P3, 1.000000, 0.311179, 0, 0.544563), ctlpt(P3, 1.000000, 0.345003, 0, 0.409268), ctlpt(P3, 1.000000, 0.338238, 0, 0.277355), ctlpt(P3, 1.000000, 0.246914, 0, -0.094707) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 2.000000, 2.000000 ) ); CURVE3 = CBSPLINE(3, list( ctlpt(P3, 1.000000, 0.432944, 0, 0.869271), ctlpt(P3, 1.000000, 0.520886, 0, 0.700152), ctlpt(P3, 1.000000, 0.635887, 0, 0.338238), ctlpt(P3, 1.000000, 0.483680, 0, -0.189413), ctlpt(P3, 1.000000, 0.487062, 0, -0.182648) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 3.000000, 3.000000 ) ); CURVE4 = CBSPLINE(3, list( ctlpt(P3, 1.000000, 0.527651, 0, 1.112802), ctlpt(P3, 1.000000, 0.761035, 0, 0.757653), ctlpt(P3, 1.000000, 0.892948, 0, 0.257061), ctlpt(P3, 1.000000, 0.825300, 0, -0.206325) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 2.000000, 2.000000 ) ); CURVE5 = CBSPLINE(3, list( ctlpt(P3, 1.000000, 0.531033, 0, 1.109420), ctlpt(P3, 1.000000, 0.713682, 0, 1.217656), ctlpt(P3, 1.000000, 0.950448, 0, 1.072214), ctlpt(P3, 1.000000, 1.217656, 0, 0.744123), ctlpt(P3, 1.000000, 1.251480, 0, 0.304414), ctlpt(P3, 1.000000, 1.146626, 0, -0.094707), ctlpt(P3, 1.000000, 0.825300, 0, -0.206325) ), list( 0.000000, 0.000000, 0.000000, 1.000000, 2.000000, 3.000000, 4.000000, 5.000000, 5.000000, 5.000000 ) ); BLADE_CURVES = list(CURVE1,CURVE2,CURVE3,CURVE4,CURVE5); BLADE1 = sfromcrvs(BLADE_CURVES,3) * rotx(-20); BLADE2 = BLADE1 * roty(120); BLADE3 = BLADE1 * roty(240); BLADES = list(BLADE1, BLADE2, BLADE3) * trans(vector(0, -0.4, 0)); ###### Center Parabolic Cone (Blades Holder) TOURBINE_PROF = cbezier(list(ctlpt(P3, 1, -0.013699, 0, 0.646575), ctlpt(P3, 1, -0.419178, 0, 0.512329), ctlpt(P3, 1, -0.504110, 0, 0.093151), ctlpt(P3, 1, -0.493151, 0, -0.09863))); TOURBINE_PROF = TOURBINE_PROF * trans(vector(0.013699, 0, 0.09863)); TOURB_CONE = surfrev(TOURBINE_PROF); ARC_CURVE1 = arc(vector(0.493151-0.013699, 0, 0), vector(0, 0, 0), vector(0, 0.493151-0.013699, 0)) + arc(vector(0, 0.493151-0.013699, 0), vector(0, 0, 0), vector(-0.493151+0.013699, 0, 0)); ARC_CURVE2 = ARC_CURVE1 * REF_Y_MAT; TOURB_BASE = ruledsrf(ARC_CURVE1, ARC_CURVE2); SHAFT = cylin(vector(0, 0, 0), vector(0, 0, -0.3), 0.25); TOURBINE = list(TOURB_BASE, TOURB_CONE, SHAFT) * rotx(90); #CLOSED_TOURBINE = TOURB_CONE * box(vector(-1, -1, -1), 2, 2, 2); #ROTOR = CLOSED_TOURBINE + BLADE1 + BLADE2 + BLADE3; ROTOR = list(TOURBINE, BLADES); ###### Fan Net ELLIPSE = circle(vector(0, 0, 0), 1) * scale(vector(0.4, 1, 1)); CROSS_NET = circle(vector(0, 0, 0), 0.005); ELLIPSE0 = sweepsrf(CROSS_NET, ELLIPSE, vector(0, 0, 1)); ELLIPSE1 = ELLIPSE0 * rotx(30); ELLIPSE2 = ELLIPSE1 * rotx(30); ELLIPSE3 = ELLIPSE2 * rotx(30); ELLIPSE4 = ELLIPSE3 * rotx(30); ELLIPSE5 = ELLIPSE4 * rotx(30); CIRCLE_NET = circle(vector(0, 0, 0), 1); CIRCLE0 = sweepsrf(CROSS_NET, CIRCLE_NET, vector(0, 0, 1)) * roty(90); CIRCLES = nil(); for (i=0.0833, 0.1666, 0.9163, XCOORD = 0.4*COS(ASIN(i)) : CIRCLE_NET = circle(vector(0, 0, XCOORD), i) : snoc(sweepsrf(CROSS_NET, CIRCLE_NET, vector(0, 0, 1)) * roty(90), CIRCLES) : CIRCLE_NET = circle(vector(0, 0, -XCOORD), i) : snoc(sweepsrf(CROSS_NET, CIRCLE_NET, vector(0, 0, 1)) * roty(90), CIRCLES) ); snoc(CIRCLE0, CIRCLES); NET = list(ELLIPSE0, ELLIPSE1, ELLIPSE2, ELLIPSE3, ELLIPSE4, ELLIPSE5, CIRCLES); ###### Putting Things into Place ROTOR = ROTOR * rotz(90) * trans(vector(-0.26, 0, 0)); attrib(ROTOR, "rgb", "0, 255, 0"); NET = NET * scale(vector(1.6, 1.6, 1.6)); attrib(NET, "rgb", "195, 200, 180"); ROTOR_NET = list(ROTOR, NET) * scale(vector(1.1, 1.6, 1.6)); ROTOR_NET = ROTOR_NET * roty(90) * trans(vector(0, -3, -1.35)); ###### Final Model FAN_MODEL = list(ROTOR_NET, FAN); #save("fan_dat",FAN_MODEL); interact(FAN_MODEL);