POV-Ray : Newsgroups : povray.text.scene-files : Learner IK problems... (see p.b.i for problem description) Server Time
1 Jul 2024 02:51:37 EDT (-0400)
  Learner IK problems... (see p.b.i for problem description) (Message 1 to 3 of 3)  
From: Mark Hanford
Subject: Learner IK problems... (see p.b.i for problem description)
Date: 14 Feb 2002 17:14:51
Message: <3c6c36db@news.povray.org>
#debug "\n\nStarting IK Finger...\n\n"

//Some containers for numbers
#declare Length=array[3]{2,2,2}
#declare Rotate=array[3]{0,0,0}
#declare MaxAng=array[3]{90,90,90}
#declare Tip   =array[3]{<0,0,0>, <0,0,0>, <0,0,0>}
#declare Torque=array[3]{0,0,0}
#declare Right =array[3]{<0,0,0>, <0,0,0>, <0,0,0>}
#declare Force =array[3]{<0,0,0>, <0,0,0>, <0,0,0>}

#declare Delta=1;
#declare TargetBailout=0.5;
#declare TorqueBailout=0.001;
#declare MaxIterations=200;
#declare TargetReached=no;


//Some tools
#macro ShowVector(V1, V2)
  cone{V1, 0.05, V2, 0.0 texture{pigment{color rgb<1,1,0>}}}
#end

#macro Vector2Text(V)
  vstr(3,V,", ",4,2)
#end

#macro Number2Text(N)
  str(N,7,4)
#end

#declare Target=
  union{
    cone{0.06*x, 0, 1*x, 0.2}
    cone{0.06*x, 0, 1*x, 0.2 rotate 90*z}
    cone{0.06*x, 0, 1*x, 0.2 rotate 180*z}
    cone{0.06*x, 0, 1*x, 0.2 rotate 270*z}
    sphere{0, TargetBailout}
    texture{pigment{color rgbt<0,1,1,0.5>}}
  }

#macro Joint(length)
  merge{
    sphere{0, 0.2}
    cone{0, 0.2, length*x, 0.05}
    sphere{length*x, 0.05}
    cylinder{0, 50*x, 0.01}
  }
#end

#if (clock_on)
  #declare current_frame=(clock/clock_delta)+1;
#else
  #declare current_frame=1;
#end
  #debug concat("\n ******* ", Number2Text(current_frame), " *******\n")

#declare Joint0=object{Joint(Length[0]) texture{pigment{color
rgbt<1,0,0,0.5>}}}
#declare Joint1=object{Joint(Length[1]) texture{pigment{color
rgbt<0,1,0,0.5>}}}
#declare Joint2=object{Joint(Length[2]) texture{pigment{color
rgbt<0,0,1,0.5>}}}



//Calculates positions of each tip, and if the last one is close to the
target,
//  sets a variable to say so.
#macro CalcTipsFK()
  #declare Tip[0]=vrotate(Length[0]*x, Rotate[0]*z);
  #declare Tip[1]=Tip[0]+vrotate(Length[1]*x, (Rotate[0]+Rotate[1])*z);
  #declare Tip[2]=Tip[1]+vrotate(Length[2]*x,
(Rotate[0]+Rotate[1]+Rotate[2])*z);

  //object{ShowVector(Tip[0], Tip[1])}
  //object{ShowVector(Tip[1], Tip[2])}

  #if (vlength(TargetLocation-Tip[2])<TargetBailout)
    #declare TargetReached=yes;
    #debug "\n**Target Reached"
  #else
    #declare TargetReached=no;
  #end
#end


#declare TargetLocation=<2.5,3,0>;


