POV-Ray : Newsgroups : povray.binaries.images : Another feather Server Time
2 Aug 2024 08:15:25 EDT (-0400)
  Another feather (Message 1 to 10 of 10)  
From: Charles C
Subject: Another feather
Date: 3 Nov 2007 02:39:10
Message: <472c259e@news.povray.org>
Reminded of my own passing aspirations to make a feather by mmuylle's 
post, here's my own just-begun very-rough start.  No fluff just yet.... 
:-) In fact nothing more than representative spline lines of the basic form.

Charles


Post a reply to this message


Attachments:
Download 'basicfeather.png' (132 KB)

Preview of image 'basicfeather.png'
basicfeather.png


 

From: Charles C
Subject: Re: Another feather
Date: 3 Nov 2007 04:20:41
Message: <472c3d69@news.povray.org>
Well, it's the beginning of some fluff.   It's still using 
representative spline-lines.

Charles


Post a reply to this message


Attachments:
Download 'basicfeather added a little fluff.jpg' (66 KB)

Preview of image 'basicfeather added a little fluff.jpg'
basicfeather added a little fluff.jpg


 

From: alphaQuad
Subject: Re: Another feather
Date: 5 Nov 2007 00:50:01
Message: <web.472ead9a3f40db52fb5b3e290@news.povray.org>
Would like to see all of this script. But the reason for my post is to request
the transparent colored material used on the axis.

I may have a use for this material as seen here.


Post a reply to this message

From: Charles C
Subject: Re: Another feather
Date: 5 Nov 2007 01:11:03
Message: <472eb3f7@news.povray.org>
alphaQuad wrote:
> Would like to see all of this script. But the reason for my post is to request
> the transparent colored material used on the axis.
> 
> I may have a use for this material as seen here.
> 
> 


It's nothing fancy.  Really.  Case #2:

  #switch (Ref_Axis_Textype)
  #case (1) //SOLID:
          #local Xtex = texture{ pigment{rgb x} }
          #local Ytex = texture{ pigment{rgb y} }
          #local Ztex = texture{ pigment{rgb z} }
  #break
  #case (2) //TRANSPARENT:
          #local Xtex = texture{ pigment{rgbt <1,0,0,.7>} finish{ambient 
0} }
          #local Ytex = texture{ pigment{rgbt <0,1,0,.7>} finish{ambient 
0} }
          #local Ztex = texture{ pigment{rgbt <0,0,1,.7>} finish{ambient 
0} }
  #break
  #case (3) //TRANSPARENT 0 diffuse, with ambience:
          #local Xtex = texture{ pigment{rgbt <1,0,0,.7>} finish{diffuse 
0 ambient .5} }
          #local Ytex = texture{ pigment{rgbt <0,1,0,.7>} finish{diffuse 
0 ambient .5} }
          #local Ztex = texture{ pigment{rgbt <0,0,1,.7>} finish{diffuse 
0 ambient .5} }
  #end //end #switch (Ref_Axis_Textype)


Post a reply to this message

From: alphaQuad
Subject: Re: Another feather
Date: 5 Nov 2007 08:20:00
Message: <web.472f17863f40db52c51101a30@news.povray.org>
I keep waking with answers in my head. how spooky is that?

pigment{color rgbf<1,1,1,1>} complete transparency.

I didnt realize this was so easy until this image.

glad it was posted


Post a reply to this message

From: Charles C
Subject: Re: Another feather
Date: 5 Nov 2007 19:10:00
Message: <web.472fb0b33f40db522869ae640@news.povray.org>
> glad it was posted

Hehe. Sure thing.


Post a reply to this message

From: mmuylle
Subject: Re: Another feather
Date: 11 Nov 2007 16:50:00
Message: <web.473778f93f40db52378a7f830@news.povray.org>
"Charles C" <nomail@nomail> wrote:
> > glad it was posted
>
> Hehe. Sure thing.

This will be of a great help
I apologize for the late answer
but I was ill last weeks
and couldn't work on my animation after my day job
I only found out now, and apparently to late, that there was such a swift
and totally unexpected response, which made me post the question
again today.
So please do not pay attention to the second posting
I am also struggling a bit with this message system,
and only found your response by wondering
what a beautiful feather there was in the top 100 images.
(did someone work on a similar project?)

When I am a bit further with the project
then i let you know the results

best

marc


Post a reply to this message

From: mmuylle
Subject: Re: Another feather
Date: 11 Nov 2007 17:00:00
Message: <web.47377b283f40db52378a7f830@news.povray.org>
"Charles C" <nomail@nomail> wrote:
> > glad it was posted
>
> Hehe. Sure thing.

Sorry for the 2nd question
but how did you shape the father and the fluff
can you reveal a bit of the code as well?
thanks again
marc


