someoney

02-09-2010, 02:50 PM

I'm requesting a bit of help since I cannot find what exactly is wrong with this bit of code. It seems to render the sphere in exactly one color.

/**

* \brief calcTexCoord2 The final step in calculating texture coordinates.

*

* \param texture The texture to use

* \param axis The value of the axis to use.

* \param s_coord The value to plug in for the s equation.

* \param t_coord The value to plug in for the t equation.

* \return Nothing.

*/

void calcTexCoord2(int texture, GLdouble axis, GLdouble s_coord, GLdouble t_coord) {

//cout << "axis: " << axis << " ";

GLdouble s, t; //texture coordinates

s = (s_coord + axis) / (2 * axis);

t = (t_coord + axis) / (2 * axis);

//cout << "axis: " << axis << " s_coord: " << s_coord << " t_coord: " << t_coord << " s: " << s << " t: " << t << endl;

//cout.flush();

glBindTexture(GL_TEXTURE_2D, texture_name[texture]);

glTexCoord2f(s, t);

}

/**

* \brief calcTexCoord Inputs the texture coordinate at that point.

*

* \param vertex The vertex to calculate the texture coordinate for.

* Also, the assumption is that the vertex can be treated as the

* normal, since the sphere is of radius = 1 and centered at origin.

* \param viewer The view vector.

* \return Nothing.

*/

void calcTexCoord(GLdouble vertex[3], GLdouble *viewer) {

//cout << "normal: " << vertex[0] << ", " << vertex[1] << ", " << vertex[2] << " viewer: " << viewer[0] << ", " << viewer[1] << ", " << viewer[2];

//cout << " final: " << dist << endl;

//cout.flush();

//calc reflection vector via 2 * (n dot v) n - v

//start w/ n dot v

GLdouble dot_product = 0;

for (int i = 0; i < 3; i++)

dot_product += vertex[i]*viewer[i];

//2 * (n dot v)

dot_product *= 2;

//2 * (n dot v) n - v

GLdouble reflect[3];

for (int i = 0; i < 3; i++)

reflect[i] = (dot_product * vertex[i]) - viewer[i];

//find the texture to use

int index = 0;

for (int i = 1; i < 3; i++)

if (fabs(reflect[index]) < fabs(reflect[i]))

index = i;

switch (index) {

case 0:

if (reflect[index] > 0) //+x

calcTexCoord2(2, reflect[0], reflect[2], reflect[1]);

else

calcTexCoord2(3, reflect[0], reflect[2], reflect[1]);

break;

case 1:

if (reflect[index] > 0)

calcTexCoord2(0, reflect[1], reflect[0], reflect[2]);

else

calcTexCoord2(1, reflect[1], reflect[0], reflect[2]);

break;

case 2:

if (reflect[index] > 0)

calcTexCoord2(4, reflect[2], reflect[1], reflect[0]);

else

calcTexCoord2(5, reflect[2], reflect[1], reflect[0]);

}

}

/**

* \brief drawReflectivePole Draws the poles of the sphere using triangles.

* Borrowing the code from the book. This one is used

* for the reflective sphere.

* \param pole The pole that we are drawing.

* \param viewer The viewer vector

* \return Nothing.

*/

void drawReflectivePole(GLdouble **pole, GLdouble *viewer) {

glBegin(GL_TRIANGLE_FAN);

for (int i = 0; i < sphere_tri_strip_size; i++) {

calcTexCoord(pole[i], viewer);

glVertex3d(pole[i][0], pole[i][1], pole[i][2]);

}

glEnd();

}

/**

* \brief drawReflectiveSphere Draws a sphere (with reflection).

*

* \param viewer_x The viewer's x coordinate.

* \param viewer_y The viewer's y coordinate.

* \param viewer_z The viewer's z coordinate.

* \return Nothing.

*/

void drawReflectiveSphere(GLdouble viewer_x, GLdouble viewer_y, GLdouble viewer_z) {

if (sphere_quad_strip == NULL)

makeSphere();

//calc viewer vector

GLdouble distance = sqrt(viewer_x*viewer_x + viewer_y*viewer_y + viewer_z*viewer_z);

GLdouble viewer[] = { viewer_x / distance, viewer_y / distance, viewer_z / distance};

glBegin(GL_QUAD_STRIP);

for (int i = 0; i < sphere_quad_strip_size; i++) {

glNormal3dv(sphere_quad_strip[i]);

calcTexCoord(sphere_quad_strip[i], viewer);

glVertex3dv(sphere_quad_strip[i]);

}

glEnd();

drawReflectivePole(sphere_top_tri_strip, viewer);

drawReflectivePole(sphere_bottom_tri_strip, viewer);

}

Basically, I'm rendering a sphere, texturing it with a cube map. Since the distance from the origin of all the vertexes are exactly 1, I treat the vertexes the same as the normal.

I'm certain there is a bunch of error in my assignment of the coordinates to calcTexCoord2, but I still cannot see why the sphere is rendered in exactly one color.