//rotate the joint to point at the target
#macro ReorientTip2()
  CalcTipsFK()
  #declare Torque[2]=3*Delta;
  #while (Torque[2]>TorqueBailout)
    #if (TargetReached)
      #declare Torque[2]=0;
      #debug "TR"
    #else
      CalcTipsFK()
      #declare Right[2]=vrotate(<0,1,0>, (Rotate[0]+Rotate[1]+Rotate[2])*z);
      #declare Force[2]=TargetLocation-Tip[1];
      #declare Torque[2]=vdot(Right[2], Force[2])*Delta;
      #declare Rotate[2]=Rotate[2]+Torque[2];
      //#debug concat("\n  Torque[2]: ", Number2Text(Torque[2]/Delta))
    #end
  #end
#end



#macro ReorientTip1once()
  CalcTipsFK()
  #declare Right[1]=vrotate(<0,1,0>, (Rotate[0]+Rotate[1])*z);
  #declare Force[1]=TargetLocation-Tip[0];
  #declare Torque[1]=vdot(Right[1], Force[1])*Delta;
  #declare Rotate[1]=Rotate[1]+Torque[1];
  //#debug concat("\n  Torque[1]: ", Number2Text(Torque[1]))
#end


#declare Rotate[1]=90*clock;

  ReorientTip2()


/*
#declare i=0; #while (i<5)
  CalcTipsFK()
  ReorientTip1once()
  CalcTipsFK()
  ReorientTip2()
#declare i=i+1; #end
*/


CalcTipsFK()




object{Target translate TargetLocation}
object{Joint0 rotate (Rotate[0])*z}
object{Joint1 rotate (Rotate[0]+Rotate[1])*z translate Tip[0]}
object{Joint2 rotate (Rotate[0]+Rotate[1]+Rotate[2])*z translate Tip[1]}


#declare Camera_Location=<3, 3, -20>;
#declare Camera_Target=<3,3,0>;
#declare Camera_Angle=25;
#declare Use_AreaLights=no;
#declare Use_Rad=no;
#declare Ground_Height=-1;
#declare Draw_Sky=no;
#declare Draw_Ground=no;


#include "robot-testrig.inc"

#debug "\n\nEnd\n\n"


Post a reply to this message

From: Ben Birdsey
Subject: Re: Learner IK problems... (see p.b.i for problem description)
Date: 18 Feb 2002 03:14:41
Message: <3C70B93C.E745C420@mail.com>
Mark -

Here's a try at "repairing" the code.  I think this method will scale to
any number of joints, as long as you don't go crazy!

I think the only difference is that I am figuring out how much each
joint should move by adding up two vector functions and weighting them
by a factor ("contraction").  This seems like a pretty general method.  

I would like to add in "stiffness" to the joints that responds to the
MinAng and MaxAng parameters.

Anyway, it still needs to be cleaned up a bit but I hope it works for
you.


- Ben

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#debug "\n\nStarting IK Finger...\n\n"

//Some containers for numbers
#declare Length = array[3]{2,2,2}
#declare Rotate = array[3]{0,0,0}
#declare MinAng = array[3]{-20,-90,-2}
#declare MaxAng = array[3]{90,90,90}


//Try both of these joint definitions!!!
#declare Joint  = array[3]{<1,0,0>, <0,1,0>, <0,0,1>}
//#declare Joint  = array[3]{<0,0,1>, <0,0,1>, <0,0,1>}


#declare tJoint = array[3]{<0,0,1>, <0,1,0>, <0,0,1>}

#declare Base   = array[3]{<0,0,0>, <0,0,0>, <0,0,0>}
#declare Tip    = array[3]{<0,0,0>, <0,0,0>, <0,0,0>}
#declare Torque = array[3]{0,0,0}

#declare seed1 = seed(-1);

//
//  Important Constants
//

#declare TargetLocation = <2,3,0>;
#declare FingerLocation = <0,0,0>;

#declare Delta = 1.0;
#declare TargetBailout=0.3;
#declare TorqueBailout=0.001;
#declare MaxIterations=800;
#declare TargetReached=no;

#declare contraction    = 1/1;



//
//  Define the workhorse functions to 
//  calculate angular and radial "distances"
//

#macro DistAng(VA,VB)
(  1.0  -  vdot(VA,VB)/vlength(VA)/vlength(VB) )/2.0
#end

