// Last edited on 2011-09-12 03:31:17 by stolfilocal // _*_ latin-1 _*_ // Bezier model of human body // Coordinate axes are X = forwards, Y = right, Z = up. #include "bzpatch.inc" #macro bzbody_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 #macro bzbody_ankle_set_cpoints(Ta,Ba,Tb,Bb,ra,fh,ax,ay) // Sets the 2x2 arrays {Ta,Ba,Tb,Bb} to the // free control points of the ankle joint, // {ra} = nominal ankle radius. // {fh} = nominal foot height. // {ax} = ankle rotation angle around {x} axis. // {ay} = ankle rotation angle around {y} axis. #local Ta[0][0] = bzbody_ankle_morph(< +0.50, +1.00, +1.20 >,ra,fh,ax,ay); #local Ta[0][1] = bzbody_ankle_morph(< +0.50, +1.00, +1.10 >,ra,fh,ax,ay); #local Ta[1][0] = bzbody_ankle_morph(< +0.90, +0.33, +1.20 >,ra,fh,ax,ay); #local Ta[1][1] = bzbody_ankle_morph(< +0.90, +0.33, +1.10 >,ra,fh,ax,ay); #local Tb[0][0] = bzbody_ankle_morph(< +0.90, -0.33, +1.20 >,ra,fh,ax,ay); #local Tb[0][1] = bzbody_ankle_morph(< +0.90, -0.33, +1.10 >,ra,fh,ax,ay); #local Tb[1][0] = bzbody_ankle_morph(< +0.50, -1.00, +1.20 >,ra,fh,ax,ay); #local Tb[1][1] = bzbody_ankle_morph(< +0.50, -1.00, +1.10 >,ra,fh,ax,ay); #local Ba[0][0] = bzbody_ankle_morph(< -0.50, +1.00, +1.20 >,ra,fh,ax,ay); #local Ba[0][1] = bzbody_ankle_morph(< -0.50, +1.00, +1.10 >,ra,fh,ax,ay); #local Ba[1][0] = bzbody_ankle_morph(< -0.90, +0.33, +1.20 >,ra,fh,ax,ay); #local Ba[1][1] = bzbody_ankle_morph(< -0.90, +0.33, +1.10 >,ra,fh,ax,ay); #local Bb[0][0] = bzbody_ankle_morph(< -0.90, -0.33, +1.20 >,ra,fh,ax,ay); #local Bb[0][1] = bzbody_ankle_morph(< -0.90, -0.33, +1.10 >,ra,fh,ax,ay); #local Bb[1][0] = bzbody_ankle_morph(< -0.50, -1.00, +1.20 >,ra,fh,ax,ay); #local Bb[1][1] = bzbody_ankle_morph(< -0.50, -1.00, +1.10 >,ra,fh,ax,ay); #end #macro bzbody_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 #macro bzbody_foot(Ta0,Ba0,Tb0,Bb0,ra,fs,fw,fh,bt) // {Ta0,Ba0,Tb0,Bb0} = 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 Ta1 = array[2][2]; #local Ta1[0][0] = bzbody_foot_morph(< +0.50, +1.00, +0.80 >,ra,fs,fw,fh); #local Ta1[0][1] = bzbody_foot_morph(< +0.70, +1.00, +0.60 >,ra,fs,fw,fh); #local Ta1[1][0] = bzbody_foot_morph(< +0.90, +0.33, +0.90 >,ra,fs,fw,fh); #local Ta1[1][1] = bzbody_foot_morph(< +0.95, +0.33, +0.70 >,ra,fs,fw,fh); #local Tb1 = array[2][2]; #local Tb1[0][0] = bzbody_foot_morph(< +0.90, -0.33, +0.90 >,ra,fs,fw,fh); #local Tb1[0][1] = bzbody_foot_morph(< +0.95, -0.33, +0.70 >,ra,fs,fw,fh); #local Tb1[1][0] = bzbody_foot_morph(< +0.50, -1.00, +0.80 >,ra,fs,fw,fh); #local Tb1[1][1] = bzbody_foot_morph(< +0.70, -1.00, +0.60 >,ra,fs,fw,fh); #local Ba1 = array[2][2]; #local Ba1[0][0] = bzbody_foot_morph(< -0.50, +1.00, +0.50 >,ra,fs,fw,fh); #local Ba1[0][1] = bzbody_foot_morph(< -1.20, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba1[1][0] = bzbody_foot_morph(< -0.90, +0.33, +0.40 >,ra,fs,fw,fh); #local Ba1[1][1] = bzbody_foot_morph(< -1.70, +0.33, 00.00 >,ra,fs,fw,fh); #local Bb1 = array[2][2]; #local Bb1[0][0] = bzbody_foot_morph(< -0.90, -0.33, +0.40 >,ra,fs,fw,fh); #local Bb1[0][1] = bzbody_foot_morph(< -1.70, -0.33, 00.00 >,ra,fs,fw,fh); #local Bb1[1][0] = bzbody_foot_morph(< -0.50, -1.00, +0.50 >,ra,fs,fw,fh); #local Bb1[1][1] = bzbody_foot_morph(< -1.20, -1.00, 00.00 >,ra,fs,fw,fh); // Segment 2 (4-patch ring, arch): #local Ta2 = array[2][2]; #local Ta2[0][0] = bzbody_foot_morph(< +1.20, +1.00, +0.65 >,ra,fs,fw,fh); #local Ta2[0][1] = bzbody_foot_morph(< +1.80, +1.00, +0.45 >,ra,fs,fw,fh); #local Ta2[1][0] = bzbody_foot_morph(< +1.30, +0.33, +0.65 >,ra,fs,fw,fh); #local Ta2[1][1] = bzbody_foot_morph(< +1.90, +0.33, +0.45 >,ra,fs,fw,fh); #local Tb2 = array[2][2]; #local Tb2[0][0] = bzbody_foot_morph(< +1.30, -0.33, +0.65 >,ra,fs,fw,fh); #local Tb2[0][1] = bzbody_foot_morph(< +1.90, -0.33, +0.45 >,ra,fs,fw,fh); #local Tb2[1][0] = bzbody_foot_morph(< +1.20, -1.00, +0.65 >,ra,fs,fw,fh); #local Tb2[1][1] = bzbody_foot_morph(< +1.80, -1.00, +0.45 >,ra,fs,fw,fh); #local Ba2 = array[2][2]; #local Ba2[0][0] = bzbody_foot_morph(< +1.10, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba2[0][1] = bzbody_foot_morph(< +1.60, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba2[1][0] = bzbody_foot_morph(< +1.40, +0.33, 00.00 >,ra,fs,fw,fh); #local Ba2[1][1] = bzbody_foot_morph(< +1.80, +0.33, 00.00 >,ra,fs,fw,fh); #local Bb2 = array[2][2]; #local Bb2[0][0] = bzbody_foot_morph(< +1.40, -0.33, 00.00 >,ra,fs,fw,fh); #local Bb2[0][1] = bzbody_foot_morph(< +1.80, -0.33, 00.00 >,ra,fs,fw,fh); #local Bb2[1][0] = bzbody_foot_morph(< +1.10, -1.00, 00.00 >,ra,fs,fw,fh); #local Bb2[1][1] = bzbody_foot_morph(< +1.60, -1.00, 00.00 >,ra,fs,fw,fh); // Segment 3 (pre-fork, toe joints): #local Ta3 = array[2][2]; #local Ta3[0][0] = bzbody_foot_morph(< +2.15, +1.00, +0.35 >,ra,fs,fw,fh); #local Ta3[0][1] = bzbody_foot_morph(< +2.35, +1.00, +0.35 >,ra,fs,fw,fh); #local Ta3[1][0] = bzbody_foot_morph(< +2.15, +0.33, +0.35 >,ra,fs,fw,fh); #local Ta3[1][1] = bzbody_foot_morph(< +2.35, +0.33, +0.35 >,ra,fs,fw,fh); #local Tb3 = array[2][2]; #local Tb3[0][0] = bzbody_foot_morph(< +2.15, -0.33, +0.35 >,ra,fs,fw,fh); #local Tb3[0][1] = bzbody_foot_morph(< +2.35, -0.33, +0.35 >,ra,fs,fw,fh); #local Tb3[1][0] = bzbody_foot_morph(< +2.15, -1.00, +0.35 >,ra,fs,fw,fh); #local Tb3[1][1] = bzbody_foot_morph(< +2.35, -1.00, +0.35 >,ra,fs,fw,fh); #local Ba3 = array[2][2]; #local Ba3[0][0] = bzbody_foot_morph(< +2.15, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba3[0][1] = bzbody_foot_morph(< +2.35, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba3[1][0] = bzbody_foot_morph(< +2.15, +0.33, 00.00 >,ra,fs,fw,fh); #local Ba3[1][1] = bzbody_foot_morph(< +2.35, +0.33, 00.00 >,ra,fs,fw,fh); #local Bb3 = array[2][2]; #local Bb3[0][0] = bzbody_foot_morph(< +2.15, -0.33, 00.00 >,ra,fs,fw,fh); #local Bb3[0][1] = bzbody_foot_morph(< +2.35, -0.33, 00.00 >,ra,fs,fw,fh); #local Bb3[1][0] = bzbody_foot_morph(< +2.15, -1.00, 00.00 >,ra,fs,fw,fh); #local Bb3[1][1] = bzbody_foot_morph(< +2.35, -1.00, 00.00 >,ra,fs,fw,fh); // Segment 4 (posfork, toes): #local Ta4 = array[2][2]; #local Ta4[0][0] = bzbody_foot_morph(< +2.50, +1.00, +0.30 >,ra,fs,fw,fh); #local Ta4[0][1] = bzbody_foot_morph(< +2.60, +1.00, +0.30 >,ra,fs,fw,fh); #local Ta4[1][0] = bzbody_foot_morph(< +2.50, +0.02, +0.30 >,ra,fs,fw,fh); #local Ta4[1][1] = bzbody_foot_morph(< +2.60, +0.02, +0.30 >,ra,fs,fw,fh); #local Tb4 = array[2][2]; #local Tb4[0][0] = bzbody_foot_morph(< +2.50, -0.02, +0.30 >,ra,fs,fw,fh); #local Tb4[0][1] = bzbody_foot_morph(< +2.70, -0.02, +0.30 >,ra,fs,fw,fh); #local Tb4[1][0] = bzbody_foot_morph(< +2.50, -1.00, +0.30 >,ra,fs,fw,fh); #local Tb4[1][1] = bzbody_foot_morph(< +2.70, -1.00, +0.30 >,ra,fs,fw,fh); #local Ba4 = array[2][2]; #local Ba4[0][0] = bzbody_foot_morph(< +2.50, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba4[0][1] = bzbody_foot_morph(< +2.60, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba4[1][0] = bzbody_foot_morph(< +2.50, +0.02, 00.00 >,ra,fs,fw,fh); #local Ba4[1][1] = bzbody_foot_morph(< +2.60, +0.02, 00.00 >,ra,fs,fw,fh); #local Bb4 = array[2][2]; #local Bb4[0][0] = bzbody_foot_morph(< +2.50, -0.02, 00.00 >,ra,fs,fw,fh); #local Bb4[0][1] = bzbody_foot_morph(< +2.70, -0.02, 00.00 >,ra,fs,fw,fh); #local Bb4[1][0] = bzbody_foot_morph(< +2.50, -1.00, 00.00 >,ra,fs,fw,fh); #local Bb4[1][1] = bzbody_foot_morph(< +2.70, -1.00, 00.00 >,ra,fs,fw,fh); // Segment 5 (two 2-caps, toes): #local Ta5 = array[2][2]; #local Ta5[0][0] = bzbody_foot_morph(< +2.80, +1.00, +0.25 >,ra,fs,fw,fh); #local Ta5[0][1] = bzbody_foot_morph(< +2.85, +1.00, +0.25 >,ra,fs,fw,fh); #local Ta5[1][0] = bzbody_foot_morph(< +2.80, +0.02, +0.25 >,ra,fs,fw,fh); #local Ta5[1][1] = bzbody_foot_morph(< +2.85, +0.02, +0.25 >,ra,fs,fw,fh); #local Tb5 = array[2][2]; #local Tb5[0][0] = bzbody_foot_morph(< +2.90, -0.02, +0.25 >,ra,fs,fw,fh); #local Tb5[0][1] = bzbody_foot_morph(< +2.95, -0.02, +0.25 >,ra,fs,fw,fh); #local Tb5[1][0] = bzbody_foot_morph(< +2.90, -1.00, +0.25 >,ra,fs,fw,fh); #local Tb5[1][1] = bzbody_foot_morph(< +2.95, -1.00, +0.25 >,ra,fs,fw,fh); #local Ba5 = array[2][2]; #local Ba5[0][0] = bzbody_foot_morph(< +2.80, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba5[0][1] = bzbody_foot_morph(< +2.85, +1.00, 00.00 >,ra,fs,fw,fh); #local Ba5[1][0] = bzbody_foot_morph(< +2.80, +0.02, 00.00 >,ra,fs,fw,fh); #local Ba5[1][1] = bzbody_foot_morph(< +2.85, +0.02, 00.00 >,ra,fs,fw,fh); #local Bb5 = array[2][2]; #local Bb5[0][0] = bzbody_foot_morph(< +2.90, -0.02, 00.00 >,ra,fs,fw,fh); #local Bb5[0][1] = bzbody_foot_morph(< +2.95, -0.02, 00.00 >,ra,fs,fw,fh); #local Bb5[1][0] = bzbody_foot_morph(< +2.90, -1.00, 00.00 >,ra,fs,fw,fh); #local Bb5[1][1] = bzbody_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{ bztube_prefork42(Ta2,Ba2,Tb2,Bb2, Ta3,Ba3,Tb3,Bb3, Ta4,Ba4,Tb4,Bb4, tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_posfork42(Ta3,Ba3,Tb3,Bb3, Ta4,Ba4,Tb4,Bb4, Ta5,Ba5,Tb5,Bb5, tx_bzB, tx_bzA, rad, tx_orange) } object{ bztube_cap2(Ta4,Ba4, Ta5,Ba5, tx_bzA, tx_bzB, rad, tx_orange) } object{ bztube_cap2(Tb4,Bb4, Tb5,Bb5, tx_bzB, tx_bzA, rad, tx_orange) } translate -fh*z } #end