#version unofficial MegaPov 0.5; #include "colors.inc" #include "metals.inc" //#include "textures.inc" //#include "stones.inc" #declare modclock=1*clock; #macro step(timer,height,ex1,ex2) #local span=ex2-ex1; #declare Pos2 = spline { cubic_spline 0.0000, <0,0,ex1> 0.1250, <0,height,ex1+span/2> 0.2500, <0,0,ex2> 0.2625, <0,0,ex2-span/20> 0.3125, <0,0,ex2-span/4> 0.3750, <0,0,ex1+span/2> 0.4375, <0,0,ex1+span/4> 0.4875, <0,0,ex1+span/20> 0.5000, <0,0,ex1> 0.6250, <0,height,ex1+span/2> 0.7500, <0,0,ex2> 0.8125, <0,0,ex2-span/4> 0.8750, <0,0,ex1+span/2> 0.9375, <0,0,ex1+span/4> 1.0000, <0,0,ex1> } Pos2(mod(timer/2,0.5)+0.25) #end // John van Sickle // FindKnee(Ankle,Hip,Thigh,Shin,Direction) // A useful vector for animations, FindKnee( ) will return the location of a joint // in a limb when the other particulars of the limb are known. Ankle is the // location of one joint at one end of the limb, Hip is the location of the joint // at the other end, Thigh is the distance from Hip to the knee, Shin is the distance // from Ankle to the knee, and Direction is the direction in which the knee should // point. The macro will return the location of the knee. If the distance from Hip // to Ankle is greater than the sum of Thigh and Shin, a fatal error will occur. #macro FindKnee(pA,pH,lT,lS,vD) #local lB=vlength(pA-(pH)); #if( (lB>lT+lS) | (lT>lB+lS) | (lS>lT+lB) ) #error "Invalid span lengths.\n" $gk=1/0/0/0/0/0/0/0/0; #end #local tX=(lT*lT-lS*lS+lB*lB)/2/lB; #local tY=sqrt(lT*lT-tX*tX); #local vO=vnormalize(pA-(pH)); #local vF=vnormalize(vcross(vD,vO)); #local vU=vnormalize(vcross(vO,vF)); (pH+vO*tX+vU*tY) #end #macro myrote(v1,v2) < atan2(v2.z,v2.y)-atan2(v1.z,v1.y) , atan2(v2.x,v2.z)-atan2(v1.x,v1.z) , atan2(v2.x,v2.y)-atan2(v1.x,v1.y) > #end // By Rune Johansen, Thu, 6 Jul 2000 // Perpendiculize will adjust the vector V1 // so that it is perpendicular to the vector V2. // The input is V1 and V2, and the macro returns // the adjusted version of V1. #macro Perpendiculize (V1,V2) // by Rune S. Johansen vnormalize(vcross(vcross(V2,V1),V2)) #end // FindAngle will find the angle between V1 and V2. // The third parameter "About" is a vector which must be // perpendicular to both V1 and V2. If the rotation from // V1 to V2 about "About" is negative, the returned angle // is negative. ( When you look in the direction of "About" // clockwise is negative and anticlockwise is positive. ) // If you set "about" to <0,0,0> the returned angle will // always be positive (or zero). #macro FindAngle (V1,V2,About) degrees(acos(vdot(vnormalize(V1),vnormalize(V2)))) *(vdot(About,vcross(V1,V2))<0?-1:1) #end // Given 2 vectors, a vector for the X direction // (similar to the 1st - 3rd number in a matrix), // and one for the Y direction (similar to the // 4th - 6th number in a matrix), Vectors2Rotate will // return a rotation vector which will transform an // object in the same way as a matrix using the // vectors would do. VectorX and VectorY must be // perpendicular to each other. #macro Vectors2Rotate (VectorX,VectorY) // by Rune S. Johansen #local RotZ = FindAngle(x,,z); #local RotY = FindAngle(x,vrotate(VectorX,-RotZ*z),y); #local RotX = FindAngle(vrotate(y,<0,RotY,RotZ>),VectorY,VectorX); #end #macro Reorient(Axis1,Axis2) #declare vX1=vnormalize(Axis1); //john vansickle #declare vX2=vnormalize(Axis2); #declare vY=vnormalize(vcross(vX1,vX2)); #declare vZ1=vnormalize(vcross(vX1,vY)); #declare vZ2=vnormalize(vcross(vX2,vY)); matrix < vX1.x, vY.x,vZ1.x, vX1.y,vY.y,vZ1.y, vX1.z,vY.z, vZ1.z, 0,0,0 > matrix < vX2.x,vX2.y,vX2.z, vY.x,vY.y, vY.z, vZ2.x,vZ2.y,vZ2.z, 0,0,0 > #end #macro Oritransform(Axis1,Axis2) #declare vX1=vnormalize(Axis1); //john vansickle #declare vX2=vnormalize(Axis2); #declare vY=vnormalize(vcross(vX1,vX2)); #declare vZ1=vnormalize(vcross(vX1,vY)); #declare vZ2=vnormalize(vcross(vX2,vY)); transform{ matrix < vX1.x, vY.x,vZ1.x, vX1.y,vY.y,vZ1.y, vX1.z,vY.z, vZ1.z, 0,0,0 > matrix < vX2.x,vX2.y,vX2.z, vY.x,vY.y, vY.z, vZ2.x,vZ2.y,vZ2.z, 0,0,0 > } #end $f=array[2][5][4] // finger segment joint positions at rest from anatomy $fingtrans=array[2][5][4] // transformations to be performed on each of the finger segments $fingobj=array[2][5][4] // objects defining each of the finger segments $fingcrosser=array[5] // a vector to help keep track the various vectors //$fingang=array[2][5] // array of two by for fings 1,2,3,4 //$vv1=<1,1,1> //$vtransformer=transform{Reorient(vv1,<1,1,0>)} //$vv2=Reorient(vv1,<1,1,0>); //DO NOT MESS WITH THESE!! $headtop=<0,81,6>; $headrightmost=<4,77,7>; $headrightmost=<-4,77,7>; $nosept=<0,74.5,11>; $headdepth=<0,77,0.5>; $chinpt=<0,70.5,10>; $headpvt=<0,74,5.5>; $rjawend=<2.5,72,7>; $ljawend=<-2.5,72,7>; $neckendpt=<0,67,4>; $rshouldpvt=<8,65,4>; $lshouldpvt=<-8,65,4>; $ribcagetop=<0,66.5,8.5>; $ribcagebot=<0,52.5,13>; $hippvt=<0,48.5,6.5>; $rhiptop=<6.5,49.5,7.5>; $lhiptop=<-6.5,49.5,7.5>; $rfemextpt=<5,43.5,8>; $lfemextpt=<-5,43.5,8>; $rfempvt=<6,43.,8>; $lfempvt=<-6,43.,8>; $rkneept=<3.5,22,7>; $lkneept=<-3.5,22,7>; $rankpt=<2.5,3,5>; $lankpt=<-2.5,3,5>; $rfootbackpt=<2,1,2>; $lfootbackpt=<-2,1,2>; $rtoeballpt=<2,1.5,10>; $ltoeballpt=<-2,1.5,10>; $rtoetippt=<2,1,13>; $ltoetippt=<-2,1,13>; $rfoottop=<2,3.8,6.5>; $lfoottop=<-2,3.8,6.5>; $relbowpt=<9,52,3>; $lelbowpt=<-9,52,3>; $rwristpt=<9,41,5>; $lwristpt=<-9,41,5>; $rfingtippt=<8.5,33,5>; $lfingtippt=<-8.5,33,5>; $rthumbpvt=<8.5,39.5,5.5>; $lthumbpvt=<-8.5,39.5,5.5>; $rthumbend=<8,36,6>; $lthumbend=<-8,36,6>; $ribpvt=<0,56,5.5>; $reyecent=<1.5,75.5,9.25>; $leyecent=<-1.5,75.5,9.25>; $jawpvt=<0,73.5,6.5>; $rjawpt=<2.5,73.5,6.5>; $ljawpt=<-2.5,73.5,6.5>; $headfront=<0,77, 10.1>; //note for further improvement here: fix the x distance so not all fings exact same. //Knuckles: 0 is knuckle, fingertip is "3" //fingers: 1 is index, 2 is middle, 3 is ring, 4 is pinkie 0 is thumb //hands: 0 is left, 1 is right //HAND FING KNUCK $f[0][1][0]=< -9 , 37.45 , 5.79 >;//Left fing1 knuck $f[0][1][1]=< -9 , 35.87 , 6.14 >; $f[0][1][2]=< -9 , 34.98 , 6.34 >; $f[0][1][3]=< -9 , 34.19 , 6.38 >; $f[0][2][0]=< -9 , 37.25 , 5.10 >; $f[0][2][1]=< -9 , 35.38 , 5.07 >; //4.80 for z gave broken knuckle $f[0][2][2]=< -9 , 34.39 , 5.04 >; $f[0][2][3]=< -9 , 33.50 , 5.00 >; $f[0][3][0]=< -9 , 37.55 , 4.21 >; $f[0][3][1]=< -9 , 36.07 , 4.01 >; $f[0][3][2]=< -9 , 35.08 , 4.01 >; $f[0][3][3]=< -9 , 34.29 , 4.01 >; $f[0][4][0]=< -9 , 37.84 , 3.62 >; $f[0][4][1]=< -9 , 36.66 , 3.22 >; $f[0][4][2]=< -9 , 36.16 , 3.06 >; $f[0][4][3]=< -9 , 35.47 , 3.02 >; //fing 0 is thumb, 1 is index, 4 is pinkie $f[0][0][0]=< -8.5 , 40.11 , 5.79 >; $f[0][0][1]=< -8.34 , 39.03 , 6.97 >; $f[0][0][2]=< -8.16 , 38.04 , 7.56 >; $f[0][0][3]=< -8 , 37.35 , 8.16 >; $f[1][1][0]=< 9 , 37.45 , 5.79 >; $f[1][1][1]=< 9 , 35.87 , 6.14 >; $f[1][1][2]=< 9 , 34.98 , 6.34 >; $f[1][1][3]=< 9 , 34.19 , 6.38 >; $f[1][2][0]=< 9 , 37.25 , 5.10 >; $f[1][2][1]=< 9 , 35.38 , 5.07 >; $f[1][2][2]=< 9 , 34.39 , 5.04 >; $f[1][2][3]=< 9 , 33.50 , 5.00 >; $f[1][3][0]=< 9 , 37.55 , 4.21 >; $f[1][3][1]=< 9 , 36.07 , 4.01 >; $f[1][3][2]=< 9 , 35.08 , 4.01 >; $f[1][3][3]=< 9 , 34.29 , 4.01 >; $f[1][4][0]=< 9 , 37.84 , 3.62 >; $f[1][4][1]=< 9 , 36.66 , 3.22 >; $f[1][4][2]=< 9 , 36.16 , 3.06 >; $f[1][4][3]=< 9 , 35.47 , 3.02 >; $f[1][0][0]=< 8.5 , 40.11 , 5.79 >; $f[1][0][1]=< 8.34 , 39.03 , 6.97 >; $f[1][0][2]=< 8.16 , 38.04 , 7.56 >; $f[1][0][3]=< 8 , 37.35 , 8.16 >; //$fingcrosser[1]=x; //$fingcrosser[2]=y; //$fingcrosser[3]=z; //$fingcrosser[4]=u; //these are user-defined variables, these not affected by FK/IK $lumbarang= < 20, 0,-0>; $headang= <-10, 10*cos(2*pi*modclock+pi), 0>; $neckang= <-15+10*cos(4*pi*modclock), 0,-0>; $jawrot= < 0, 0, 0>; $ribang= < 15, -15*cos(2*pi*modclock+pi), 10*cos(2*pi*modclock+pi)>; $hipang= < 0, 15*cos(2*pi*modclock), 5*cos(2*pi*modclock)>; $rwristang= <0,-60,0>; $lwristang= <0,60,0>; $rf=-40; $lf=+60; $rfingang= array[5] {rf,rf,rf,rf,rf} // 0 is left hand, index,middle, ring, pinkie $lfingang=array[5] {lf,lf,lf,lf,lf} // 1 is right hand, index,middle, ring, pinkie $fkarm=no; //yes means arms are FK, no means IK $fkleg=no; //yes means arms are FK, no means IK //these user-defined variables only used for FK arms $rshouldang= <50,0,10>; $lshouldang= <-60,0,-20>; $relbowang= <-70,0,0>; $lelbowang= <-70,0,0>; //these user-defined variables only used for IK arms $rtempwristpt=< 1,55+4*sin(4*pi*modclock), 20+3*cos(4*pi*modclock)>; $ltempwristpt=<-1,55+4*sin(4*pi*modclock+pi/2),20+3*cos(4*pi*modclock+pi/2)>; // //$ltempwristpt=<-1,50,20>; //$rtempwristpt=<9,60,20>; //$ltempwristpt=<-9,60,20>; //$lwristpt=<-9,41,5>; // note this is rest position //these user-defined variables only used for FK legs $rfemurang=<-20,0,0>; $lfemurang=<0,0,0>; $rkneeang= <40,0,0>; $lkneeang= <0,0,0>; $rankang= <-35,0,0>; $lankang= <-10,0,0>; $rtoeptang=<0,0,0>; $ltoeptang=<0,0,0>; //these user-defined variables only used for IK legs $rtemptoeballpt=<2,10.5,0>+step(modclock+0.0,6,-10,28); // BTW $rtoeballpt=<2,1.5,10>; $ltemptoeballpt=<-2,10.5,0>+step(modclock+0.5,6,-10,28); // BTW $rtoeballpt=<2,1.5,10>; //$ltemptoeballpt=<-2,10,0>; #macro lfs(a) #declare lfs1 = spline { linear_spline 0,0 0.25,0 0.5,45, 1,0 } #declare pain=<0,0,0>+lfs1(mod(a,1)); pain.x #end //$rfootliftang=<0,0,0>; $rfootliftang=; $lfootliftang=; #declare eyepigs= pigment { gradient z pigment_map{ [0 Black] [0.1 White] [1 White] } } //sphere{rtemptoeballpt,2 pigment{Yellow} finish{ambient 1}} //list of objects $neckobj=cylinder{headpvt-neckendpt,0,1} $headobj=union{ sphere{0,4.5 translate <0,4.5,0> scale <8/9,7/9,1.0> //translate<0,-2,1> } cylinder{<0,0,4.5*8/9>,<0,5,4.5*8/9>,4.5*8/9 scale <0.75,1,0.5> } } $rhumerusobj=cylinder{0,relbowpt-rshouldpvt,1} $lhumerusobj=cylinder{0,lelbowpt-lshouldpvt,1} $rforearmobj=cylinder{0,rwristpt-relbowpt,1} $lforearmobj=cylinder{0,lwristpt-lelbowpt,1} //$rwristobj=cylinder{0,rfingtippt-rwristpt,1 scale <0.5,1,1>} $lwristobj=union{ #declare o=0; #while (o<5) cylinder{f[0][o][0]-lwristpt,0,0.3 } #declare o=o+1; #end #declare p=0; #while (p<3) cylinder{f[0][0][p]-lwristpt,f[0][0][p+1]-lwristpt,0.3} //cylinder{f[1][0][p]-rwristpt,f[1][0][p+1]-rwristpt,0.8} #declare p=p+1; #end } //$rwristobj=union{ // cylinder{RF1C-rwristpt,0,0.2} // cylinder{RF2C-rwristpt,0,0.2} // cylinder{RF3C-rwristpt,0,0.2} // cylinder{RF4C-rwristpt,0,0.2} // } $rwristobj=union{ #declare o=0; #while (o<5) cylinder{f[1][o][0]-rwristpt,0,0.3} #declare o=o+1; #end #declare p=0; #while (p<3) cylinder{f[1][0][p]-rwristpt,f[1][0][p+1]-rwristpt,0.3} #declare p=p+1; #end } //$ribobj=cylinder{neckendpt-ribpvt,0,6 scale<1,1,8/13> } $ribobj=union{ cylinder{rshouldpvt-ribpvt,neckendpt-ribpvt,1} cylinder{lshouldpvt-ribpvt,neckendpt-ribpvt,1} cylinder{rshouldpvt-ribpvt,0,1} cylinder{lshouldpvt-ribpvt,0,1} } $lumbarobj=cylinder{ribpvt-hippvt,0,1} $hipobj=cylinder{0,hippvt-(rfempvt/2+lfempvt/2),1 scale <1,1,2/14>} $hipobj=union{ cylinder{0,rfempvt-hippvt,1} cylinder{0,lfempvt-hippvt,1} cylinder{lfempvt-hippvt,rfempvt-hippvt,1} } $rfemobj=cylinder{0,rkneept-rfempvt,1} $lfemobj=cylinder{0,lkneept-lfempvt,1} $rshinobj=cylinder{0,rankpt-rkneept,1} $lshinobj=cylinder{0,lankpt-lkneept,1} $rfootobj=union{ cylinder{0,rtoeballpt-rankpt,0.5} cylinder{0,rfootbackpt-rankpt,0.5} cylinder{rtoeballpt-rankpt,rfootbackpt-rankpt,0.5} } $lfootobj=union{ cylinder{0,ltoeballpt-lankpt,0.5} cylinder{0,lfootbackpt-lankpt,0.5} cylinder{ltoeballpt-lankpt,lfootbackpt-lankpt,0.5} } $rtoetipobj=cylinder{0,rtoetippt-rtoeballpt,0.5 //scale<1,0.7/3,1> } $ltoetipobj=cylinder{0,ltoetippt-ltoeballpt,0.5 //scale<1,0.7/3,1> } $reyeobj=sphere {<0,0,.5>,.5 //eyesockets pigment {eyepigs} scale .75/.5 translate reyecent-headpvt } $leyeobj=sphere {<0,0,.5>,.5 //eyesockets pigment {eyepigs} scale .75/.5 translate leyecent-headpvt } $jawobj=union{ cylinder{rjawpt-jawpvt,rjawend-jawpvt,.5} cylinder{chinpt-jawpvt,rjawend-jawpvt,.5} cylinder{chinpt-jawpvt,ljawend-jawpvt,.5} cylinder{ljawpt-jawpvt,ljawend-jawpvt,.5} } #declare n=0; #while (n<2) #declare o=1; //this one starts at one because not messing with thumb right now #while (o<5) #declare p=0; #while (p<3) $fingobj[n][o][p]=cylinder{f[n][o][p+1]-f[n][o][p],0,0.3 } //$fingobj[0][o][p]=cylinder{f[0][o][p+1]-f[0][o][p],0,0.4 pigment {White}} //$fingobj[1][o][p]=cylinder{f[1][o][p+1]-f[1][o][p],0,0.4 pigment {Black}} #declare p=p+1; #end #declare o=o+1; #end #declare n=n+1; #end //transform definitions $lumbartrans=transform{rotate lumbarang translate hippvt} $ribtrans=transform{rotate ribang translate ribpvt-hippvt transform{lumbartrans}} $necktrans=transform{rotate neckang translate neckendpt-ribpvt transform{ribtrans}} $headtrans=transform{rotate headang translate headpvt-neckendpt transform{necktrans}} $hiptrans=transform{rotate hipang translate hippvt} $jawtrans=transform{rotate jawrot transform{headtrans}} #if (fkarm) $rhumerustrans=transform{rotate rshouldang translate rshouldpvt-ribpvt transform{ribtrans}} $lhumerustrans=transform{rotate lshouldang translate lshouldpvt-ribpvt transform{ribtrans}} $rforearmtrans=transform{rotate relbowang translate relbowpt-rshouldpvt transform{rhumerustrans}} $lforearmtrans=transform{rotate lelbowang translate lelbowpt-lshouldpvt transform{lhumerustrans}} $rwristtrans=transform{rotate rwristang translate rwristpt-relbowpt transform{rforearmtrans}} $lwristtrans=transform{rotate lwristang translate lwristpt-lelbowpt transform{lforearmtrans}} $fingtrans[1][1][1]=transform{rotate lwristang translate lwristpt-lelbowpt transform{lforearmtrans}} #else $rtempshouldpt=vtransform(rshouldpvt-ribpvt, transform{ribtrans}) $ltempshouldpt=vtransform(lshouldpvt-ribpvt, transform{ribtrans}) //FindKnee(Ankle,Hip,Thigh,Shin,Direction) $rtempelbowpt=FindKnee(rtempwristpt,rtempshouldpt,vlength(rshouldpvt-relbowpt),vlength(relbowpt-rwristpt),x-0.1*z); $ltempelbowpt=FindKnee(ltempwristpt,ltempshouldpt,vlength(lshouldpvt-lelbowpt),vlength(lelbowpt-lwristpt),-x-0.1*z); $rhumerustrans=transform{Oritransform(relbowpt-rshouldpvt,rtempelbowpt-rtempshouldpt) translate rtempshouldpt} $lhumerustrans=transform{Oritransform(lelbowpt-lshouldpvt,ltempelbowpt-ltempshouldpt) translate ltempshouldpt} $rforearmtrans=transform{Oritransform(rwristpt-relbowpt,rtempwristpt-rtempelbowpt) translate rtempelbowpt} $lforearmtrans=transform{Oritransform(lwristpt-lelbowpt,ltempwristpt-ltempelbowpt) translate ltempelbowpt} // $rwristtrans=transform{rotate rwristang translate rtempwristpt-rtempelbowpt transform{rforearmtrans}} $rwristtrans=transform{rotate rwristang translate rwristpt-relbowpt transform{rforearmtrans}} $lwristtrans=transform{rotate lwristang translate lwristpt-lelbowpt transform{lforearmtrans}} //$lwristtrans=transform{rotate lwristang translate ltempwristpt-ltempelbowpt transform{lforearmtrans}} #end #if (fkleg) $rfemurtrans=transform{rotate rfemurang translate rfempvt-hippvt transform{hiptrans}} $lfemurtrans=transform{rotate lfemurang translate lfempvt-hippvt transform{hiptrans}} $rshintrans=transform{rotate rkneeang translate rkneept-rfempvt transform{rfemurtrans}} $lshintrans=transform{rotate lkneeang translate lkneept-lfempvt transform{lfemurtrans}} $rfoottrans=transform{rotate rankang translate rankpt-rkneept transform{rshintrans}} $lfoottrans=transform{rotate lankang translate lankpt-lkneept transform{lshintrans}} $rtoetiptrans=transform{rotate rtoeptang translate rtoeballpt-rankpt transform {rfoottrans}} $ltoetiptrans=transform{rotate ltoeptang translate ltoeballpt-lankpt transform {lfoottrans}} #else $rtemprankpt=rtemptoeballpt+vrotate((rankpt-rtoeballpt),rfootliftang); $rtempfempvt=hippvt+vrotate((rfempvt-hippvt),hipang); $rtempkneept=FindKnee(rtemprankpt,rtempfempvt,vlength(rfempvt-rkneept),vlength(rkneept-rankpt),z) //$rfemobj=object{rfemobj Reorient(rkneept-rfempvt,rtempkneept-rtempfempvt)} //$rshinobj=object{rshinobj Reorient(rankpt-rkneept,rtemprankpt-rtempkneept)} $rfemurtrans=transform{Oritransform(rkneept-rfempvt,rtempkneept-rtempfempvt) translate rtempfempvt} $rshintrans= transform{Oritransform(rankpt-rkneept,rtemprankpt-rtempkneept) translate rtempkneept} $rfoottrans= transform{rotate rfootliftang translate rtemprankpt} $rtoetiptrans=transform{rotate rtoeptang translate rtemptoeballpt} $ltemplankpt=ltemptoeballpt+vrotate((lankpt-ltoeballpt),lfootliftang); $ltempfempvt=hippvt+vrotate((lfempvt-hippvt),hipang); $ltempkneept=FindKnee(ltemplankpt,ltempfempvt,vlength(lfempvt-lkneept),vlength(lkneept-lankpt),z) //$lfemobj=object{lfemobj Reorient(lkneept-lfempvt,ltempkneept-ltempfempvt)} //$lshinobj=object{lshinobj Reorient(lankpt-lkneept,ltemplankpt-ltempkneept)} $lfemurtrans=transform{Oritransform(lkneept-lfempvt,ltempkneept-ltempfempvt) translate ltempfempvt} $lshintrans= transform{Oritransform(lankpt-lkneept,ltemplankpt-ltempkneept) translate ltempkneept} $lfoottrans= transform{rotate lfootliftang translate ltemplankpt} $ltoetiptrans=transform{rotate ltoeptang translate ltemptoeballpt} #end #declare o=1; //this one starts at one because not messing with thumb right now #while(o<5) #debug "\n" #debug str(o,6,4) $fingtrans[0][o][0]=transform{rotate <0,0,lfingang[o]> translate f[0][o][0]-lwristpt transform{lwristtrans}} $fingtrans[1][o][0]=transform{rotate <0,0,rfingang[o]> translate f[1][o][0]-rwristpt transform{rwristtrans}} $fingtrans[0][o][1]=transform{rotate <0,0,lfingang[o]> translate f[0][o][1]-f[0][o][0] transform{fingtrans[0][o][0]}} $fingtrans[1][o][1]=transform{rotate <0,0,rfingang[o]> translate f[1][o][1]-f[1][o][0] transform{fingtrans[1][o][0]}} $fingtrans[0][o][2]=transform{rotate <0,0,lfingang[o]> translate f[0][o][2]-f[0][o][1] transform{fingtrans[0][o][1]}} $fingtrans[1][o][2]=transform{rotate <0,0,rfingang[o]> translate f[1][o][2]-f[1][o][1] transform{fingtrans[1][o][1]}} #declare o=o+1; #end //$rtempshouldpt=vtransform(rshouldpvt-ribpvt, transform{ribtrans}) //$ltempshouldpt=vtransform(lshouldpvt-ribpvt, transform{ribtrans}) //display $body=union{ object{reyeobj transform{headtrans}} object{leyeobj transform{headtrans}} object{jawobj transform{jawtrans}} object{lumbarobj transform{lumbartrans}} object{headobj transform{headtrans}} object{neckobj transform{necktrans}} object{rhumerusobj transform{rhumerustrans}} object{lhumerusobj transform{lhumerustrans}} object{rforearmobj transform{rforearmtrans}} object{lforearmobj transform{lforearmtrans}} object{rwristobj transform{rwristtrans}} object{lwristobj transform{lwristtrans}} object{ribobj transform{ribtrans}} object{hipobj transform{hiptrans}} object{rfemobj transform{rfemurtrans}} object{lfemobj transform{lfemurtrans}} object{rshinobj transform{rshintrans}} object{lshinobj transform{lshintrans}} object{rfootobj transform{rfoottrans}} object{lfootobj transform{lfoottrans}} object{rtoetipobj transform{rtoetiptrans}} object{ltoetipobj transform{ltoetiptrans}} #declare n=0; #while (n<2) #declare o=1; //this one starts at one because not messing with thumb right now #while(o<5) #declare p=0; #while(p<2) object{fingobj[n][o][p] transform fingtrans[n][o][p]} #declare p=p+1; #end #declare o=o+1; #end #declare n=n+1; #end //sphere{rtempshouldpt,2 pigment{Red} finish{ambient 1}} //sphere{rtempwristpt,2 pigment{Red} finish{ambient 1}} //sphere{rtemprankpt,2 pigment{Red} finish{ambient 1}} //sphere{rtempkneept,1 pigment{Red} finish{ambient 1}} //sphere{rtempfempvt,1 pigment{Red} finish{ambient 1}} //sphere{rtemptoeballpt,2 pigment{Red} finish{ambient 1}} //pigment {White} finish{ambient .5} texture{T_Copper_1E finish{ambient .25}} translate <0,-6,0> } object{body rotate <0,45,0>translate <40,0,0>} object{body rotate <0,90,0> translate <-10,0,0>} object{body rotate <0,180,0> translate <-40,0,0>} camera { //location <0,185,-300> look_at <-30,40,0> angle 10 location <0,90,-350> look_at <0,39,0> angle 20 } plane {y,3.5 pigment { White} //pigment {checker Black, White} } light_source{<-170,200,-120>rgb .85} light_source{<10,200,-50>rgb .1} //blob{threshold 0.5 cylinder {1,2,0.5,1 transform{lshintrans}} cylinder {1,2,0.5,1 transform{rshintrans}} }