#macro DistRad(V1,V2)
(  vlength(V1)  -  vlength(V2)  )
#end

#macro PlaneNormal(V1,V2)
vnormalize( vcross(V1,V2) )
#end

#macro WeightAng(Target,Tip,Joint)
DistAng(Target,Tip)*vdot(PlaneNormal(Tip,Target),Joint)
#end

//random numbers added so the program wouldn't freeze up
//if the joints were in a straight line
#macro WeightRad(Target,Tip,Leg,Joint)
(
DistRad(Target,Tip)*vdot(PlaneNormal(Leg,Tip-Leg),Joint)/vlength(Target)
+ (rand(seed1)-0.5)*1e-5 )
#end

//
//Some tools
//
#macro ShowVector(V1, V2)
  cone{V1, 0.05, V2, 0.0 texture{pigment{color rgb<1,1,0>}}}
#end

#macro Vector2Text(V)
  vstr(3,V,", ",4,2)
#end

#macro Number2Text(N)
  str(N,7,4)
#end

//
//  Define Common Objects
//

#macro MakeJoint(V1,V2)
  merge{
    sphere{V1, 0.2}
    cone{V1, 0.2, V2, 0.05}
    sphere{V2, 0.05}
    cylinder{V1, V2 + 50*(V2-V1), 0.01}
  }
#end

#declare Target=
  union{
    cone{0.06*x, 0, 1*x, 0.2}
    cone{0.06*x, 0, 1*x, 0.2 rotate 90*z}
    cone{0.06*x, 0, 1*x, 0.2 rotate 180*z}
    cone{0.06*x, 0, 1*x, 0.2 rotate 270*z}
    sphere{0, TargetBailout}
    texture{pigment{color rgbt<0,1,1,0.5>}}
  }


#if (clock_on)
  #declare current_frame=(clock/clock_delta)+1;
#else
  #declare current_frame=1;
#end
  #debug concat("\n ******* ", Number2Text(current_frame), " *******\n")

//Calculates positions of each tip, and if the last one is close to the
target,
//  sets a variable to say so.
#macro CalcTipsFK()
  #declare Base[0]   = FingerLocation;
  #declare tJoint[0] = Joint[0];
  #declare Tip[0]    = Base[0] +
vaxis_rotate(Length[0]*x,tJoint[0],Rotate[0]);

  #declare Base[1]   = Tip[0];
  #declare tJoint[1] =           vaxis_rotate(Joint[1]  
,tJoint[0],Rotate[0]);
  #declare Tip[1]    =          
vaxis_rotate(Length[1]*x,tJoint[0],Rotate[0]);
  #declare Tip[1]    = Base[1] + vaxis_rotate(Tip[1]    
,tJoint[1],Rotate[1]);
  
  #declare Base[2]   = Tip[1];
  #declare tJoint[2] =           vaxis_rotate( Joint[2] 
,tJoint[0],Rotate[0]);
  #declare tJoint[2] =           vaxis_rotate(tJoint[2] 
,tJoint[1],Rotate[1]);
  #declare Tip[2]    =          
vaxis_rotate(Length[2]*x,tJoint[0],Rotate[0]);
  #declare Tip[2]    =           vaxis_rotate(Tip[2]    
,tJoint[1],Rotate[1]);
  #declare Tip[2]    = Base[2] + vaxis_rotate(Tip[2]    
,tJoint[2],Rotate[2]);
  
  #if (vlength(TargetLocation-Tip[2])<TargetBailout)
    #declare TargetReached=yes;
    #debug "\n**Target Reached"
    #debug concat("\n  Iterations: ", Number2Text(ct))

  #else
    #declare TargetReached=no;
  #end
#end