Post a reply to this message

From: Charles C
Subject: Re: Another feather
Date: 11 Nov 2007 19:20:00
Message: <web.47379b1b3f40db522869ae640@news.povray.org>
"mmuylle" <nomail@nomail> wrote:
> "Charles C" <nomail@nomail> wrote:
> > > glad it was posted
> >
> > Hehe. Sure thing.
>
> Sorry for the 2nd question
> but how did you shape the father and the fluff
> can you reveal a bit of the code as well?
> thanks again
> marc

Marc,
The shape of the feather is based on a couple of splines...  BTW, thanks for the
reminder... I'm meaning to get back to working on it. I made some progress the
next day making the hollow raches/calamus and improving the overall shape a
little but time have been busy...  The next step for me is going to be modeling
the "interlocking barbules" as pictured here:

http://en.wikipedia.org/wiki/Image:FeatherLocking.png

If there are any better depictions of just exactly what those look like (how
wide things are etc), I'd like to know.

There's a starting and end point for attach-points for the barbs along the
rachis, and there's a macro which creates unique splines up and down the rachis
as the other ends of the barbs go around the profile spline.  For a certain
range on the rachis the end point and tangent control points of the barb
(cubic) splines are modified by random vectors, increasing towards the calamus.

I'm not sure that was very clear but I'll try to clean it up a little and post
some code a little later on. Right now I'm not at home.

Charles


Post a reply to this message

From: Charles C
Subject: Re: Another feather
Date: 12 Nov 2007 02:12:19
Message: <4737fcd3@news.povray.org>
> "mmuylle" <nomail@nomail> wrote:
>> can you reveal a bit of the code as well?

Here's some of it. It's not necessarily all cleaned up. I could post a 
more complete file but I'm starting to feel self conscious about posting 
wip-code etc. :)

Charles



// This macro returns the scale_b equivalent of a value a_posi on scale_a.
// One possible use would be to convert celcius to farenheit or vice 
versa by knowning
// freezing and boiling temps: Range_Converter(25,0,100,32,212) returns: 
77 (degrees F)
//((25-0) *(212-32)/(100-0 )) + 32 = 77
//((77-32)*(100-0 )/(212-32)) + 0  = 25
// A more probable use for animation would be to convert one time scale 
to another.
//
#macro Range_Convert(a_posi, a_low, a_high, b_low, b_high)
       (   ( (a_posi-a_low)*(b_high-b_low)/(a_high-a_low) ) + b_low    )
#end // end macro Range_Converter




#macro Spline_From_Array (The_Array, Array_Length )
   //I'm not sure why, but for some reason POV-Ray crashes if this gets 
changed to #local:
   #declare ATempSpline = spline{
    cubic_spline
    #local Ctr = 0;
    #while (Ctr < Array_Length)
       #local Tempfloat = The_Array[Ctr].t;
       Tempfloat,  <The_Array[Ctr].x, The_Array[Ctr].y, 
The_Array[Ctr].z>, //The_Array should be an array of vectors
      #local Ctr = Ctr+1;
    #end //end while
   } //end spline
   //
   ATempSpline
   //
#end //end #macro Spline_From_Array (The_Array, Array_Length )


#macro Plot_Spline (TheSpline, Plot_Min_Val, 
Plot_Max_Val,Thickness,Frequency)//, PlotColor, PlotType)
   #if(Frequency < 1)
     #local Inc = (Plot_Max_Val-Plot_Min_Val)/(1/Frequency);
   #else
     #local Inc = (Plot_Max_Val-Plot_Min_Val)/Frequency;
   #end
   //
   object{
    union{
     #local Ctr = Plot_Min_Val;
     #while (Ctr < Plot_Max_Val)
       sphere {
         TheSpline(Ctr),Thickness
         pigment { rgb <1-Ctr,Ctr,0> }
         finish {ambient 1 }
         }
       #local Ctr = Ctr + Inc;
     #end
    } //end union
   } //end object
#end  //end #macro Plot_Spline()