Thank you for any help you may provide.

/**

* \brief calcTexCoord2 The final step in calculating texture coordinates.

*

* \param texture The texture to use

* \param axis The value of the axis to use.

* \param s_coord The value to plug in for the s equation.

* \param t_coord The value to plug in for the t equation.

* \return Nothing.

*/

void calcTexCoord2(int texture, GLdouble axis, GLdouble s_coord, GLdouble t_coord) {

//cout << "axis: " << axis << " ";

GLdouble s, t; //texture coordinates

s = (s_coord + axis) / (2 * axis);

t = (t_coord + axis) / (2 * axis);

//cout << "axis: " << axis << " s_coord: " << s_coord << " t_coord: " << t_coord << " s: " << s << " t: " << t << endl;

//cout.flush();

glBindTexture(GL_TEXTURE_2D, texture_name[texture]);

glTexCoord2f(s, t);

}

/**

* \brief calcTexCoord Inputs the texture coordinate at that point.

*

* \param vertex The vertex to calculate the texture coordinate for.

* Also, the assumption is that the vertex can be treated as the

* normal, since the sphere is of radius = 1 and centered at origin.

* \param viewer The view vector.

* \return Nothing.

*/

void calcTexCoord(GLdouble vertex[3], GLdouble *viewer) {

//cout << "normal: " << vertex[0] << ", " << vertex[1] << ", " << vertex[2] << " viewer: " << viewer[0] << ", " << viewer[1] << ", " << viewer[2];

//cout << " final: " << dist << endl;

//cout.flush();

//calc reflection vector via 2 * (n dot v) n - v

//start w/ n dot v

GLdouble dot_product = 0;

for (int i = 0; i < 3; i++)

dot_product += vertex[i]*viewer[i];

//2 * (n dot v)

dot_product *= 2;

//2 * (n dot v) n - v

GLdouble reflect[3];

for (int i = 0; i < 3; i++)

reflect[i] = (dot_product * vertex[i]) - viewer[i];

//find the texture to use

int index = 0;

for (int i = 1; i < 3; i++)

if (fabs(reflect[index]) < fabs(reflect[i]))

index = i;

switch (index) {

case 0:

if (reflect[index] > 0) //+x

calcTexCoord2(2, reflect[0], reflect[2], reflect[1]);

else

calcTexCoord2(3, reflect[0], reflect[2], reflect[1]);

break;

case 1:

if (reflect[index] > 0)

calcTexCoord2(0, reflect[1], reflect[0], reflect[2]);

else

calcTexCoord2(1, reflect[1], reflect[0], reflect[2]);

break;

case 2:

if (reflect[index] > 0)

calcTexCoord2(4, reflect[2], reflect[1], reflect[0]);

else

calcTexCoord2(5, reflect[2], reflect[1], reflect[0]);

}

}

/**

* \brief drawReflectivePole Draws the poles of the sphere using triangles.

* Borrowing the code from the book. This one is used

* for the reflective sphere.

* \param pole The pole that we are drawing.

* \param viewer The viewer vector

* \return Nothing.

*/

void drawReflectivePole(GLdouble **pole, GLdouble *viewer) {

glBegin(GL_TRIANGLE_FAN);

for (int i = 0; i < sphere_tri_strip_size; i++) {

calcTexCoord(pole[i], viewer);

glVertex3d(pole[i][0], pole[i][1], pole[i][2]);

}

glEnd();

}

/**

* \brief drawReflectiveSphere Draws a sphere (with reflection).

*

* \param viewer_x The viewer's x coordinate.

* \param viewer_y The viewer's y coordinate.

* \param viewer_z The viewer's z coordinate.

* \return Nothing.

*/

void drawReflectiveSphere(GLdouble viewer_x, GLdouble viewer_y, GLdouble viewer_z) {

if (sphere_quad_strip == NULL)

makeSphere();

//calc viewer vector

GLdouble distance = sqrt(viewer_x*viewer_x + viewer_y*viewer_y + viewer_z*viewer_z);

GLdouble viewer[] = { viewer_x / distance, viewer_y / distance, viewer_z / distance};

glBegin(GL_QUAD_STRIP);

for (int i = 0; i < sphere_quad_strip_size; i++) {

glNormal3dv(sphere_quad_strip[i]);

calcTexCoord(sphere_quad_strip[i], viewer);

glVertex3dv(sphere_quad_strip[i]);

}

glEnd();

drawReflectivePole(sphere_top_tri_strip, viewer);

drawReflectivePole(sphere_bottom_tri_strip, viewer);

}

Basically, I'm rendering a sphere, texturing it with a cube map. Since the distance from the origin of all the vertexes are exactly 1, I treat the vertexes the same as the normal.

I'm certain there is a bunch of error in my assignment of the coordinates to calcTexCoord2, but I still cannot see why the sphere is rendered in exactly one color.

Thank you for any help you may provide.