Newsgroup: it.comp.lang.c
Titolo: [long][OpenGL] Help --- cubetto rotante !

Sto scrivendo un programmino stupidissimo con OpenGL:
un cubo che si sposta e ruota su sč stesso illuminato da una luce.
il problema č che la luce sembra muoversi assieme al cubo, le ho provate
tutte (sono arrivato a modificare a caso la posizione delle funzioni= ma
non riesco a trovare la soluzione.
Sono sicuro che č una fesseria !!!
Ecco il codice:
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
GLfloat stat_rot_x = 0.0;
GLfloat stat_rot_y = 0.0;
GLfloat stat_tras_x = 0.0;
GLfloat stat_tras_z = 0.0;
GLfloat light0_pos[] = {0.0, 0.0, 1.0, 0.0};
GLfloat MaterialAmbient[]=	{ 0.3, 0.0, 0.0, 1.0 };
GLfloat MaterialDiffuse[]=	{ 0.6, 0.0, 0.0, 1.0 };
GLfloat MaterialSpecular[]=	{ 0.8, 0.6, 0.6, 1.0 };
GLfloat MaterialShininess=	32.0;
void display()
{
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode (GL_MODELVIEW);
	glLoadIdentity ();
 
	gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
				// prima terna = posizione telecamera
				// seconda terna = target telecamera
				// terza terna = pitch della telecamera
	glPushMatrix ();
		glTranslatef (stat_tras_x, 0.0, stat_tras_z);
		glRotatef (stat_rot_x, 1.0, 0.0, 0.0);
		glRotatef (stat_rot_y, 0.0, 1.0, 0.0);
		glMaterialfv (GL_FRONT, GL_DIFFUSE, MaterialDiffuse);
		glMaterialfv (GL_FRONT, GL_SPECULAR, MaterialSpecular);
		glMaterialf (GL_FRONT, GL_SHININESS, MaterialShininess);
		glMaterialfv (GL_FRONT, GL_AMBIENT, MaterialAmbient);
		glColorMaterial (GL_FRONT, GL_DIFFUSE);
		glEnable (GL_COLOR_MATERIAL);
		glBegin(GL_QUADS);
			glColor3f (1.0, 0.0, 0.0);
			glVertex3f (-1.000, 1.000, 1.000);
			glVertex3f (1.000, 1.000, 1.000);
			glVertex3f (1.000, -1.000, 1.000);
			glVertex3f (-1.000, -1.000, 1.000);
			glColor3f (0.0, 1.0, 0.0);
			glVertex3f (-1.000, -1.000, 1.000);
			glVertex3f (1.000, -1.000, 1.000);
			glVertex3f (1.000, -1.000, -1.000);
			glVertex3f (-1.000, -1.000, -1.000);
			glColor3f (0.0, 0.0, 1.0);
			glVertex3f (-1.000, -1.000, -1.000);
			glVertex3f (1.000, -1.000, -1.000);
			glVertex3f (1.000, 1.000, -1.000);
			glVertex3f (-1.000, 1.000, -1.000);
			glColor3f (1.0, 1.0, 0.0);
			glVertex3f (-1.000, 1.000, -1.000);
			glVertex3f (1.000, 1.000, -1.000);
			glVertex3f (1.000, 1.000, 1.000);
			glVertex3f (-1.000, 1.000, 1.000);
			glColor3f (0.0, 1.0, 1.0);
			glVertex3f (1.000, 1.000, 1.000);
			glVertex3f (1.000, 1.000, -1.000);
			glVertex3f (1.000, -1.000, -1.000);
			glVertex3f (1.000, -1.000, 1.000);
			glColor3f (1.0, 0.0, 1.0);
			glVertex3f (-1.000, 1.000, 1.000);
			glVertex3f (-1.000, -1.000, 1.000);
			glVertex3f (-1.000, -1.000, -1.000);
			glVertex3f (-1.000, 1.000, -1.000);
		glEnd();
	glPopMatrix ();
	glutSwapBuffers ();
}
void reshape (int w, int h)
{
	glViewport (0, 0, w, h);
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
	gluPerspective(60.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);
	glMatrixMode (GL_MODELVIEW);
	glLoadIdentity();
}
void init ()
{
	glShadeModel (GL_FLAT);
	glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glClearDepth (1.0);
	glDepthFunc (GL_LEQUAL);
	glEnable (GL_DEPTH_TEST);
	// settaggi luci
	glEnable (GL_LIGHTING);
	glEnable (GL_LIGHT0);
	glMatrixMode (GL_MODELVIEW);
	glLoadIdentity();
	glLightfv (GL_LIGHT0, GL_POSITION, light0_pos);
}
void arrow_keys ( int a_keys, int x, int y )  // Create Special Function
(required for arrow keys)
{
     switch ( a_keys ) {
       	case GLUT_KEY_UP:		// Tasto "FRECCIA SU" ...
		stat_rot_x += 2.0;								// ... aumenta rotazione attorno asse X
		break;
       	case GLUT_KEY_DOWN:		// Tasto "FRECCIA GIU" ...
		stat_rot_x -= 2.0;								// ... diminuisci rotazione attorno asse X
		break;
       	case GLUT_KEY_LEFT:		// Tasto "FRECCIA DESTRA" ...
		stat_rot_y -= 2.0;								// ... aumenta rotazione attorno asse Y
		break;
	case GLUT_KEY_RIGHT:	// Tasto "FRECCIA SINISTRA" ...
		stat_rot_y += 2.0;								// ... diminuisci rotazione attorno asse Y
		break;
	default:
         break;
	}
}
void keyboard ( unsigned char key, int x, int y )
{
     switch ( key ) {
       	case 27:	// Tasto "ESC"...
		exit ( 0 );						
		// ... esci dal programma
		break;
	case 'a':	// Tasto "a"...
		stat_tras_x -= 0.5;							// ... sposta l'astronave a sinistra
		break;
	case 'd':	// Tasto "d"...
		stat_tras_x += 0.5;							// ... sposta l'astronave a destra
		break;								
	case 'w':	// Tasto "w"...
		stat_tras_z -= 0.5;							// ... allontana l'astronave dallo schermo
		break;								
	case 's':	// Tasto "s"...
		stat_tras_z += 0.5;							// ... avvicina l'astronave allo schermo
		break;									
       default:
         break;
     }
}
int main (int argc, char** argv)
{
	glutInit (&argc, argv);
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize (800, 600);
	glutInitWindowPosition (50, 50);
	glutCreateWindow ("cubetto");
	glutReshapeFunc (reshape);
	glutDisplayFunc (display);
	init ();
	glutKeyboardFunc (keyboard);					// Gestione tastiera
	glutSpecialFunc (arrow_keys);					// Gestione tasti cursore
	glutIdleFunc (display);
	glutMainLoop ();
	return 1;
}
Confido nel vostro aiuto !
OzzO
-- 
    ####### #######
#       #       #
# ##### # ##### #
#    #  #    #  #
#   #   #   #   #
#  #    #  #    #
# ##### # ##### #
#       #       #
    ####### #######

 Sono sicuro che è una fesseria !!!
Sei OT, comunque ottieni quello che vuoi mettendo la glLight dopo la 
glRotate. Ma non ho ben capito questo funzionamento...