PDA

View Full Version : modification of the moving light



veena
05-05-2010, 07:56 AM
this is an eg for moving light.how do u make the torous rotate and keep the cube fixed.code plz.to be implemented using visual studio 6.0
#include <GL/glut.h>
#include <stdlib.h>

static int spin = 0,n=60;
int x=0,y=0,z=0;
/* Initialize material property, light source, lighting model,
* and depth buffer.
*/


void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
//glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}

/* Here is where the light position is reset after the modeling
* transformation (glRotated) is called. This places the
* light at a new position in world coordinates. The cube
* represents the position of the light.
*/


void display(void)
{

GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
GLfloat mat_diffuse[]={.0,1.7,.0,1.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f (0.0, 1.0, 1.0);
glPushMatrix ();
glRotated ((GLdouble) spin, x,y,z);
glLightfv (GL_LIGHT0, GL_POSITION, position);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (1.0, .0, 0.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glPopMatrix ();

glutSolidTorus (0.275, 0.85, 8, 15);

glPopMatrix ();
glFlush ();
}
void display1(void)
{

GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
GLfloat mat_diffuse[]={1.0,0.0,.0,1.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f (0.0, 1.0, 1.0);
glPushMatrix ();
glRotated ((GLdouble) spin, x,y,z);
glLightfv (GL_LIGHT0, GL_POSITION, position);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (1.0, .0, 0.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glPopMatrix ();

glutSolidTorus (0.275, 0.85, 8, 15);

glPopMatrix ();
glFlush ();
}
void display2(void)
{

GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
GLfloat mat_diffuse[]={.0,1.7,.0,1.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f (0.0, 1.0, 1.0);
glPushMatrix ();
glRotated ((GLdouble) spin, x,y,z);
glLightfv (GL_LIGHT0, GL_POSITION, position);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (1.0, .0, 0.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glPopMatrix ();

glutSolidTorus (0.275, 1.85, 8, 15);

glPopMatrix ();
glFlush ();
}


void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void mytimer(int v)
{
spin = (spin +5) % 360;
glutTimerFunc(1600/n,mytimer,v);
glutPostRedisplay();
}



void menu(int id)
{
switch(id)
{
case 0:x=1,y=0,z=0;
break;
case 1:x=0,y=1,z=0;
break;
case 2:x=0,y=0,z=1;
break;
case 3:x=0,y=0,z=0;
case 4:glShadeModel (GL_SMOOTH);
break;
case 5:glShadeModel (GL_FLAT);
break;
case 6:exit(0);
break;
case 7:glutDisplayFunc(display1);
break;
case 8:glutDisplayFunc(display);
break;
case 9:glutDisplayFunc(display2);
break;



}
}



int main(int argc, char** argv)
{
glutInit(&amp;argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutMouseFunc(mouse);
glutTimerFunc(100,mytimer,n);
glutCreateMenu(menu);
glutAddMenuEntry("along x axis",0);
glutAddMenuEntry("along y axis",1);
glutAddMenuEntry("along z axis",2);
glutAddMenuEntry("default",3);
glutAddMenuEntry("smooth shade model",4);
glutAddMenuEntry("flat shade model",5);
glutAddMenuEntry("quit",6);
glutAddMenuEntry("red",7);
glutAddMenuEntry("green",8);
glutAddMenuEntry("size change",9);

glutAttachMenu(GLUT_RIGHT_BUTTON);
glutMainLoop();
return 0;
}

Yomboprime
05-05-2010, 10:33 PM
Sandwitch the glutSolidTorus call in push and pop and place the glRotate before drawing the torus


glPushMatrix ();

glRotated ( rotation you want for the torus );

(optional: glTranslate(...) to move the torus)

glutSolidTorus (0.275, 0.85, 8, 15);

glPopMatrix ();

veena
05-06-2010, 03:51 AM
hey i am a complete dud in opengl.ul have to gime the code.plz
is this where u have to add the code u gave(in red).
void display(void)
{

GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
GLfloat mat_diffuse[]={.0,1.7,.0,1.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f (0.0, 1.0, 1.0);
glPushMatrix ();
glRotated ((GLdouble) spin, x,y,z);
glLightfv (GL_LIGHT0, GL_POSITION, position);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (1.0, .0, 0.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glPopMatrix ();
[/color]
pushmatrix()
rotate()
translate()
glutSolidTorus (0.275, 0.85, 8, 15);
pop()[color:#333333]
glPopMatrix ();
glFlush ();
}

veena
05-06-2010, 03:52 AM
immediately after pop push matrix agn???
plz write the display func

Yomboprime
05-06-2010, 07:57 AM
Yes, it is correct. You can also delete the first push and the last pop, they are not necesary (i've marked it with <-- this isn't necessary) But remove both.

Here is the code (just the same as you wrote):


void display(void)
{

GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
GLfloat mat_diffuse[]={.0,1.7,.0,1.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix (); <-- this isn't necessary

gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f (0.0, 1.0, 1.0);
glPushMatrix ();
glRotated ((GLdouble) spin, x,y,z);
glLightfv (GL_LIGHT0, GL_POSITION, position);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (1.0, .0, 0.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glPopMatrix ();

pushmatrix()
rotate()
translate()
glutSolidTorus (0.275, 0.85, 8, 15);
pop()

glPopMatrix (); <-- this isn't necessary

glFlush ();
}

veena
05-06-2010, 10:56 AM
thanks a lot ill try it out and let u know