Translatef Problem in dynamic cube env mapping scene

hi folks.
i must have an error in reasoning about the coord stuff in my scene.

this scene simply consists of a reflecting sphere that should be placed at the origin (0.0f,0.0f,0.0f) but since i wanted to move through the scene with my camera, i used xtrans, ytrans and ztrans instead, like i learned from nehe.gamedev.net

then next to the sphere should be a cube which should be reflected by the sphere. but somehow i don’t get correct reflections.

here’s my code:

 

void initCubePos(int cpos, GLfloat xtrans, GLfloat ytrans, GLfloat ztrans)
{
	switch (cpos)
	{
		case 0:
		{
			glLoadIdentity();
			glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
			glRotatef( 90.0f, 0.0f, 0.0f, 1.0f);
			glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
			glTranslatef(xtrans, ytrans, ztrans);
		}

		case 1:
		{
			glLoadIdentity();
			glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
			glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
			glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
			glTranslatef(xtrans, ytrans, ztrans);
		}

		case 2:
		{
			glLoadIdentity();
			glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
			glTranslatef(xtrans, ytrans, ztrans);
		}

		case 3:
		{
			glLoadIdentity();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f);
			glTranslatef(xtrans, ytrans, ztrans);
		}

		case 4:
		{
			glLoadIdentity();
			glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
			glTranslatef(xtrans, ytrans, ztrans);
		}

		case 5:
		{
			glLoadIdentity();
			glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
			glTranslatef(xtrans, ytrans, ztrans);
		}
	}
}

int DrawGLScene(GLvoid)
{
	GLfloat xtrans = -xpos;
	GLfloat ztrans = -zpos;
	GLfloat ytrans = -0.25f;
	GLfloat sceneroty = 360.0f - ymrot;
	GLUquadricObj* quadric = gluNewQuadric();

	glMatrixMode(GL_MODELVIEW);
	for (int i=0; i<6; i++)
	{
		// init camera
		initCubePos(i, xtrans, ytrans, ztrans);

		// render scene without sphere
		glClear(GL_COLOR_BUFFER_BIT);
		glClear(GL_DEPTH_BUFFER_BIT);
		glTranslatef(sp_pos[0], sp_pos[1], sp_pos[2]);
		DrawGLCube();

		glBindTexture(faceTarget[i], texsphere);
		glCopyTexSubImage2D(faceTarget[i], 0, 0, 0, 0, 0, 256, 256);
	}

	glLoadIdentity();

	// set up camera at viewing position
	glTranslatef(xtrans, ytrans, ztrans-10.0f);

	glClear(GL_COLOR_BUFFER_BIT);
	glClear(GL_DEPTH_BUFFER_BIT);

	// render scene with sphere
	glTranslatef(sp_pos[0], sp_pos[1], sp_pos[2]);
	DrawGLCube();

	glLoadIdentity();
	glBindTexture(GL_TEXTURE_CUBE_MAP_EXT, texsphere);

	glEnable(GL_TEXTURE_CUBE_MAP_EXT);
	glEnable(GL_TEXTURE_GEN_S);
	glEnable(GL_TEXTURE_GEN_T);
	glEnable(GL_TEXTURE_GEN_R);

	glRotatef(sceneroty, 0, 1.0f, 0);

	glPushMatrix();

	glTranslatef(xtrans, ytrans, ztrans-10.0f);

	glRotatef(xrot, 1.0f, 0.0f, 0.0f);
	glRotatef(yrot, 1.0f, 0.0f, 0.0f);

	gluSphere(quadric, 2.0f, 128, 128);

	glDisable(GL_TEXTURE_CUBE_MAP_EXT);
	glDisable(GL_TEXTURE_GEN_S);
	glDisable(GL_TEXTURE_GEN_T);
	glDisable(GL_TEXTURE_GEN_R);

	glPopMatrix();

	gluDeleteQuadric(quadric);

	xrot+=xspeed;
	yrot+=yspeed;

	return TRUE;
}

 