#declare BasicFeather_Rachis_SplineArray_Length = 5;
#declare BasicFeather_Rachis_SplineArray =
array[BasicFeather_Rachis_SplineArray_Length]{
     < -.20000, -0.05,    0,   -1/20>, //tangent
     < 0.00000,     0,    0,    0/20>, //root
   //< 0.00000,     0,    0,    1/20>,
   //< 0.00000,     0,    0,    2/20>,
   //< 0.00000,     0,    0,    3/20>,
   //< 0.00000,     0,    0,    4/20>,
   //< 0.00000,     0,    0,    9/40>, //added precision control point
   //< 0.00000,     0,    0,    5/20>,
   //< 0.00000,     0,    0,    6/20>,
   //< 0.00000,     0,    0,    7/20>,
   //< 0.00000,     0,    0,    8/20>,
   //< 0.00000,     0,    0,    9/20>,
     < 2.00000,  0.25,    0,   10/20>, //halfway
   //< 0.00000,     0,    0,   11/20>,
   //< 0.00000,     0,    0,   12/20>,
   //< 0.00000,     0,    0,   13/20>,
   //< 0.00000,     0,    0,   14/20>,
   //< 0.00000,     0,    0,   15/20>,
   //< 0.00000,     0,    0,   16/20>,
   //< 0.00000,     0,    0,   17/20>,
   //< 0.00000,     0,    0,   18/20>,
   //< 0.00000,     0,    0,   19/20>,
     < 4.00000,     0,    0,   20/20>, //tip
     < 4.20000, -0.05,    0,   21/20>  //tangent
}; // end array BasicFeather_Rachis_SplineArray
//



#declare BasicFeather_Rachis_Spline = Spline_From_Array 
(BasicFeather_Rachis_SplineArray,BasicFeather_Rachis_SplineArray_Length);
//Plot_Spline(BasicFeather_Rachis_Spline,0,1,.005,.001)




#declare BasicFeather_Profile_SplineArray_Length = 9;
#declare BasicFeather_Profile_SplineArray =
array[BasicFeather_Profile_SplineArray_Length]{
     < BasicFeather_Rachis_Spline(.05).x, 
BasicFeather_Rachis_Spline(.1).y, 
BasicFeather_Rachis_Spline(.1).z-.1,   -1/20> //tangent
     < BasicFeather_Rachis_Spline(.10).x, 
BasicFeather_Rachis_Spline(.15).y,    BasicFeather_Rachis_Spline(.15).z, 
      0/20> //root
   //<  1/20,     0.00000,    0,    1/20>
   //<  2/20,     0.00000,    0,    2/20>
   //<  3/20,     0.00000,    0,    3/20>
   //<     0,     0.00000,    0,    4/20>
   //<  9/40,     0.00000,    0,    9/40> //added precision control point
     <     2,        0.25,   .7,    5/20>
   //<  6/20,     0.00000,    0,    6/20>
   //<  7/20,     0.00000,    0,    7/20>
     <   3.5,        0.05,   .5,    8/20>
   //<  9/20,     0.00000,    0,    9/20>
     < BasicFeather_Rachis_Spline(1).x, 
BasicFeather_Rachis_Spline(1).y,    BasicFeather_Rachis_Spline(1).z, 
   10/20> //tip
   //< 11/20,     0.00000,    0,   11/20>
     <   3.5,        0.05,  -.5,   12/20>
   //< 13/20,     0.00000,    0,   13/20>
   //< 14/20,     0.00000,    0,   14/20>
     <     2,        0.25,  -.7,   15/20>
   //< 16/20,     0.00000,    0,   16/20>
   //< 17/20,     0.00000,    0,   17/20>
   //< 18/20,     0.00000,    0,   18/20>
   //< 19/20,     0.00000,    0,   19/20>
     < BasicFeather_Rachis_Spline(.10).x, 
BasicFeather_Rachis_Spline(.15).y,    BasicFeather_Rachis_Spline(.15).z, 
     20/20> //root
     < BasicFeather_Rachis_Spline(.05).x, 
BasicFeather_Rachis_Spline(.1).y, 
BasicFeather_Rachis_Spline(.1).z+.1,   21/20> //tangent
}; // end array BasicFeather_Profile_SplineArray



#declare BasicFeather_Profile_Spline = Spline_From_Array 
(BasicFeather_Profile_SplineArray,BasicFeather_Profile_SplineArray_Length);
//Plot_Spline(BasicFeather_Profile_Spline,0,1,.005,.001)




#declare BasicFeatherRand = seed(9930);

#macro BasicFeather_Make_Barb_Spline(RachisValue,ProfileValue,Vector, 
FlufTurbulance)//, FlufBarbPortion)
     #local RachisPoint = BasicFeather_Rachis_Spline(RachisValue);
     #local ProfilePoint = BasicFeather_Profile_Spline(ProfileValue);
     #local DistFromRachisToProfile = VDist(RachisPoint,ProfilePoint);
     #local TempVec = vnormalize(ProfilePoint - RachisPoint);
     #local TempVec = vnormalize(TempVec + Vector);
     //
     #if(ProfileValue <= 0.5)
         //do nothing
     #else
         #local TempVec = <TempVec.x,TempVec.y*-1,TempVec.z>;
     #end //end #if(ProfileValue <= 0.5)
     //
     #local TempVec = TempVec * DistFromRachisToProfile/4;
     #local StartTangentPoint = RachisPoint+(-1*TempVec/5);
     #local QuarterBarbPoint = RachisPoint + TempVec;
     #local EndTangentPoint = 
