POV-Ray : Newsgroups : povray.general : Help needed with texture mapping Server Time
13 Aug 2024 23:21:28 EDT (-0400)
  Help needed with texture mapping (Message 11 to 13 of 13)  
<<< Previous 10 Messages Goto Initial 10 Messages
From: Dan Connelly
Subject: Re: Help needed with texture mapping
Date: 10 Jul 1998 19:24:47
Message: <35A694A4.3443F0D4@flash.net>
Ron Parker wrote:
> 
> On Fri, 10 Jul 1998 07:16:33 -0500, Dan Connelly <djc### [at] flashnet> wrote:
> >Peter Popov wrote:
> >>
> >> Hi!
> >>
> >> Can anyone help me to solve the following problem: I know the coordinates of
> >> a cylinder and I want to map a radial y pigment on it. I want to define the
> >> texture at the origin and then translate it. Or define a unit cylinder and
> >> somehow fit it into the coordinates I have.
> 
> >* define the texture, then scale it and/or translate it to match
> >  the object location.
> >
> >   example (not debugged) :
> >
> >   cylinder {
> >     V,              // V:  a vector
> >     V2,             // V2: a vector
> >     R               // R : a scalar
> >     texture {
> >       CylinderTexture
> >
> >       // the following transformations apply to the texture
> >       // only :
> >       #declare H = vlength(V2 - V);
> 
>         #declare DX = V2.x-V.x;
>         #declare DY = V2.y-V.y;
>         #declare DZ = V2.z-V.z;
> 
>         #declare RX = atan2( DZ, DY );
>         #declare RZ = atan2( DX, DY );
> 
> >       scale <R, H, R>
> 
>         rotate RX * x
>         rotate RZ * z
> 
> >       translate V
> >     }
> >   }
> 
> I haven't tested this, and I'm not sure it's quite right.  In particular,
> the terms inside the atan2 might be different than I have here.  For example,
> where I have DY, you might really need -DY.  If it doesn't work, try
> different combinations of signs.  I'm also assuming that the axis of your
> texture lies along the +Y axis.


The solution key is to realize you need to set one coordinate in the
first rotation, leaving two to the other leg of the triangle, then
set one of the remaining, leaving the third to the other leg of the
second triangle.

One of 3 possibilities (for x->y->z ordering) (not debugged) :

#declare RX = degrees ( atan2 ( DZ, vlength( <DX, DY, 0> ) ) );
#declare RY = degrees ( atan2 ( DX, DY ) );

rotate <RX, RY, 0>

Dan

-- 
http://www.flash.net/~djconnel/


Post a reply to this message

From: Dan Connelly
Subject: Re: Help needed with texture mapping
Date: 10 Jul 1998 19:51:47
Message: <35A69AF8.423D4CA5@flash.net>
> #declare RX = degrees ( atan2 ( DZ, vlength( <DX, DY, 0> ) ) );
> #declare RY = degrees ( atan2 ( DX, DY ) );
> 
> rotate <RX, RY, 0>


Correction (sorry...) :

#declare RY = degrees ( atan2 ( DX, DZ) );


Post a reply to this message

From: Chris Colefax
Subject: Re: Help needed with texture mapping
Date: 11 Jul 1998 11:26:57
Message: <35A6F611.15DF383B@geocities.com>
Peter Popov wrote:
> 
> Can anyone help me to solve the following problem: I know the coordinates of
> a cylinder and I want to map a radial y pigment on it. I want to define the
> texture at the origin and then translate it. Or define a unit cylinder and
> somehow fit it into the coordinates I have.

Perhaps something like the below file will fit your needs; the syntax
(after including the file) is as follows (note that standard brackets
() are used, not {} braces):

   Textured_Cylinder (<Base Point>, <Cap Point>, Radius, texture {...})

or:

   Textured_Disc (<Centre>, <Normal>, Radius, texture {...})

where the texture {...} is aligned as desired along the +y axis.  Other
shapes can be textured using the Fit_Texture_to_Cylinder macro, eg:

   cone {<-5, -4, -2>, 2, <5, 4, 1>, 1 open
      Fit_Texture_to_Cylinder (MyTexture, <-5, -4, -2>, <5, 4, 1>, 2)}

One thing to note - I've had to write out the second atan2 () function 
in the first macro in full (it looks as though the fix I sent the
POV-Team got somewhat lost in the translation!), to avoid the irritating
Domain Error crash.


// -- CylTex.inc -----------------------------

#macro Fit_Texture_to_Cylinder (cyltexture, point1, point2, cylradius)
   #local _CT_axis = (point2 - point1) * <1, 1, 1>;
   #if (vlength(_CT_axis) = 0) texture {cyltexture} #else
   #local _CT_rotx = degrees(atan2(vlength(_CT_axis * <1, 0, 1>), _CT_axis.y));
   #if (_CT_axis.x = 0) #if (_CT_axis.z >= 0) #local _CT_roty = 0; #else #local
_CT_roty = 180; #end
      #else #if (_CT_axis.z = 0) #if (_CT_axis.x > 0) #local _CT_roty = 90; #else
#local _CT_roty = -90; #end
         #else #local _CT_roty = degrees(atan2(_CT_axis.x, _CT_axis.z)); #end #end

   texture {cyltexture
      scale <cylradius, vlength(_CT_axis), cylradius>
      rotate <_CT_rotx, _CT_roty, 0>
      translate point1}
   #end
#end

#macro Textured_Cylinder (point1, point2, cylradius, cyltexture)
   cylinder {point1, point2, cylradius
      Fit_Texture_to_Cylinder (cyltexture, point1, point2, cylradius)}
#end

#macro Textured_Disc (disccentre, discnormal, discradius, disctexture)
   disc {disccentre, discnormal, discradius
      Fit_Texture_to_Cylinder (disctexture, disccentre, disccentre + discnormal,
discradius)}
#end

// -- End File -----------------------------


Post a reply to this message

<<< Previous 10 Messages Goto Initial 10 Messages

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