i know that the code after the for-while is a bit chaotic, which is because i did some experimenting and got confused about when i have to use glLoadIdentity() and glTranslatef(…).
I hope i was able to explain what i wanted to achieve.
any ideas what i have to do?

thanx

Could you post a picture or describe better what you mean by “not reflecting correctly?”

hi.

Here is a picture of the test-textures i’ve put on my sphere by default:

And this is what i get in my dynamic cube env mapping scene:

you can see that the lower (light-blue) texture on the sphere turns green for a reason that i don’t understand.
the cube’s colors also don’t seem to be correctly reflected, but that seems to be caused either by not correctly rendering to the textures, or by not putting them correctly on the sphere. I think i’m not rendering correctly to the textures. This would also explain, that the reflections of the cube doesn’t match up at the borders of each texture. You know what i mean?

ok, i made some corrections by myself. the perspectives are correct now - at least for the front texture of the sphere.

but can anybody tell me, why the cube’s colours in the reflection aren’t the same like the real cube’s colours?

new hint:
the cubemap textures aren’t able to display blue colours. that’s why the upper and the lower texture of the sphere are both green and not green and light blue. to front texture should be blue but is black.

this is caused by the colour i’ve set for the last face of the cube in my DrawGLCube() function:

 void DrawGLCube()
{
	glBegin(GL_QUADS);
		// Front Face
		glColor3f( 0.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);
		glVertex3f( 1.0f, 1.0f, 1.0f);
		glVertex3f(-1.0f, 1.0f, 1.0f);

		// Back Face
		glColor3f( 1.0f, 0.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f(-1.0f, 1.0f,-1.0f);
		glVertex3f( 1.0f, 1.0f,-1.0f);
		glVertex3f( 1.0f,-1.0f,-1.0f);

		// Top Face
		glColor3f( 0.0f, 0.0f, 1.0f);
		glVertex3f(-1.0f, 1.0f,-1.0f);
		glVertex3f(-1.0f, 1.0f, 1.0f);
		glVertex3f( 1.0f, 1.0f, 1.0f);
		glVertex3f( 1.0f, 1.0f,-1.0f);

		// Bottom Face
		glColor3f( 0.0f, 1.0f, 1.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f( 1.0f,-1.0f,-1.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);

		// Right Face
		glColor3f( 1.0f, 0.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f,-1.0f);
		glVertex3f( 1.0f, 1.0f,-1.0f);
		glVertex3f( 1.0f, 1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);

		// Left Face
		glColor3f( 1.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
		glVertex3f(-1.0f, 1.0f, 1.0f);
		glVertex3f(-1.0f, 1.0f,-1.0f);
	glEnd();
} 

i’ve tested, what happens if i set the colour of the last cube-face (the left face) into white, et voila: everything looks fine.

but that can’t be a real solution. any idea, what i might have initialised wrong or sth?

Hmm, from a quick glance I see you enable automatic texture generation but you never set up the generation function. Do you do that in some other part of your code?

Like this:

glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);
glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);

hi. yes this is done in my InitGL function, which calls updateTexGen()

:

</font><blockquote><font size=“1” face=“Verdana, Arial”>code:</font><hr /><pre style=“font-size:x-small; font-family: monospace;”>

int InitGL(GLvoid)
{
// Create font bitmaps for displaying text
text_list_base = glGenLists(255);
wglUseFontBitmaps(hDC, 0, 255, text_list_base);

sphere_angle = 0.0f;

makeCubeMap();					
updateTexgen();

glEnable(GL_TEXTURE_CUBE_MAP_EXT);
glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);				// Black Background
glClearDepth(1.0f);									// Depth Buffer Setup
glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations

return TRUE;

}

void updateTexgen(void)
{
assert(mode == GL_NORMAL_MAP_EXT

my method should look like this of course:

void updateTexgen(void)
{
	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, mode);
	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, mode);
	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, mode);
}