ProfilePoint+(-1*(ProfilePoint-2*QuarterBarbPoint)/10);
     //
     #local Random_ProfilePoint_Adjustment_Vec = 
(rand(BasicFeatherRand)-.5)*2*FlufTurbulance;
     #local Random_TangentPoint_Adjustment_Vec = 
(rand(BasicFeatherRand)-.5)*2*FlufTurbulance;
     #local Random_ExtraPoint_Adjustment_Vec   = 
(rand(BasicFeatherRand)-.5)*2*FlufTurbulance/2;
     //
     #declare BasicFeather_New_Barb_Spline = spline{
               cubic_spline
               -0.2, StartTangentPoint,
                  0, RachisPoint,
               0.25, QuarterBarbPoint,
               #if(Random_ExtraPoint_Adjustment_Vec!= 0) .6, 
ProfilePoint+Random_ExtraPoint_Adjustment_Vec, #end
                  1, ProfilePoint+Random_ProfilePoint_Adjustment_Vec,
                1.2, EndTangentPoint+Random_TangentPoint_Adjustment_Vec,
     }; //end spline
#end  //end #macro 
BasicFeather_Make_Barb_Spline(RachisValue,ProfileValue,Vector)




#declare BasicFeather_Number_Of_Barb_Splines = 144/3;   // set number of 
barbs
#declare BasicFeather_Array_Of_Barb_Splines = 
array[BasicFeather_Number_Of_Barb_Splines];




#macro 
BasicFeather_Make_Lots_Of_Barbs(StartValue,EndValue,FlufTurbMax,FlufEnd)
     #local Ctr = 0;
     #while(Ctr < BasicFeather_Number_Of_Barb_Splines)

         #local AngleVec = vnormalize(<1,.1,1>)/3;

         #if(Ctr <= BasicFeather_Number_Of_Barb_Splines/2)
            #local RachisVal = 
Range_Convert(Ctr/BasicFeather_Number_Of_Barb_Splines,0,.5,StartValue,EndValue); 


         #else
            #local RachisVal = 
Range_Convert(Ctr/BasicFeather_Number_Of_Barb_Splines,.5,1,EndValue,StartValue); 

            #local AngleVec = <AngleVec.x,AngleVec.y,-AngleVec.z>;
         #end
         #local FlufActual = 0;
         #if (   ( (FlufEnd >=StartValue) & (FlufEnd <= EndValue) ) & ( 
(RachisVal >=StartValue) & (RachisVal <= FlufEnd) )   )
              #local FlufFactor = 
Range_Convert(Ctr/BasicFeather_Number_Of_Barb_Splines,StartValue,FlufEnd,1,0);
              #local FlufActual = FlufTurbMax*FlufFactor;
         #end

             //sphere{BasicFeather_Rachis_Spline(RachisVal), 0.02 
pigment {rgb <0,0,1>}   }


         #local ProfileVal = Ctr/BasicFeather_Number_Of_Barb_Splines;
         //BasicFeather_Make_Barb_Spline(RachisValue,ProfileValue,Vector)
         #debug "* HI *"
         //#declare BasicFeather_Array_Of_Barb_Splines[Ctr] = 
BasicFeather_Make_Barb_Spline(RachisVal,ProfileVal,AngleVec,FlufActual);
 
BasicFeather_Make_Barb_Spline(RachisVal,ProfileVal,AngleVec,FlufActual)
         #declare BasicFeather_Array_Of_Barb_Splines[Ctr] = 
BasicFeather_New_Barb_Spline;


             //#local TempSpline = BasicFeather_Array_Of_Barb_Splines[Ctr];

             //#local TempSpline = 
BasicFeather_Make_Barb_Spline(RachisVal,ProfileVal,AngleVec);
     //Plot_Spline(TempSpline,0,1,.005,.001)

         #local Ctr = Ctr + 1;
     #end //end #while


#end //end  #macro BasicFeather_Make_Lots_Of_Barbs()



BasicFeather_Make_Lots_Of_Barbs(.05,.8,.065,.30)


#local Ctr = 0;
#while(Ctr < BasicFeather_Number_Of_Barb_Splines)
     #local TempSpline = BasicFeather_Array_Of_Barb_Splines[Ctr];
     Plot_Spline(TempSpline,0,1,.002,.002)
     #local Ctr = Ctr + 1;
#end //end #while


Post a reply to this message


Attachments:
Download 'basicfeather 2007 11 03 03.png' (211 KB)

Preview of image 'basicfeather 2007 11 03 03.png'
basicfeather 2007 11 03 03.png


 

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.