//rotate the joint to point at the target
#macro ReorientTip2()
  CalcTipsFK()

  #declare TotLength = Length[0]+Length[1]+Length[2];
   
  #declare ct = 0;
  #declare finished = false;
  #while (!finished & ct<MaxIterations)
    #if (TargetReached)
      #declare finished = true;
      #debug "TR"
    #else
      CalcTipsFK()

      #declare TotTip    = Tip[2]-Base[0];
      
      #declare tTarget   = TargetLocation-Base[0];
      #declare tTip      = Tip[2]-Base[0];
      #declare tLegLast  = x;
      #declare tLeg      = Tip[0]-Base[0];
      #declare tLength   = Length[0]+Length[1]+Length[2];
      #declare Torque[0] = ( WeightAng(tTarget,tTip,Joint[0]) + 
                            
0*WeightRad(tTarget,TotTip,tLeg,Joint[0])*contraction ); 
                                                 
      #declare tTarget   = TargetLocation-Base[1];         
      #declare tTip      = Tip[2]-Base[1];
      #declare tLegLast  = tLeg;
      #declare tLeg      = Tip[1]-Base[1];
      #declare tLength   = Length[1]+Length[2];
      #declare Torque[1] = ( 0*WeightAng(tTarget,tTip,Joint[1]) + 
                            
WeightRad(tTarget,TotTip,tLeg,Joint[1])*contraction );

      #declare tTarget   =
TargetLocation-Base[2];                           
      #declare tTip      = Tip[2]-Base[2];
      #declare tLegLast  = tLeg;
      #declare tLeg      = Tip[2]-Base[2];
      #declare tLength   = Length[2];
      #declare Torque[2] = ( WeightAng(tTarget,tTip,Joint[2]) + 
                            
0*WeightRad(tTarget,TotTip,tLeg,Joint[2])*contraction );
      
      #declare Weight = abs(Torque[0]) + abs(Torque[1]) + abs(Torque[2])
+ 1e-5;
      //Put in the small constant so there wouldn't be any "divide by
zero" errors
      
      #declare Rotate[0] = max(Rotate[0] + Delta * Torque[0] / Weight,
MinAng[0]);
      #declare Rotate[1] = max(Rotate[1] + Delta * Torque[1] / Weight,
MinAng[1]);
      #declare Rotate[2] = max(Rotate[2] + Delta * Torque[2] / Weight,
MinAng[2]);
      
      #declare Rotate[0] = min( Rotate[0], MaxAng[0] );
      #declare Rotate[1] = min( Rotate[1], MaxAng[1] );
      #declare Rotate[2] = min( Rotate[2], MaxAng[2] );
      
      #declare ct = ct + 1;

      #debug concat("\n  Rotate[0]: ", Number2Text(Rotate[0]))
      #debug concat("    Rotate[1]: ", Number2Text(Rotate[1]))
      #debug concat("    Rotate[2]: ", Number2Text(Rotate[2]))
      
      //#debug concat("\n  Iterations: ", Number2Text(ct))
      //#debug concat("\n  Torque[2]: ", Number2Text(Torque[2]/Delta))
    #end
  #end
#end


ReorientTip2()
CalcTipsFK()

//
//  Somehow, these declarations needed to be moved to work...
//

#declare Joint0 = 
object{
        MakeJoint(FingerLocation,Tip[0])
        texture{pigment{color rgbt<1,0,0,0.5>}}
}
#declare Joint1 = 
object{
        MakeJoint(Tip[0],Tip[1])
        texture{pigment{color rgbt<0,1,0,0.5>}}
}
#declare Joint2 = object{
        MakeJoint(Tip[1],Tip[2])
        texture{pigment{color rgbt<0,0,1,0.5>}}
}

object{Target translate TargetLocation}
object{Joint0}
object{Joint1}
object{Joint2}


//
//My stupid version of your "robot-testrig.inc" file
//

background{ rgb <1,1,1> }

#declare Camera_Location=<3/2, 3/2, -20>;
#declare Camera_Target=<3/2,3/2,0>;
#declare Camera_Angle=25;
#declare Use_AreaLights=no;
#declare Use_Rad=no;
#declare Ground_Height=-1;
#declare Draw_Sky=no;
#declare Draw_Ground=no;


