/* Last edited on 2011-09-13 03:45:39 by stolfilocal */ /* _*_ latin-1 _*_ */ /* Bezier model of human body */ /* Coordinate axes are X = forwards, Y = right, Z = up. */ #include #include #include void bzb_foot_ymorph_shear(bzb_limb_t *L, bzb_foot_parms_t *pm); /* Applies a piecewise-bilinear {y} deformation to a control point {p} of an unmorphed foot model, assumed to have the correct {x,z} shape except for the {x}-shear. Leaves it with the desired shape but still with with unbent ankle. */ void bzb_foot_ankle_bend(bzb_limb_t *L, bzb_foot_parms_t *pm); /* Applies the requested bending and twisting deformation to the ankle. The foot below the ankle is rotated as a rigid object. */ bzb_limb_t *bzb_foot_build(bzb_foot_parms_t *pm) { /* Build model with correct {x,z} shape, but without {y}-morphing, shear, ankle bend: */ bzb_limb_t *L = bzb_foot_unmorphed_build(pm); /* Apply {Y}-morphing and shear: */ bzb_foot_ymorph_shear(L, pm); /* Apply ankle bend: */ bzb_foot_ankle_bend(L, pm); return L; } void bzb_foot_ymorph_shear(bzb_limb_t *L, bzb_foot_parms_t *pm) { auto r3_t morph_point(r3_t *p); r3_t morph_point(r3_t *p) { double px = p.c[0]; double py = p.c[1]; r3_t q; /* Morphed point. */ /* Decide which block contains {p} and apply the appropriate {X,Y} morphing: */ double btw = pm->bt->bw; /* Width of bit toe at base of fork. */ double stw = pm->bt->bw; /* Width of small toes at base of fork. */ double fkx = pm->r + pm->s; /* Start X of toe fork on inner side: */ double ttx = fkx + pm->s; /* Arbitrary X beyond toes: */ r2_t I0 = (r2_t){{ 00.0, - pm->r }}; r2_t M0 = (r2_t){{ 00.0, 00.0 }}; r2_t E0 = (r2_t){{ 00.0, + pm->r }}; r2_t I1 = (r2_t){{ fkx, - pm->r }}; r2_t M1 = (r2_t){{ fkx, - pm->r + btw }}; r2_t E1 = (r2_t){{ fkx - pm->d, - pm->r + btw + stw }}; r2_t I2 = (r2_t){{ ttx, - pm->r }}; r2_t M2 = (r2_t){{ ttx, - pm->r + btw }}; r2_t E2 = (r2_t){{ ttx - pm->d, - pm->r + btw + stw }}; if (px <= fkx) { /* Foot up to beginning of toe fork: */ if (py <= 0) { /* Inner (bigtoe) side of foot: */ q = bzb_morph_bilin_xy(p, 00.0, fkx, -1.0, 00.0, I0, M0, I1, M1); } else { /* Outer (smalltoes) side of foot: */ q = bzb_morph_bilin_xy(p, 00.0, fkx, 00.0, +1.00, M0, E0, M1, E1); } } else { /* Toe fork and toes: */ if (py <= 0) { /* Inner (bigtoe) side of foot: */ q = bzb_morph_bilin_xy(p, fkx, ttx, -1.0, 00.0, I1, M1, I2, M2); } else { /* Outer (smalltoes) side of foot: */ q = bzb_morph_bilin_xy(p, fkx, ttx, 00.0, +1.00, M1, E1, M2, E2); } } return q; } bzb_limb_morph(L, &morph_point); } void bzb_foot_ankle_bend(bzb_limb_t *L, bzb_foot_parms_t *pm) { auto r3_t morph_point(r3_t *p); r3_t morph_point(r3_t *p) { double px = p.c[0]; double py = p.c[1]; double pz = p.c[2]; double z1 = 00.0; double z0 = - pm->ah; double x0 = 00.0; double y0 = 00.0; r3_t q = p; /* Morphed point. */ /* Determine how much to bend (0 = nothing, 1 = full amount). */ double frac = NAN; if (pz > z1) { frac = 0.0; } else if ((hypot(px,py) <= 1.1*pm->r) && (pz >= z0)) { frac = (z1 - pz)/(z1 - z0); } else { frac = 1.0; } bzb_joint_bend(&q, x0,y0, z0,z1, frac, pm->u, pm->w); return q; } bzb_limb_morph(L, &morph_point); } bzb_foot_morph_reshape(bzb_limb_t *L, bzb_foot_parms_t *pm) { } bzb_foot_morph_ankle_bend(bzb_limb_t *L, bzb_foot_parms_t *pm) { bzb_foot_morph_reshape(L, pm); bzb_foot_ankle_bend(L, pm); } bzb_model_limb_t *bzb_foot_unmorphed_build(bzb_foot_parms_t *pm) { } bzb_model_limb_t bzb_bigtoecap(TF,BF,ra,fs,fw,fh,bt) /* {TF,BF} = 2x2 control arrays of previous (ankle) 4-patch ring, morphed. */ /* {ra} = lower radius of ankle. */ /* {fs} = actual foot length. */ /* {fw} = actual foot width. */ /* {fw} = actual foot height. */ /* {bt} = upward bend angle of big toe (degrees). */ /* Segment 5 (two 2-caps, toes): */ #local Tb5 = array[2][2]; #local Tb5[0][0] = bzb_foot_morph(< +2.90, -0.02, +0.25 >,ra,fs,fw,fh); #local Tb5[0][1] = bzb_foot_morph(< +2.95, -0.02, +0.25 >,ra,fs,fw,fh); #local Tb5[1][0] = bzb_foot_morph(< +2.90, -1.00, +0.25 >,ra,fs,fw,fh); #local Tb5[1][1] = bzb_foot_morph(< +2.95, -1.00, +0.25 >,ra,fs,fw,fh); #local Bb5 = array[2][2]; #local Bb5[0][0] = bzb_foot_morph(< +2.90, -0.02, 00.00 >,ra,fs,fw,fh); #local Bb5[0][1] = bzb_foot_morph(< +2.95, -0.02, 00.00 >,ra,fs,fw,fh); #local Bb5[1][0] = bzb_foot_morph(< +2.90, -1.00, 00.00 >,ra,fs,fw,fh); #local Bb5[1][1] = bzb_foot_morph(< +2.95, -1.00, 00.00 >,ra,fs,fw,fh); #local rad = 0.01*ra; union{ object{ bztube_ring4(Ta0,Ba0,Tb0,Bb0, Ta1,Ba1,Tb1,Bb1, Ta2,Ba2,Tb2,Bb2, tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_ring4(Ta1,Ba1,Tb1,Bb1, Ta2,Ba2,Tb2,Bb2, Ta3,Ba3,Tb3,Bb3, tx_bzB, tx_bzA, rad, tx_orange) } object{ bzb_toes(Ta2,Ba2,Tb2,Bb2,ra,fs,fw,fh,bta,btb) } translate -fh*z } /* MORPHATION MACROS */ void bzb_bend_ankle(p,x0,z0,z2,th) /* Maps {p} through a bending morphation. */ /* The morphation assumes a rod with straight axis at {x=x0} */ /* extending between the planes {z=z0} and {z=z1}. */ /* The morphation bends the axis isometrically */ /* in the {+x} diretion, turning it into an arc of circle */ /* covering an arc of {th} degrees. */ /* Each horizontal plane is mapped isometrically to a plane */ /* perpendicular to the arc. */ /* Points at or above the plane {z=z1} remain fixed. */ /* Points below {z0} follow the plane {z=z0} isometrically.. */ /* The {y} coordinate is not affected. */ #if ((abs(th) < 0.01) | (p.z >= z1)) #local q = p; #else #local tr = radians(th); /* Total bend angle (radians). */ #local R = (z1 - z0)/tr; /* Radius of arc. */ #local xc = x0 + R; /* Coord {x} of arc center. */ #local rp = p.x - xc; /* Radius of bent fiber through {p}. */ #if (p.z >= z0) #local tp = (z1 - p.z)/R; /* Angle of bend for horiz plane through {p} (radians). */ #local q = < xc - rp*cos(tp), p.y, z1 - rp*sin(tp) >; #else #local tp = tr; #local q0 = < xc - rp*cos(tp), p.y, z1 - rp*sin(tp) >; #local hp = z0 - p.z; #local q1 = < hp*sin(tp), 0, -hp*cos(tp) >; #local q = q0 + q1; #end #end q #end void bzb_bend_toe(p,x0,x1,z0,th) /* Maps {p} through a bending morphation. */ /* The morphation assumes a rod with straight axis at {z=z0} */ /* extending between the planes {x=x0} and {x=x1}. */ /* The morphation bends the axis isometrically */ /* in the {+z} direction, turning it into an arc of circle */ /* covering an arc of {th} degrees. */ /* Each vertical {y--z} plane is mapped isometrically to a plane */ /* perpendicular to the arc. */ /* Points with {x < x0} remain fixed. */ /* Points with {x > x1} follow the plane {x=x1} isometrically.. */ /* The {y} coordinate is not affected. */ #if ((abs(th) < 0.01) | (p.x < x0)) #local q = p; #else #local tr = radians(th); /* Total bend angle (radians). */ #local R = (x1 - x0)/tr; /* Radius of arc. */ #local zc = z0 + R; /* Coord {z} of arc center. */ #local rp = p.z - zc; /* Radius of bent fiber through {p}. */ #if (p.x <= x1) #local tp = (p.x - x0)/R; /* Angle of bend for {y--z} plane through {p} (radians). */ #local q = < x0 + rp*sin(tp), p.y, zc - rp*cos(tp) >; #else #local tp = tr; #local q0 = < x0 + rp*sin(tp), p.y, zc - rp*cos(tp) >; #local hp = p.x - x1; #local q1 = < hp*cos(tp), 0, hp*sin(tp) >; #local q = q0 + q1; #end #end q #end /* UNMORPHED MODEL */ void bzb_foot_ankle_set_cpoints(bzb_cquad_t *lip[]) /* Sets the 2x2 arrays {Ta,Ba,Tb,Bb} to the */ /* unmorphed free control points of the ankle joint (4-patch ring). */ /* Assumes that the ankle spans {x=[-1 _ +1]}, {y=[-1 _ +1]}, {z=[0.7 _ 1.0]} */ /* with the top edge on the plane {z=1}. */ #local lip[0]->cp[0] = < +0.50, +1.00, +0.90 >; #local lip[0]->cp[1] = < +0.50, +1.00, +0.80 >; #local lip[0]->cp[2] = < +0.90, +0.33, +0.90 >; #local lip[0]->cp[3] = < +0.90, +0.33, +0.80 >; #local lip[1]->cp[0] = < +0.90, -0.33, +0.90 >; #local lip[1]->cp[1] = < +0.90, -0.33, +0.80 >; #local lip[1]->cp[2] = < +0.50, -1.00, +0.90 >; #local lip[1]->cp[3] = < +0.50, -1.00, +0.80 >; #local lip[2]->cp[0] = < -0.50, -1.00, +0.90 >; #local lip[2]->cp[1] = < -0.50, -1.00, +0.80 >; #local lip[2]->cp[2] = < -0.90, -0.33, +0.90 >; #local lip[2]->cp[3] = < -0.90, -0.33, +0.80 >; #local lip[3][0][0] = < -0.50, +1.00, +0.90 >; #local lip[3][0][1] = < -0.50, +1.00, +0.80 >; #local lip[3][1][0] = < -0.90, +0.33, +0.90 >; #local lip[3][1][1] = < -0.90, +0.33, +0.80 >; #end void bzb_foot_heel_set_cpoints(bzb_cquad_t *lip[]) /* Sets the 2x2 arrays {bzb_cquad_t *lip[]} to the */ /* unmorphed free control points of the heel (a 4-patch ring). */ /* Assumes that the foot (minus ankle and toes) spans {x=[-1.5 _ +2]}, {y=[-1 _ +1]}, */ /* {z=[0 _ 0.7]} and the foot sole is at {z=0}. */ #local lip[0]->cp[0] = < +0.50, +1.00, +0.80*0.70 >; #local lip[0]->cp[1] = < +0.70, +1.00, +0.60*0.70 >; #local lip[0]->cp[2] = < +0.90, +0.33, +0.90*0.70 >; #local lip[0]->cp[3] = < +0.95, +0.33, +0.70*0.70 >; #local lip[1]->cp[0] = < +0.90, -0.33, +0.90*0.70 >; #local lip[1]->cp[1] = < +0.95, -0.33, +0.70*0.70 >; #local lip[1]->cp[2] = < +0.50, -1.00, +0.80*0.70 >; #local lip[1]->cp[3] = < +0.70, -1.00, +0.60*0.70 >; #local lip[2]->cp[0] = < -0.50, -1.00, +0.50*0.70 >; #local lip[2]->cp[1] = < -1.20, -1.00, 00.00*0.70 >; #local lip[2]->cp[2] = < -0.90, -0.33, +0.40*0.70 >; #local lip[2]->cp[3] = < -1.70, -0.33, 00.00*0.70 >; #local lip[3][0][0] = < -0.50, +1.00, +0.50*0.70 >; #local lip[3][0][1] = < -1.20, +1.00, 00.00*0.70 >; #local lip[3][1][0] = < -0.90, +0.33, +0.40*0.70 >; #local lip[3][1][1] = < -1.70, +0.33, 00.00*0.70 >; #end void bzb_foot_arch_set_cpoints(bzb_cquad_t *lip[]) /* Sets the 2x2 arrays {bzb_cquad_t *lip[]} to the */ /* unmorphed free control points of the foot arch (a 4-patch ring). */ /* Assumes that the foot (minus ankle and toes) spans {x=[-1.5 _ +2]}, {y=[-1 _ +1]}, */ /* {z=[0 _ 0.7]} and the foot sole is at {z=0}. */ #local lip[0]->cp[0] = < +1.20, +1.00, +0.65*0.70 >; #local lip[0]->cp[1] = < +1.80, +1.00, +0.45*0.70 >; #local lip[0]->cp[2] = < +1.30, +0.33, +0.65*0.70 >; #local lip[0]->cp[3] = < +1.90, +0.33, +0.45*0.70 >; #local lip[1]->cp[0] = < +1.30, -0.33, +0.65*0.70 >; #local lip[1]->cp[1] = < +1.90, -0.33, +0.45*0.70 >; #local lip[1]->cp[2] = < +1.20, -1.00, +0.65*0.70 >; #local lip[1]->cp[3] = < +1.80, -1.00, +0.45*0.70 >; #local lip[2]->cp[0] = < +1.10, -1.00, 00.00*0.70 >; #local lip[2]->cp[1] = < +1.60, -1.00, 00.00*0.70 >; #local lip[2]->cp[2] = < +1.40, -0.33, 00.00*0.70 >; #local lip[2]->cp[3] = < +1.80, -0.33, 00.00*0.70 >; #local lip[3][0][0] = < +1.10, +1.00, 00.00*0.70 >; #local lip[3][0][1] = < +1.60, +1.00, 00.00*0.70 >; #local lip[3][1][0] = < +1.40, +0.33, 00.00*0.70 >; #local lip[3][1][1] = < +1.80, +0.33, 00.00*0.70 >; #end void bzb_foot_fork_set_cpoints(bzb_cquad_t *lip3[], bzb_cquad_t *lip4[]) /* Sets the 2x2 arrays of unmorphed free control points of the foot-to-toes */ /* joints. */ /* {bzb_cquad_t *lip3[]} = 2x2 control arrays of toe 4-patch pre-fork. */ /* {bzb_cquad_t *lip4[]} = 2x2 control arrays of toe 4-patch pos-fork. */ /* Assumes that the fork and toes span {x=[+2 _ +3]}, {y=[-1 _ +1]}, */ /* {z=[0 _ 0.7]} and the foot sole is at {z=0}. */ /* Segment 3 (pre-fork, toe joints): */ #local lip3[0]->cp[0] = < +2.15, +1.00, +0.35*0.70 >; #local lip3[0]->cp[1] = < +2.35, +1.00, +0.35*0.70 >; #local lip3[0]->cp[2] = < +2.15, +0.33, +0.35*0.70 >; #local lip3[0]->cp[3] = < +2.35, +0.33, +0.35*0.70 >; #local lip3[1]->cp[0] = < +2.15, -0.33, +0.35*0.70 >; #local lip3[1]->cp[1] = < +2.35, -0.33, +0.35*0.70 >; #local lip3[1]->cp[2] = < +2.15, -1.00, +0.35*0.70 >; #local lip3[1]->cp[3] = < +2.35, -1.00, +0.35*0.70 >; #local lip3[2]->cp[0] = < +2.15, -1.00, 00.00*0.70 >; #local lip3[2]->cp[1] = < +2.35, -1.00, 00.00*0.70 >; #local lip3[2]->cp[2] = < +2.15, -0.33, 00.00*0.70 >; #local lip3[2]->cp[3] = < +2.35, -0.33, 00.00*0.70 >; #local lip3[3]->cp[0] = < +2.15, +0.33, 00.00*0.70 >; #local lip3[3]->cp[1] = < +2.35, +0.33, 00.00*0.70 >; #local lip3[3]->cp[2] = < +2.15, +1.00, 00.00*0.70 >; #local lip3[3]->cp[3] = < +2.35, +1.00, 00.00*0.70 >; /* Segment 4 (posfork, toes): */ #local lip4[0]->cp[0] = < +2.50, +1.00, +0.30*0.70 >; #local lip4[0]->cp[1] = < +2.60, +1.00, +0.30*0.70 >; #local lip4[0]->cp[2] = < +2.50, +0.02, +0.30*0.70 >; #local lip4[0]->cp[3] = < +2.60, +0.02, +0.30*0.70 >; #local lip4[1]->cp[0] = < +2.50, -0.02, +0.30*0.70 >; #local lip4[1]->cp[1] = < +2.70, -0.02, +0.30*0.70 >; #local lip4[1]->cp[2] = < +2.50, -1.00, +0.30*0.70 >; #local lip4[1]->cp[3] = < +2.70, -1.00, +0.30*0.70 >; #local lip4[2]->cp[0] = < +2.50, -1.00, 00.00*0.70 >; #local lip4[2]->cp[1] = < +2.70, -1.00, 00.00*0.70 >; #local lip4[2]->cp[2] = < +2.50, -0.02, 00.00*0.70 >; #local lip4[2]->cp[3] = < +2.70, -0.02, 00.00*0.70 >; #local lip4[3]->cp[0] = < +2.50, +0.02, 00.00*0.70 >; #local lip4[3]->cp[1] = < +2.60, +0.02, 00.00*0.70 >; #local lip4[3]->cp[2] = < +2.50, +1.00, 00.00*0.70 >; #local lip4[3]->cp[3] = < +2.60, +1.00, 00.00*0.70 >; #end void bzb_foot_bigtoecap_set_cpoints(T,B) /* Sets {T,B} the 2x2 arrays of unmorphed free control points of the big-toe cap */ /* (a 2-patch cap). Only the proximal coefs {T[i][0],B[i][0]} are relevant. */ #local lip[0]->cp[0] = < +2.90, -0.02, +0.25*0.70 >; #local lip[0]->cp[1] = < +2.95, -0.02, +0.25*0.70 >; #local lip[0]->cp[2] = < +2.90, -1.00, +0.25*0.70 >; #local lip[0]->cp[3] = < +2.95, -1.00, +0.25*0.70 >; #local lip[1]->cp[0] = < +2.90, -1.00, 00.00*0.70 >; #local lip[1]->cp[1] = < +2.95, -1.00, 00.00*0.70 >; #local lip[1]->cp[2] = < +2.90, -0.02, 00.00*0.70 >; #local lip[1]->cp[3] = < +2.95, -0.02, 00.00*0.70 >; #end void bzb_foot_smalltoescap_set_cpoints(bzb_cquad_t *lip[], ra,fs,fw,fh,bt) /* Sets {bzb_cquad_t *lip[]} the 2x2 arrays of unmorphed free control points of the small-toes cap */ /* (a 2-patch cap). Only the proximal coefs {T[i][0],B[i][0]} are relevant. */ #local lip[0]->cp[0] = < +2.80, +1.00, +0.25*0.70 >; #local lip[0]->cp[1] = < +2.85, +1.00, +0.25*0.70 >; #local lip[0]->cp[2] = < +2.80, +0.02, +0.25*0.70 >; #local lip[0]->cp[3] = < +2.85, +0.02, +0.25*0.70 >; #local lip[1]->cp[0] = < +2.80, +0.02, 00.00*0.70 >; #local lip[1]->cp[1] = < +2.85, +0.02, 00.00*0.70 >; #local lip[1]->cp[2] = < +2.80, +1.00, 00.00*0.70 >; #local lip[1]->cp[3] = < +2.85, +1.00, 00.00*0.70 >; #end /* JUNK ====================================================================== */ void bzb_foot_smalltoescap_set_cpoints(bzb_cquad_t *lip[], ra,fs,fw,fh,bt) /* {bzb_cquad_t *lip[]} = 2x2 control arrays of small toes 2-patch cap. */ /* {ra} = lower radius of ankle. */ /* {fs} = foot length. */ /* {fw} = foot width. */ /* {bt} = bend angle of toes. */ #local rad = 0.01*ra; union{ object{ bztube_ring4(lip0[0],lip0[3],lip0[1],lip0[2], lip1[0],lip1[3],lip1[1],lip1[2], lip2[0],lip2[3],lip2[1],lip2[2], tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_ring4(lip1[0],lip1[3],lip1[1],lip1[2], lip2[0],lip2[3],lip2[1],lip2[2], lip3[0],lip3[3],lip3[1],lip3[2], tx_bzB, tx_bzA, rad, tx_orange) } object{ bzb_toes(lip2[0],lip2[3],lip2[1],lip2[2],ra,fs,fw,fh,bta,btb) } translate -fh*z } #end void bzb_ankle_morph(p,ra,fh,ax,ay) /* Morphs ankle control point {p} from abstract ankle coordinates to real coordinates. */ /* {ra} = nominal ankle radius; */ /* {fs} = nominal foot length (from mid-ankle to toe base) */ /* {fw} = nominal foot width (at toe base). */ /* {fh} = nominal foot height (at base of ankle). */ /* Abstract coordinates: */ /* {x = -1.0} is back of ankle; */ /* {x = 00.0} is mid-ankle; */ /* {x = +1.0} is front of ankle; */ /* */ /* {y = -1.0} is inner edge of ankle; */ /* {y = 00.0} is line from mid-ankle to spce between bit toe and other toes; */ /* {y = +1.0} is outer edge of ankle; */ /* */ /* {z = 00.0} is ground; */ /* {z = +1.0} is joint of foot with ankle; */ #local new_x = ra*p.x; #local new_y = ra*p.y; #local new_z = fh*p.z; #local new_p = < new_x, new_y, new_z >; new_p #end void bzb_foot_morph(p,ra,fs,fw,fh) /* Morphs control point {p} from abstract coordinates to real coordinates. */ /* {ra} = nominal ankle radius; */ /* {fs} = nominal foot length (from mid-ankle to toe base) */ /* {fw} = nominal foot width (at toe base). */ /* {fh} = nominal foot height (at base of ankle). */ /* Abstract coordinates: */ /* {x = -0.5} is back of ankle; */ /* {x = 00.0} is mid-ankle; */ /* {x = +0.5} is front of ankle; */ /* {x = +1.0} is base of toes; */ /* */ /* {y = -1.0} is inner edge of foot; */ /* {y = 00.0} is line from mid-ankle to spce between bit toe and other toes; */ /* {y = +1.0} is outer edge of foot; */ /* */ /* {z = 00.0} is ground; */ /* {z = +1.0} is joint with ankle; */ #if (p.x <= 1) #local new_x = ra*p.x; #else #local new_x = ra + (fs - ra)*(p.x - 1.0); #end #local twd = (1-0.5*p.x)*2*ra + 0.5*p.x*fw; /* Scaled width of foot at this {x} */ #local bwd = ra*(1 - 0.05*p.x); /* Scaled width of inner half at this {x} */ #local awd = twd - bwd; /* Scaled width of outer half at this {x} */ #if (p.y < 0) #local new_y = bwd*(p.y + 1.0) - ra; #else #local new_y = bwd + awd*p.y - ra; #end #local new_z = fh*p.z; #local new_p = < new_x, new_y, new_z >; new_p #end void bzb_foot(lip0[0],lip0[3],lip0[1],lip0[2],ra,fs,fw,fh,bt) /* {lip0[0],lip0[3],lip0[1],lip0[2]} = 2x2 control arrays of previous (ankle) 4-patch ring. */ /* {ra} = lower radius of ankle. */ /* {fs} = foot length. */ /* {fw} = foot width. */ /* {bt} = bend angle of toes. */ /* Segment 1 (4-patch ring, heel): */ #local lip1[0] = array[2][2]; #local lip1[0]->cp[0] = bzb_foot_morph(< +0.50, +1.00, +0.80*0.70 >,ra,fs,fw,fh); #local lip1[0]->cp[1] = bzb_foot_morph(< +0.70, +1.00, +0.60*0.70 >,ra,fs,fw,fh); #local lip1[0]->cp[2] = bzb_foot_morph(< +0.90, +0.33, +0.90*0.70 >,ra,fs,fw,fh); #local lip1[0]->cp[3] = bzb_foot_morph(< +0.95, +0.33, +0.70*0.70 >,ra,fs,fw,fh); #local lip1[1] = array[2][2]; #local lip1[1]->cp[0] = bzb_foot_morph(< +0.90, -0.33, +0.90*0.70 >,ra,fs,fw,fh); #local lip1[1]->cp[1] = bzb_foot_morph(< +0.95, -0.33, +0.70 >,ra,fs,fw,fh); #local lip1[1]->cp[2] = bzb_foot_morph(< +0.50, -1.00, +0.80 >,ra,fs,fw,fh); #local lip1[1]->cp[3] = bzb_foot_morph(< +0.70, -1.00, +0.60 >,ra,fs,fw,fh); #local lip1[3] = array[2][2]; #local lip1[3]->cp[2] = bzb_foot_morph(< -0.50, +1.00, +0.50 >,ra,fs,fw,fh); #local lip1[3]->cp[3] = bzb_foot_morph(< -1.20, +1.00, 00.00 >,ra,fs,fw,fh); #local lip1[3]->cp[0] = bzb_foot_morph(< -0.90, +0.33, +0.40 >,ra,fs,fw,fh); #local lip1[3]->cp[1] = bzb_foot_morph(< -1.70, +0.33, 00.00 >,ra,fs,fw,fh); #local lip1[2] = array[2][2]; #local lip1[2]->cp[2] = bzb_foot_morph(< -0.90, -0.33, +0.40 >,ra,fs,fw,fh); #local lip1[2]->cp[3] = bzb_foot_morph(< -1.70, -0.33, 00.00 >,ra,fs,fw,fh); #local lip1[2]->cp[0] = bzb_foot_morph(< -0.50, -1.00, +0.50 >,ra,fs,fw,fh); #local lip1[2]->cp[1] = bzb_foot_morph(< -1.20, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 2 (4-patch ring, arch): */ #local lip2[0] = array[2][2]; #local lip2[0]->cp[0] = bzb_foot_morph(< +1.20, +1.00, +0.65 >,ra,fs,fw,fh); #local lip2[0]->cp[1] = bzb_foot_morph(< +1.80, +1.00, +0.45 >,ra,fs,fw,fh); #local lip2[0]->cp[2] = bzb_foot_morph(< +1.30, +0.33, +0.65 >,ra,fs,fw,fh); #local lip2[0]->cp[3] = bzb_foot_morph(< +1.90, +0.33, +0.45 >,ra,fs,fw,fh); #local lip2[1] = array[2][2]; #local lip2[1]->cp[0] = bzb_foot_morph(< +1.30, -0.33, +0.65 >,ra,fs,fw,fh); #local lip2[1]->cp[1] = bzb_foot_morph(< +1.90, -0.33, +0.45 >,ra,fs,fw,fh); #local lip2[1]->cp[2] = bzb_foot_morph(< +1.20, -1.00, +0.65 >,ra,fs,fw,fh); #local lip2[1]->cp[3] = bzb_foot_morph(< +1.80, -1.00, +0.45 >,ra,fs,fw,fh); #local lip2[3] = array[2][2]; #local lip2[3]->cp[2] = bzb_foot_morph(< +1.10, +1.00, 00.00 >,ra,fs,fw,fh); #local lip2[3]->cp[3] = bzb_foot_morph(< +1.60, +1.00, 00.00 >,ra,fs,fw,fh); #local lip2[3]->cp[0] = bzb_foot_morph(< +1.40, +0.33, 00.00 >,ra,fs,fw,fh); #local lip2[3]->cp[1] = bzb_foot_morph(< +1.80, +0.33, 00.00 >,ra,fs,fw,fh); #local lip2[2] = array[2][2]; #local lip2[2]->cp[2] = bzb_foot_morph(< +1.40, -0.33, 00.00 >,ra,fs,fw,fh); #local lip2[2]->cp[3] = bzb_foot_morph(< +1.80, -0.33, 00.00 >,ra,fs,fw,fh); #local lip2[2]->cp[0] = bzb_foot_morph(< +1.10, -1.00, 00.00 >,ra,fs,fw,fh); #local lip2[2]->cp[1] = bzb_foot_morph(< +1.60, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 3 (pre-fork, toe joints): */ #local lip3[0] = array[2][2]; #local lip3[0]->cp[0] = bzb_foot_morph(< +2.15, +1.00, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[1] = bzb_foot_morph(< +2.35, +1.00, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[2] = bzb_foot_morph(< +2.15, +0.33, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[3] = bzb_foot_morph(< +2.35, +0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1] = array[2][2]; #local lip3[1]->cp[0] = bzb_foot_morph(< +2.15, -0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[1] = bzb_foot_morph(< +2.35, -0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[2] = bzb_foot_morph(< +2.15, -1.00, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[3] = bzb_foot_morph(< +2.35, -1.00, +0.35 >,ra,fs,fw,fh); #local lip3[3] = array[2][2]; #local lip3[3]->cp[2] = bzb_foot_morph(< +2.15, +1.00, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[3] = bzb_foot_morph(< +2.35, +1.00, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[0] = bzb_foot_morph(< +2.15, +0.33, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[1] = bzb_foot_morph(< +2.35, +0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2] = array[2][2]; #local lip3[2]->cp[2] = bzb_foot_morph(< +2.15, -0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[3] = bzb_foot_morph(< +2.35, -0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[0] = bzb_foot_morph(< +2.15, -1.00, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[1] = bzb_foot_morph(< +2.35, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 4 (posfork, toes): */ #local lip4[0] = array[2][2]; #local lip4[0]->cp[0] = bzb_foot_morph(< +2.50, +1.00, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[1] = bzb_foot_morph(< +2.60, +1.00, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[2] = bzb_foot_morph(< +2.50, +0.02, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[3] = bzb_foot_morph(< +2.60, +0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1] = array[2][2]; #local lip4[1]->cp[0] = bzb_foot_morph(< +2.50, -0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[1] = bzb_foot_morph(< +2.70, -0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[2] = bzb_foot_morph(< +2.50, -1.00, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[3] = bzb_foot_morph(< +2.70, -1.00, +0.30 >,ra,fs,fw,fh); #local lip4[3] = array[2][2]; #local lip4[3]->cp[2] = bzb_foot_morph(< +2.50, +1.00, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[3] = bzb_foot_morph(< +2.60, +1.00, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[0] = bzb_foot_morph(< +2.50, +0.02, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[1] = bzb_foot_morph(< +2.60, +0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2] = array[2][2]; #local lip4[2]->cp[2] = bzb_foot_morph(< +2.50, -0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[3] = bzb_foot_morph(< +2.70, -0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[0] = bzb_foot_morph(< +2.50, -1.00, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[1] = bzb_foot_morph(< +2.70, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 5 (two 2-caps, toes): */ #local lip5[0] = array[2][2]; #local lip5[0]->cp[0] = bzb_foot_morph(< +2.80, +1.00, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[1] = bzb_foot_morph(< +2.85, +1.00, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[2] = bzb_foot_morph(< +2.80, +0.02, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[3] = bzb_foot_morph(< +2.85, +0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1] = array[2][2]; #local lip5[1]->cp[0] = bzb_foot_morph(< +2.90, -0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[1] = bzb_foot_morph(< +2.95, -0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[2] = bzb_foot_morph(< +2.90, -1.00, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[3] = bzb_foot_morph(< +2.95, -1.00, +0.25 >,ra,fs,fw,fh); #local lip5[3] = array[2][2]; #local lip5[3]->cp[2] = bzb_foot_morph(< +2.80, +1.00, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[3] = bzb_foot_morph(< +2.85, +1.00, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[0] = bzb_foot_morph(< +2.80, +0.02, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[1] = bzb_foot_morph(< +2.85, +0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2] = array[2][2]; #local lip5[2]->cp[2] = bzb_foot_morph(< +2.90, -0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[3] = bzb_foot_morph(< +2.95, -0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[0] = bzb_foot_morph(< +2.90, -1.00, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[1] = bzb_foot_morph(< +2.95, -1.00, 00.00 >,ra,fs,fw,fh); #local rad = 0.01*ra; union{ object{ bztube_ring4(lip0[0],lip0[3],lip0[1],lip0[2], lip1[0],lip1[3],lip1[1],lip1[2], lip2[0],lip2[3],lip2[1],lip2[2], tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_ring4(lip1[0],lip1[3],lip1[1],lip1[2], lip2[0],lip2[3],lip2[1],lip2[2], lip3[0],lip3[3],lip3[1],lip3[2], tx_bzB, tx_bzA, rad, tx_orange) } object{ bzb_toes(lip2[0],lip2[3],lip2[1],lip2[2],ra,fs,fw,fh,bta,btb) } translate -fh*z } #end void bzb_toes(lip2[0],lip2[3],lip2[1],lip2[2],ra,fs,fw,fh,bta,btb) /* {lip2[0],lip2[3],lip2[1],lip2[2]} = 2x2 control arrays of previous (foot arch) 4-patch ring. */ /* {ra} = lower radius of ankle. */ /* {fs} = foot length. */ /* {fw} = foot width. */ /* {bta} = bend angle of toes except big toe. */ /* {btb} = bend angle of big toe. */ /* Segment 3 (pre-fork, toe joints): */ #local lip3[0] = array[2][2]; #local lip3[0]->cp[0] = bzb_foot_morph(< +2.15, +1.00, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[1] = bzb_foot_morph(< +2.35, +1.00, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[2] = bzb_foot_morph(< +2.15, +0.33, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[3] = bzb_foot_morph(< +2.35, +0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1] = array[2][2]; #local lip3[1]->cp[0] = bzb_foot_morph(< +2.15, -0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[1] = bzb_foot_morph(< +2.35, -0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[2] = bzb_foot_morph(< +2.15, -1.00, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[3] = bzb_foot_morph(< +2.35, -1.00, +0.35 >,ra,fs,fw,fh); #local lip3[3] = array[2][2]; #local lip3[3]->cp[2] = bzb_foot_morph(< +2.15, +1.00, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[3] = bzb_foot_morph(< +2.35, +1.00, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[0] = bzb_foot_morph(< +2.15, +0.33, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[1] = bzb_foot_morph(< +2.35, +0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2] = array[2][2]; #local lip3[2]->cp[2] = bzb_foot_morph(< +2.15, -0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[3] = bzb_foot_morph(< +2.35, -0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[0] = bzb_foot_morph(< +2.15, -1.00, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[1] = bzb_foot_morph(< +2.35, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 4 (posfork, toes): */ #local lip4[0] = array[2][2]; #local lip4[0]->cp[0] = bzb_foot_morph(< +2.50, +1.00, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[1] = bzb_foot_morph(< +2.60, +1.00, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[2] = bzb_foot_morph(< +2.50, +0.02, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[3] = bzb_foot_morph(< +2.60, +0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1] = array[2][2]; #local lip4[1]->cp[0] = bzb_foot_morph(< +2.50, -0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[1] = bzb_foot_morph(< +2.70, -0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[2] = bzb_foot_morph(< +2.50, -1.00, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[3] = bzb_foot_morph(< +2.70, -1.00, +0.30 >,ra,fs,fw,fh); #local lip4[3] = array[2][2]; #local lip4[3]->cp[2] = bzb_foot_morph(< +2.50, +1.00, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[3] = bzb_foot_morph(< +2.60, +1.00, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[0] = bzb_foot_morph(< +2.50, +0.02, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[1] = bzb_foot_morph(< +2.60, +0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2] = array[2][2]; #local lip4[2]->cp[2] = bzb_foot_morph(< +2.50, -0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[3] = bzb_foot_morph(< +2.70, -0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[0] = bzb_foot_morph(< +2.50, -1.00, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[1] = bzb_foot_morph(< +2.70, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 5 (two 2-caps, toes): */ #local lip5[0] = array[2][2]; #local lip5[0]->cp[0] = bzb_foot_morph(< +2.80, +1.00, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[1] = bzb_foot_morph(< +2.85, +1.00, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[2] = bzb_foot_morph(< +2.80, +0.02, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[3] = bzb_foot_morph(< +2.85, +0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1] = array[2][2]; #local lip5[1]->cp[0] = bzb_foot_morph(< +2.90, -0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[1] = bzb_foot_morph(< +2.95, -0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[2] = bzb_foot_morph(< +2.90, -1.00, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[3] = bzb_foot_morph(< +2.95, -1.00, +0.25 >,ra,fs,fw,fh); #local lip5[3] = array[2][2]; #local lip5[3]->cp[2] = bzb_foot_morph(< +2.80, +1.00, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[3] = bzb_foot_morph(< +2.85, +1.00, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[0] = bzb_foot_morph(< +2.80, +0.02, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[1] = bzb_foot_morph(< +2.85, +0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2] = array[2][2]; #local lip5[2]->cp[2] = bzb_foot_morph(< +2.90, -0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[3] = bzb_foot_morph(< +2.95, -0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[0] = bzb_foot_morph(< +2.90, -1.00, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[1] = bzb_foot_morph(< +2.95, -1.00, 00.00 >,ra,fs,fw,fh); #local rad = 0.01*ra; union{ object{ bztube_prefork42(lip2[0],lip2[3],lip2[1],lip2[2], lip3[0],lip3[3],lip3[1],lip3[2], lip4[0],lip4[3],lip4[1],lip4[2], tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_posfork42(lip3[0],lip3[3],lip3[1],lip3[2], lip4[0],lip4[3],lip4[1],lip4[2], lip5[0],lip5[3],lip5[1],lip5[2], tx_bzB, tx_bzA, rad, tx_orange) } object{ bztube_cap2(lip4[0],lip4[3], lip5[0],lip5[3], tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_cap2(lip4[1],lip4[2], lip5[1],lip5[2], tx_bzB, tx_bzA, rad, tx_orange) } } #end void bzb_foot_arch_set_cpoints(lip0[0],lip0[3],lip0[1],lip0[2], ra,fs,fw,fh,bt) /* {lip0[0],lip0[3],lip0[1],lip0[2]} = 2x2 control arrays of previous (ankle) 4-patch ring. */ /* {ra} = lower radius of ankle. */ /* {fs} = foot length. */ /* {fw} = foot width. */ /* {bt} = bend angle of toes. */ /* Segment 1 (4-patch ring, heel): */ #local lip1[0] = array[2][2]; #local lip1[0]->cp[0] = bzb_foot_morph(< +0.50, +1.00, +0.80 >,ra,fs,fw,fh); #local lip1[0]->cp[1] = bzb_foot_morph(< +0.70, +1.00, +0.60 >,ra,fs,fw,fh); #local lip1[0]->cp[2] = bzb_foot_morph(< +0.90, +0.33, +0.90 >,ra,fs,fw,fh); #local lip1[0]->cp[3] = bzb_foot_morph(< +0.95, +0.33, +0.70 >,ra,fs,fw,fh); #local lip1[1] = array[2][2]; #local lip1[1]->cp[0] = bzb_foot_morph(< +0.90, -0.33, +0.90 >,ra,fs,fw,fh); #local lip1[1]->cp[1] = bzb_foot_morph(< +0.95, -0.33, +0.70 >,ra,fs,fw,fh); #local lip1[1]->cp[2] = bzb_foot_morph(< +0.50, -1.00, +0.80 >,ra,fs,fw,fh); #local lip1[1]->cp[3] = bzb_foot_morph(< +0.70, -1.00, +0.60 >,ra,fs,fw,fh); #local lip1[3] = array[2][2]; #local lip1[3]->cp[2] = bzb_foot_morph(< -0.50, +1.00, +0.50 >,ra,fs,fw,fh); #local lip1[3]->cp[3] = bzb_foot_morph(< -1.20, +1.00, 00.00 >,ra,fs,fw,fh); #local lip1[3]->cp[0] = bzb_foot_morph(< -0.90, +0.33, +0.40 >,ra,fs,fw,fh); #local lip1[3]->cp[1] = bzb_foot_morph(< -1.70, +0.33, 00.00 >,ra,fs,fw,fh); #local lip1[2] = array[2][2]; #local lip1[2]->cp[2] = bzb_foot_morph(< -0.90, -0.33, +0.40 >,ra,fs,fw,fh); #local lip1[2]->cp[3] = bzb_foot_morph(< -1.70, -0.33, 00.00 >,ra,fs,fw,fh); #local lip1[2]->cp[0] = bzb_foot_morph(< -0.50, -1.00, +0.50 >,ra,fs,fw,fh); #local lip1[2]->cp[1] = bzb_foot_morph(< -1.20, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 2 (4-patch ring, arch): */ #local lip2[0] = array[2][2]; #local lip2[0]->cp[0] = bzb_foot_morph(< +1.20, +1.00, +0.65 >,ra,fs,fw,fh); #local lip2[0]->cp[1] = bzb_foot_morph(< +1.80, +1.00, +0.45 >,ra,fs,fw,fh); #local lip2[0]->cp[2] = bzb_foot_morph(< +1.30, +0.33, +0.65 >,ra,fs,fw,fh); #local lip2[0]->cp[3] = bzb_foot_morph(< +1.90, +0.33, +0.45 >,ra,fs,fw,fh); #local lip2[1] = array[2][2]; #local lip2[1]->cp[0] = bzb_foot_morph(< +1.30, -0.33, +0.65 >,ra,fs,fw,fh); #local lip2[1]->cp[1] = bzb_foot_morph(< +1.90, -0.33, +0.45 >,ra,fs,fw,fh); #local lip2[1]->cp[2] = bzb_foot_morph(< +1.20, -1.00, +0.65 >,ra,fs,fw,fh); #local lip2[1]->cp[3] = bzb_foot_morph(< +1.80, -1.00, +0.45 >,ra,fs,fw,fh); #local lip2[3] = array[2][2]; #local lip2[3]->cp[2] = bzb_foot_morph(< +1.10, +1.00, 00.00 >,ra,fs,fw,fh); #local lip2[3]->cp[3] = bzb_foot_morph(< +1.60, +1.00, 00.00 >,ra,fs,fw,fh); #local lip2[3]->cp[0] = bzb_foot_morph(< +1.40, +0.33, 00.00 >,ra,fs,fw,fh); #local lip2[3]->cp[1] = bzb_foot_morph(< +1.80, +0.33, 00.00 >,ra,fs,fw,fh); #local lip2[2] = array[2][2]; #local lip2[2]->cp[2] = bzb_foot_morph(< +1.40, -0.33, 00.00 >,ra,fs,fw,fh); #local lip2[2]->cp[3] = bzb_foot_morph(< +1.80, -0.33, 00.00 >,ra,fs,fw,fh); #local lip2[2]->cp[0] = bzb_foot_morph(< +1.10, -1.00, 00.00 >,ra,fs,fw,fh); #local lip2[2]->cp[1] = bzb_foot_morph(< +1.60, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 3 (pre-fork, toe joints): */ #local lip3[0] = array[2][2]; #local lip3[0]->cp[0] = bzb_foot_morph(< +2.15, +1.00, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[1] = bzb_foot_morph(< +2.35, +1.00, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[2] = bzb_foot_morph(< +2.15, +0.33, +0.35 >,ra,fs,fw,fh); #local lip3[0]->cp[3] = bzb_foot_morph(< +2.35, +0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1] = array[2][2]; #local lip3[1]->cp[0] = bzb_foot_morph(< +2.15, -0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[1] = bzb_foot_morph(< +2.35, -0.33, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[2] = bzb_foot_morph(< +2.15, -1.00, +0.35 >,ra,fs,fw,fh); #local lip3[1]->cp[3] = bzb_foot_morph(< +2.35, -1.00, +0.35 >,ra,fs,fw,fh); #local lip3[3] = array[2][2]; #local lip3[3]->cp[2] = bzb_foot_morph(< +2.15, +1.00, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[3] = bzb_foot_morph(< +2.35, +1.00, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[0] = bzb_foot_morph(< +2.15, +0.33, 00.00 >,ra,fs,fw,fh); #local lip3[3]->cp[1] = bzb_foot_morph(< +2.35, +0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2] = array[2][2]; #local lip3[2]->cp[2] = bzb_foot_morph(< +2.15, -0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[3] = bzb_foot_morph(< +2.35, -0.33, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[0] = bzb_foot_morph(< +2.15, -1.00, 00.00 >,ra,fs,fw,fh); #local lip3[2]->cp[1] = bzb_foot_morph(< +2.35, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 4 (posfork, toes): */ #local lip4[0] = array[2][2]; #local lip4[0]->cp[0] = bzb_foot_morph(< +2.50, +1.00, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[1] = bzb_foot_morph(< +2.60, +1.00, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[2] = bzb_foot_morph(< +2.50, +0.02, +0.30 >,ra,fs,fw,fh); #local lip4[0]->cp[3] = bzb_foot_morph(< +2.60, +0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1] = array[2][2]; #local lip4[1]->cp[0] = bzb_foot_morph(< +2.50, -0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[1] = bzb_foot_morph(< +2.70, -0.02, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[2] = bzb_foot_morph(< +2.50, -1.00, +0.30 >,ra,fs,fw,fh); #local lip4[1]->cp[3] = bzb_foot_morph(< +2.70, -1.00, +0.30 >,ra,fs,fw,fh); #local lip4[3] = array[2][2]; #local lip4[3]->cp[2] = bzb_foot_morph(< +2.50, +1.00, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[3] = bzb_foot_morph(< +2.60, +1.00, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[0] = bzb_foot_morph(< +2.50, +0.02, 00.00 >,ra,fs,fw,fh); #local lip4[3]->cp[1] = bzb_foot_morph(< +2.60, +0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2] = array[2][2]; #local lip4[2]->cp[2] = bzb_foot_morph(< +2.50, -0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[3] = bzb_foot_morph(< +2.70, -0.02, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[0] = bzb_foot_morph(< +2.50, -1.00, 00.00 >,ra,fs,fw,fh); #local lip4[2]->cp[1] = bzb_foot_morph(< +2.70, -1.00, 00.00 >,ra,fs,fw,fh); /* Segment 5 (two 2-caps, toes): */ #local lip5[0] = array[2][2]; #local lip5[0]->cp[0] = bzb_foot_morph(< +2.80, +1.00, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[1] = bzb_foot_morph(< +2.85, +1.00, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[2] = bzb_foot_morph(< +2.80, +0.02, +0.25 >,ra,fs,fw,fh); #local lip5[0]->cp[3] = bzb_foot_morph(< +2.85, +0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1] = array[2][2]; #local lip5[1]->cp[0] = bzb_foot_morph(< +2.90, -0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[1] = bzb_foot_morph(< +2.95, -0.02, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[2] = bzb_foot_morph(< +2.90, -1.00, +0.25 >,ra,fs,fw,fh); #local lip5[1]->cp[3] = bzb_foot_morph(< +2.95, -1.00, +0.25 >,ra,fs,fw,fh); #local lip5[3] = array[2][2]; #local lip5[3]->cp[2] = bzb_foot_morph(< +2.80, +1.00, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[3] = bzb_foot_morph(< +2.85, +1.00, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[0] = bzb_foot_morph(< +2.80, +0.02, 00.00 >,ra,fs,fw,fh); #local lip5[3]->cp[1] = bzb_foot_morph(< +2.85, +0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2] = array[2][2]; #local lip5[2]->cp[2] = bzb_foot_morph(< +2.90, -0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[3] = bzb_foot_morph(< +2.95, -0.02, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[0] = bzb_foot_morph(< +2.90, -1.00, 00.00 >,ra,fs,fw,fh); #local lip5[2]->cp[1] = bzb_foot_morph(< +2.95, -1.00, 00.00 >,ra,fs,fw,fh); #local rad = 0.01*ra; union{ object{ bztube_ring4(lip0[0],lip0[3],lip0[1],lip0[2], lip1[0],lip1[3],lip1[1],lip1[2], lip2[0],lip2[3],lip2[1],lip2[2], tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_ring4(lip1[0],lip1[3],lip1[1],lip1[2], lip2[0],lip2[3],lip2[1],lip2[2], lip3[0],lip3[3],lip3[1],lip3[2], tx_bzB, tx_bzA, rad, tx_orange) } object{ bzb_toes(lip2[0],lip2[3],lip2[1],lip2[2],ra,fs,fw,fh,bta,btb) } translate -fh*z } #end