POV-Ray : Newsgroups : povray.advanced-users : Re: Align objects ton spline ? : Re: Align objects ton spline ? Server Time
28 Jul 2024 20:19:34 EDT (-0400)
  Re: Align objects ton spline ?  
From: Mike Williams
Date: 28 Jan 2004 14:33:38
Message: <WOZt$LA84AGAFwIE@econym.demon.co.uk>
Wasn't it LightBeam who wrote:
>Hello, here is my problem:
>I started with a spline to create a kind of link but I have no idea how 
>to make the cylinders follow 'nicely' the curve.. What is the solution 
>to make them aligned and rotated to fit the spline/curve ? (Joined the 
>source) Please help me...

I'd do it by using Reorient_Trans to rotate the cylinders. The cylinders
are currently pointing in the z direction and we want them aligned along
the spline, so we reorient them like this

#include "transforms.inc"

  cylinder {<0.0, 0.0, -0.02><0.0, 0.0, 0.02>0.07
  transform {Reorient_Trans(z,Direction)}

An alternative method would be to create the cylinder already oriented
in the required direction. This works with simple shapes like cylinders
but with a complex shape use Reorient_Trans.

  cylinder {-0.02*vnormalize(Direction),0.02*vnormalize(Direction),0.07



But we need to find the direction of the spline. This can normally be
achieved by taking the difference two locations from the spline, like
this:

  #declare Direction = (Spline(ctr+0.001) -Spline(ctr-0.001));



Unfortunately, this gives a problem if you try to use it on a point
that's off the end of the spline, because it returns the zero direction
and you can't use that in Reorient_Trans. This can either be solved by
treating points that are off the end of the spline as a special case

  #declare Direction = (Spline(ctr+0.001) -Spline(ctr-0.001));
  #if (vlength(Direction) = 0)
    #declare Direction = x;
  #end

or by confining yourself to only using points that are on the spline,
noting this paragraph in the documentation "Note: Because of the way
cubic_splines are defined: the first and last points are tangents rather
than points on the spline, cubic_spline interpolation is only valid
between the second and next-to-last points."

  #declare ctr = 0.1;
  #declare Spacing = 0.01;
  #while (ctr < 0.4)



Here's the whole thing put together using only the valid region of the
cubic_spline


camera {location <0.0, 2.0, -2.0> look_at 0.0}

light_source {<100.0, 300.0, -50.0>1.0}

plane {y, -0.5 pigment {rgb 0.7}}

#declare Spline =
   spline {
     cubic_spline
     0.00, <1,0,0>
     0.10, <0,0,1>
     0.20, <-1,0,0>
     0.30, <0,0,-1>
     0.40, <0,0,0>
     0.50, <1,0,0>
   }

#declare ctr = 0.003;
#declare Spacing = 0.001;
#while (ctr < 0.7)
         sphere {0.0, 0.03
         translate Spline(ctr)
         pigment {rgb 0.3}
         }
   #declare ctr = ctr + Spacing;
#end

#declare ctr = 0.1;
#declare Spacing = 0.01;
#while (ctr < 0.4)
   #declare Direction = (Spline(ctr+0.001) -Spline(ctr-0.001));
   cylinder {-0.02*vnormalize(Direction),0.02*vnormalize(Direction),0.07
      translate Spline(ctr)
      pigment {rgb 0.3}
   }
   #declare ctr = ctr + Spacing;
#end


-- 
Mike Williams
Gentleman of Leisure


Post a reply to this message

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