|
|
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
|
|
|
|
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
|
|