// create a regular point light source
light_source
{
  0*x // light's position (translated below)
  color red 1.0  green 1.0  blue 1.0  // light's color
  translate <-20, 40, -20>
}

camera {
  location  Camera_Location
  look_at   Camera_Target
  angle     Camera_Angle
}


//#include "robot-testrig.inc"

#debug "\n\nEnd\n\n"


Post a reply to this message

From: Mark Hanford
Subject: Re: Learner IK problems... (see p.b.i for problem description)
Date: 18 Feb 2002 08:50:37
Message: <3c7106ad@news.povray.org>
Thank you!!

I'm at work at the moment, but I'll have a look later...

thanks again,

Mark Hanford
http://www.mrhanford.com/povray


"Ben Birdsey" <cla### [at] mailcom> wrote in message
news:3C70B93C.E745C420@mail.com...
>
> Mark -
>
> Here's a try at "repairing" the code.  I think this method will scale to
> any number of joints, as long as you don't go crazy!
>
> I think the only difference is that I am figuring out how much each
> joint should move by adding up two vector functions and weighting them
> by a factor ("contraction").  This seems like a pretty general method.
>
> I would like to add in "stiffness" to the joints that responds to the
> MinAng and MaxAng parameters.
>
> Anyway, it still needs to be cleaned up a bit but I hope it works for
> you.
>
>
> - Ben
>
> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>
> #debug "\n\nStarting IK Finger...\n\n"
>
> //Some containers for numbers
> #declare Length = array[3]{2,2,2}
> #declare Rotate = array[3]{0,0,0}
> #declare MinAng = array[3]{-20,-90,-2}
> #declare MaxAng = array[3]{90,90,90}
>
>
> //Try both of these joint definitions!!!
> #declare Joint  = array[3]{<1,0,0>, <0,1,0>, <0,0,1>}
> //#declare Joint  = array[3]{<0,0,1>, <0,0,1>, <0,0,1>}
>
>
> #declare tJoint = array[3]{<0,0,1>, <0,1,0>, <0,0,1>}
>
> #declare Base   = array[3]{<0,0,0>, <0,0,0>, <0,0,0>}
> #declare Tip    = array[3]{<0,0,0>, <0,0,0>, <0,0,0>}
> #declare Torque = array[3]{0,0,0}
>
> #declare seed1 = seed(-1);
>
> //
> //  Important Constants
> //
>
> #declare TargetLocation = <2,3,0>;
> #declare FingerLocation = <0,0,0>;
>
> #declare Delta = 1.0;
> #declare TargetBailout=0.3;
> #declare TorqueBailout=0.001;
> #declare MaxIterations=800;
> #declare TargetReached=no;
>
> #declare contraction    = 1/1;
>
>
>
> //
> //  Define the workhorse functions to
> //  calculate angular and radial "distances"
> //
>
> #macro DistAng(VA,VB)
> (  1.0  -  vdot(VA,VB)/vlength(VA)/vlength(VB) )/2.0
> #end
>
> #macro DistRad(V1,V2)
> (  vlength(V1)  -  vlength(V2)  )
> #end
>
> #macro PlaneNormal(V1,V2)
> vnormalize( vcross(V1,V2) )
> #end
>
> #macro WeightAng(Target,Tip,Joint)
> DistAng(Target,Tip)*vdot(PlaneNormal(Tip,Target),Joint)
> #end
>
> //random numbers added so the program wouldn't freeze up
> //if the joints were in a straight line
> #macro WeightRad(Target,Tip,Leg,Joint)
> (
> DistRad(Target,Tip)*vdot(PlaneNormal(Leg,Tip-Leg),Joint)/vlength(Target)
> + (rand(seed1)-0.5)*1e-5 )
> #end
>
> //
> //Some tools
> //
> #macro ShowVector(V1, V2)
>   cone{V1, 0.05, V2, 0.0 texture{pigment{color rgb<1,1,0>}}}
> #end
>
> #macro Vector2Text(V)
>   vstr(3,V,", ",4,2)
> #end
>
> #macro Number2Text(N)
>   str(N,7,4)
> #end
>
> //
> //  Define Common Objects
> //
>
> #macro MakeJoint(V1,V2)
>   merge{
>     sphere{V1, 0.2}
>     cone{V1, 0.2, V2, 0.05}
>     sphere{V2, 0.05}
>     cylinder{V1, V2 + 50*(V2-V1), 0.01}
>   }
> #end
>
> #declare Target=
>   union{
>     cone{0.06*x, 0, 1*x, 0.2}
>     cone{0.06*x, 0, 1*x, 0.2 rotate 90*z}
>     cone{0.06*x, 0, 1*x, 0.2 rotate 180*z}
>     cone{0.06*x, 0, 1*x, 0.2 rotate 270*z}
>     sphere{0, TargetBailout}
>     texture{pigment{color rgbt<0,1,1,0.5>}}
>   }
>
>
> #if (clock_on)
>   #declare current_frame=(clock/clock_delta)+1;
> #else
>   #declare current_frame=1;
> #end
>   #debug concat("\n ******* ", Number2Text(current_frame), " *******\n")
>
> //Calculates positions of each tip, and if the last one is close to the
> target,
> //  sets a variable to say so.
> #macro CalcTipsFK()
>   #declare Base[0]   = FingerLocation;
>   #declare tJoint[0] = Joint[0];
>   #declare Tip[0]    = Base[0] +
> vaxis_rotate(Length[0]*x,tJoint[0],Rotate[0]);
>
>   #declare Base[1]   = Tip[0];
>   #declare tJoint[1] =           vaxis_rotate(Joint[1]
> ,tJoint[0],Rotate[0]);
>   #declare Tip[1]    =
> vaxis_rotate(Length[1]*x,tJoint[0],Rotate[0]);
>   #declare Tip[1]    = Base[1] + vaxis_rotate(Tip[1]
> ,tJoint[1],Rotate[1]);
>
>   #declare Base[2]   = Tip[1];
>   #declare tJoint[2] =           vaxis_rotate( Joint[2]
> ,tJoint[0],Rotate[0]);
>   #declare tJoint[2] =           vaxis_rotate(tJoint[2]
> ,tJoint[1],Rotate[1]);
>   #declare Tip[2]    =
> vaxis_rotate(Length[2]*x,tJoint[0],Rotate[0]);
>   #declare Tip[2]    =           vaxis_rotate(Tip[2]
> ,tJoint[1],Rotate[1]);
>   #declare Tip[2]    = Base[2] + vaxis_rotate(Tip[2]
> ,tJoint[2],Rotate[2]);
>
>   #if (vlength(TargetLocation-Tip[2])<TargetBailout)
>     #declare TargetReached=yes;
>     #debug "\n**Target Reached"
>     #debug concat("\n  Iterations: ", Number2Text(ct))
>
>   #else
>     #declare TargetReached=no;
>   #end
> #end
>
>
> //rotate the joint to point at the target
> #macro ReorientTip2()
>   CalcTipsFK()
>
>   #declare TotLength = Length[0]+Length[1]+Length[2];
>
>   #declare ct = 0;
>   #declare finished = false;
>   #while (!finished & ct<MaxIterations)
>     #if (TargetReached)
>       #declare finished = true;
>       #debug "TR"
>     #else
>       CalcTipsFK()
>
>       #declare TotTip    = Tip[2]-Base[0];
>
>       #declare tTarget   = TargetLocation-Base[0];
>       #declare tTip      = Tip[2]-Base[0];
>       #declare tLegLast  = x;
>       #declare tLeg      = Tip[0]-Base[0];
>       #declare tLength   = Length[0]+Length[1]+Length[2];
>       #declare Torque[0] = ( WeightAng(tTarget,tTip,Joint[0]) +
>
> 0*WeightRad(tTarget,TotTip,tLeg,Joint[0])*contraction );
>
>       #declare tTarget   = TargetLocation-Base[1];
>       #declare tTip      = Tip[2]-Base[1];
>       #declare tLegLast  = tLeg;
>       #declare tLeg      = Tip[1]-Base[1];
>       #declare tLength   = Length[1]+Length[2];
>       #declare Torque[1] = ( 0*WeightAng(tTarget,tTip,Joint[1]) +
>
> WeightRad(tTarget,TotTip,tLeg,Joint[1])*contraction );
>
>       #declare tTarget   =
> TargetLocation-Base[2];
>       #declare tTip      = Tip[2]-Base[2];
>       #declare tLegLast  = tLeg;
>       #declare tLeg      = Tip[2]-Base[2];
>       #declare tLength   = Length[2];
>       #declare Torque[2] = ( WeightAng(tTarget,tTip,Joint[2]) +
>
> 0*WeightRad(tTarget,TotTip,tLeg,Joint[2])*contraction );
>
>       #declare Weight = abs(Torque[0]) + abs(Torque[1]) + abs(Torque[2])
> + 1e-5;
>       //Put in the small constant so there wouldn't be any "divide by
> zero" errors
>
>       #declare Rotate[0] = max(Rotate[0] + Delta * Torque[0] / Weight,
> MinAng[0]);
>       #declare Rotate[1] = max(Rotate[1] + Delta * Torque[1] / Weight,
> MinAng[1]);
>       #declare Rotate[2] = max(Rotate[2] + Delta * Torque[2] / Weight,
> MinAng[2]);
>
>       #declare Rotate[0] = min( Rotate[0], MaxAng[0] );
>       #declare Rotate[1] = min( Rotate[1], MaxAng[1] );
>       #declare Rotate[2] = min( Rotate[2], MaxAng[2] );
>
>       #declare ct = ct + 1;
>
>       #debug concat("\n  Rotate[0]: ", Number2Text(Rotate[0]))
>       #debug concat("    Rotate[1]: ", Number2Text(Rotate[1]))
>       #debug concat("    Rotate[2]: ", Number2Text(Rotate[2]))
>
>       //#debug concat("\n  Iterations: ", Number2Text(ct))
>       //#debug concat("\n  Torque[2]: ", Number2Text(Torque[2]/Delta))
>     #end
>   #end
> #end
>
>
> ReorientTip2()
> CalcTipsFK()
>
> //
> //  Somehow, these declarations needed to be moved to work...
> //
>
> #declare Joint0 =
> object{
>         MakeJoint(FingerLocation,Tip[0])
>         texture{pigment{color rgbt<1,0,0,0.5>}}
> }
> #declare Joint1 =
> object{
>         MakeJoint(Tip[0],Tip[1])
>         texture{pigment{color rgbt<0,1,0,0.5>}}
> }
> #declare Joint2 = object{
>         MakeJoint(Tip[1],Tip[2])
>         texture{pigment{color rgbt<0,0,1,0.5>}}
> }
>
> object{Target translate TargetLocation}
> object{Joint0}
> object{Joint1}
> object{Joint2}
>
>
> //
> //My stupid version of your "robot-testrig.inc" file
> //
>
> background{ rgb <1,1,1> }
>
> #declare Camera_Location=<3/2, 3/2, -20>;
> #declare Camera_Target=<3/2,3/2,0>;
> #declare Camera_Angle=25;
> #declare Use_AreaLights=no;
> #declare Use_Rad=no;
> #declare Ground_Height=-1;
> #declare Draw_Sky=no;
> #declare Draw_Ground=no;
>
>
> // create a regular point light source
> light_source
> {
>   0*x // light's position (translated below)
>   color red 1.0  green 1.0  blue 1.0  // light's color
>   translate <-20, 40, -20>
> }
>
> camera {
>   location  Camera_Location
>   look_at   Camera_Target
>   angle     Camera_Angle
> }
>
>
> //#include "robot-testrig.inc"
>
> #debug "\n\nEnd\n\n"


Post a reply to this message

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