/*****************************************************************************
*
* FUNCTION
*
* INPUT
*
* OUTPUT
*
* RETURNS
*
* AUTHOR
*
* DESCRIPTION
*
* Map a point (x, y, z) on a cylinder of radius 1, height 1, that has its axis
* of symmetry along the y-axis to the square [0,1]x[0,1].
*
* CHANGES
*
******************************************************************************/
static int cylindrical_image_map(VECTOR EPoint, IMAGE *Image, DBL *u, DBL *v)
{
DBL len, theta;
DBL x = EPoint[X];
DBL y = EPoint[Y];
DBL z = EPoint[Z];
if ((Image->Once_Flag) && ((y < 0.0) || (y > 1.0)))
{
return 0;
}
*v = fmod(y * Image->height, Image->height);
/* Make sure this vector is on the unit sphere. */
len = sqrt(x * x + y * y + z * z);
if (len == 0.0)
{
return 0;
}
else
{
x /= len;
z /= len;
}
/* Determine its angle from the point (1, 0, 0) in the x-z plane. */
len = sqrt(x * x + z * z);
if (len == 0.0)
{
return 0;
}
else
{
if (z == 0.0)
{
if (x > 0)
{
theta = 0.0;
}
else
{
theta = M_PI;
}
}
else
{
theta = acos(x / len);
if (z < 0.0)
{
theta = TWO_M_PI - theta;
}
}
theta /= TWO_M_PI; /* This will be from 0 to 1 */
}
*u = (theta * Image->width);
return 1;
}
/*****************************************************************************
*
* FUNCTION
*
* INPUT
*
* OUTPUT
*
* RETURNS
*
* AUTHOR
*
* DESCRIPTION
*
* Map a point (x, y, z) on a torus to a 2-d image.
*
* CHANGES
*
******************************************************************************/
static int torus_image_map(VECTOR EPoint, IMAGE *Image, DBL *u, DBL *v)
{
DBL len, phi, theta;
DBL r0;
DBL x = EPoint[X];
DBL y = EPoint[Y];
DBL z = EPoint[Z];
r0 = Image->Gradient[X];
/* Determine its angle from the x-axis. */
len = sqrt(x * x + z * z);
if (len == 0.0)
{
return 0;
}
else
{
if (z == 0.0)
{
if (x > 0)
{
theta = 0.0;
}
else
{
theta = M_PI;
}
}
else
{
theta = acos(x / len);
if (z < 0.0)
{
theta = TWO_M_PI - theta;
}
}
}
theta = 0.0 - theta;
/* Now rotate about the y-axis to get the point (x, y, z) into the x-y plane. */
x = len - r0;
len = sqrt(x * x + y * y);
phi = acos(-x / len);
if (y > 0.0)
{
phi = TWO_M_PI - phi;
}
/* Determine the parametric coordinates. */
theta /= TWO_M_PI;
phi /= TWO_M_PI;
*u = (-theta * Image->width);
*v = (phi * Image->height);
return 1;
}
/*****************************************************************************
*
* FUNCTION
*
* INPUT
*
* OUTPUT
*
* RETURNS
*
* AUTHOR
*
* DESCRIPTION
*
* Map a point (x, y, z) on a sphere of radius 1 to a 2-d image. (Or is it the
* other way around?)
*
* CHANGES
*
******************************************************************************/
static int spherical_image_map(VECTOR EPoint, IMAGE *Image, DBL *u, DBL *v)
{
DBL len, phi, theta;
DBL x = EPoint[X];
DBL y = EPoint[Y];
DBL z = EPoint[Z];
/* Make sure this vector is on the unit sphere. */
len = sqrt(x * x + y * y + z * z);
if (len == 0.0)
{
return 0;
}
else
{
x /= len;
y /= len;
z /= len;
}
/* Determine its angle from the x-z plane. */
phi = 0.5 + asin(y) / M_PI; /* This will be from 0 to 1 */
/* Determine its angle from the point (1, 0, 0) in the x-z plane. */
len = sqrt(x * x + z * z);
if (len == 0.0)
{
/* This point is at one of the poles. Any value of xcoord will be ok... */
theta = 0;
}
else
{
if (z == 0.0)
{
if (x > 0)
{
theta = 0.0;
}
else
{
theta = M_PI;
}
}
else
{
theta = acos(x / len);
if (z < 0.0)
{
theta = TWO_M_PI - theta;
}
}
theta /= TWO_M_PI; /* This will be from 0 to 1 */
}
*u = (theta * Image->width);
*v = (phi * Image->height);
return 1;
}
/*
* 2-D to 3-D Procedural Texture Mapping of a Bitmapped Image onto an Object:
*
* Simplistic planar method of object image projection devised by DKB and AAC.
*
* 1. Transform texture in 3-D space if requested. 2. Determine local object 2-d
* coords from 3-d coords by <X Y Z> triple. 3. Return pixel color value at
* that position on the 2-d plane of "Image". 3. Map colour value in Image
* [0..255] to a more normal colour range [0..1].
*/
/*****************************************************************************
*
* FUNCTION
*
* INPUT
*
* OUTPUT
*
* RETURNS
*
* AUTHOR
*
* DESCRIPTION
*
* Return 0 if there is no color at this point (i.e. invisible), return 1 if a
* good mapping is found.
*
* CHANGES
*
******************************************************************************/
static int planar_image_map(VECTOR EPoint, IMAGE *Image, DBL *u, DBL *v)
{
DBL x = EPoint[X];
DBL y = EPoint[Y];
DBL z = EPoint[Z];
if (Image->Gradient[X] != 0.0)
{
if ((Image->Once_Flag) && ((x < 0.0) || (x > 1.0)))
{
return 0;
}
if (Image->Gradient[X] > 0)
{
*u = fmod(x * Image->width, Image->width);
}
else
{
*v = fmod(x * Image->height, Image->height);
}
}
if (Image->Gradient[Y] != 0.0)
{
if ((Image->Once_Flag) && ((y < 0.0) || (y > 1.0)))
{
return 0;
}
if (Image->Gradient[Y] > 0)
{
*u = fmod(y * Image->width, Image->width);
}
else
{
*v = fmod(y * Image->height, Image->height);
}
}
if (Image->Gradient[Z] != 0.0)
{
if ((Image->Once_Flag) && ((z < 0.0) || (z > 1.0)))
{
return 0;
}
if (Image->Gradient[Z] > 0)
{
*u = fmod(z * Image->width, Image->width);
}
else
{
*v = fmod(z * Image->height, Image->height);
}
}
return 1;
}
PS:这几个函数是在别人的库中抽取出来的,我并没有一一试验,如果有什么问题请及时通知我!