// Last edited on 2011-02-14 13:00:14 by stolfilocal #macro microbe(A_0,B_0,C_0,A_1,B_1,C_1,tx_body,r_grid,tx_grid) // Deformable microbe. // A_0,B_0,C_0 = Bezier points on left side. // A_1,B_1,C_1 = Bezier points on right side. // Each var is a 4x4 array. // First index is X position, lo to hi. // Second index is Z position, lo to hi. // The only relevant control points are: // A_{0,1}[0][{1,2}] define -X end // {A,B,C}_{0,1}[{1,2}][{1,2}] define body // C_{0,1}[3][{1,2}] define +x end. // All other control points are recomputed for C1 smoothness. // Stitch each segment to the next one: #local i = 1; #while (i <= 2) #local A_0[3][i] = (A_0[2][i] + B_0[1][i])/2; #local B_0[0][i] = A_0[3][i]; #local B_0[3][i] = (B_0[2][i] + C_0[1][i])/2; #local C_0[0][i] = B_0[3][i]; #local A_1[3][i] = (A_1[2][i] + B_1[1][i])/2; #local B_1[0][i] = A_1[3][i]; #local B_1[3][i] = (B_1[2][i] + C_1[1][i])/2; #local C_1[0][i] = B_1[3][i]; #local i = i + 1; #end // Stitch each left segment to the corresp right segment at top & bot: #local i = 0; #while (i < 4) #local A_0[i][0] = (A_0[i][1] + A_1[i][1])/2; #local A_1[i][0] = A_0[i][0]; #local A_0[i][3] = (A_0[i][2] + A_1[i][2])/2; #local A_1[i][3] = A_0[i][3]; #local B_0[i][0] = (B_0[i][1] + B_1[i][1])/2; #local B_1[i][0] = B_0[i][0]; #local B_0[i][3] = (B_0[i][2] + B_1[i][2])/2; #local B_1[i][3] = B_0[i][3]; #local C_0[i][0] = (C_0[i][1] + C_1[i][1])/2; #local C_1[i][0] = C_0[i][0]; #local C_0[i][3] = (C_0[i][2] + C_1[i][2])/2; #local C_1[i][3] = C_0[i][3]; #local i = i + 1; #end #declare tx_plastic_white = texture{ pigment{ color rgb < 1.000, 1.000, 1.000 > } finish{ diffuse 0.80 ambient 0.02 specular 0.18 roughness 0.005 } } #declare tx_plastic_black = texture{ pigment{ color rgb < 0.100, 0.070, 0.050 > } finish{ diffuse 0.80 ambient 0.02 specular 0.18 roughness 0.005 } } #macro eye(r) #local ap = pi/6; // Angular radius of pupil (radians). #local rp = r*sin(ap); // {Y,Z}-radius of pupil. #local xp = r*cos(ap); // X position of pupil ellipsoid. #local tp = 1.01 - xp; // X-radius of pupil. union{ sphere{ <0,0,0>, r texture{ tx_plastic_white } } sphere{ <0,0,0>, 1 scale < tp, rp, rp > translate xp*x texture{ tx_plastic_black } } } #end // Position and size of eyes: #local p_eye_0 = bzpoint(C_0,0.25,0.85); #local p_eye_1 = bzpoint(C_1,0.25,0.85); #local r_eye = 0.45*vlength(p_eye_1 - p_eye_0); union{ object{ bzpatch(A_0, tx_body, r_grid, tx_grid) } object{ bzpatch(B_0, tx_body, r_grid, tx_grid) } object{ bzpatch(C_0, tx_body, r_grid, tx_grid) } object{ bzpatch(A_1, tx_body, r_grid, tx_grid) } object{ bzpatch(B_1, tx_body, r_grid, tx_grid) } object{ bzpatch(C_1, tx_body, r_grid, tx_grid) } object{ eye(r_eye) translate p_eye_0 } object{ eye(r_eye) translate p_eye_1 } } #end #macro microbe_swimming(len,wid,hgt,amp,wav,pha,tx_body,r_grid,tx_grid) // The microbe deformed dueing a swimming motion. // len = total length of microbe. // wid = width of microbe at midpoint. // hgt = height of microbe at midpoint. // amp = amplitude of wiggles. // wav = wavelength of wiggles. // pha = phase of wiggle. #macro wiggle(p,A,L,F) // Wiggle deformation of space. // Displaces Z as a sinusoidal function of X. // p = a point of space. // A = amplitude of wiggles. // L = wavelength of wiggles. // F = phase of wiggle. < p.x, p.y, p.z + A*sin(2*pi*(p.x/L + F)) > #end #local A_0 = array[4][4]; #local B_0 = array[4][4]; #local C_0 = array[4][4]; #local A_1 = array[4][4]; #local B_1 = array[4][4]; #local C_1 = array[4][4]; #local i = 0; #while (i < 4) #local j = 0; #while (j < 4) #local A_0[i][j] = <0,0,0>; #local B_0[i][j] = <0,0,0>; #local C_0[i][j] = <0,0,0>; #local A_1[i][j] = <0,0,0>; #local B_1[i][j] = <0,0,0>; #local C_1[i][j] = <0,0,0>; #local j = j + 1; #end #local i = i + 1; #end #local A_0[0][1] = < -9/18*len, 0.01*wid, -0.01*hgt >; #local A_0[0][2] = < -9/18*len, 0.01*wid, +0.01*hgt >; #local A_0[1][1] = < -7/18*len, 0.20*wid, -0.20*hgt >; #local A_0[1][2] = < -7/18*len, 0.20*wid, +0.20*hgt >; #local A_0[2][1] = < -5/18*len, 0.35*wid, -0.35*hgt >; #local A_0[2][2] = < -5/18*len, 0.35*wid, +0.35*hgt >; #local B_0[1][1] = < -1/18*len, 0.50*wid, -0.50*hgt >; #local B_0[1][2] = < -1/18*len, 0.50*wid, +0.50*hgt >; #local B_0[2][1] = < +1/18*len, 0.50*wid, -0.50*hgt >; #local B_0[2][2] = < +1/18*len, 0.50*wid, +0.50*hgt >; #local C_0[1][1] = < +5/18*len, 0.35*wid, -0.35*hgt >; #local C_0[1][2] = < +5/18*len, 0.35*wid, +0.35*hgt >; #local C_0[2][1] = < +7/18*len, 0.20*wid, -0.20*hgt >; #local C_0[2][2] = < +7/18*len, 0.20*wid, +0.20*hgt >; #local C_0[3][1] = < +9/18*len, 0.01*wid, -0.01*hgt >; #local C_0[3][2] = < +9/18*len, 0.01*wid, +0.01*hgt >; #local i = 0; #while (i < 4) #local j = 0; #while (j < 4) #local A_1[i][j] = < A_0[i][j].x, -A_0[i][j].y, A_0[i][j].z >; #local B_1[i][j] = < B_0[i][j].x, -B_0[i][j].y, B_0[i][j].z >; #local C_1[i][j] = < C_0[i][j].x, -C_0[i][j].y, C_0[i][j].z >; #if (amp != 0) #local A_0[i][j] = wiggle(A_0[i][j],amp,wav,pha); #local B_0[i][j] = wiggle(B_0[i][j],amp,wav,pha); #local C_0[i][j] = wiggle(C_0[i][j],amp,wav,pha); #local A_1[i][j] = wiggle(A_1[i][j],amp,wav,pha); #local B_1[i][j] = wiggle(B_1[i][j],amp,wav,pha); #local C_1[i][j] = wiggle(C_1[i][j],amp,wav,pha); #end #local j = j + 1; #end #local i = i + 1; #end object{ microbe(A_0,B_0,C_0,A_1,B_1,C_1,tx_body,r_grid,tx_grid) } #end