PDA

View Full Version : How do i increase the radius once per second



TheLearner
02-09-2012, 12:37 PM
Hi,

I started learning OpenGL not too long ago from this website:
Swiftless (http://www.swiftless.com/opengltuts.html)
I got only to point 5: OpenGL Color.

What I want to do is:
• Draw a sphere: done
• Increase its radius once a second: NOT done
I don’t want to use the keyboard to increase the radius. I already know how to do that.

Here is what my code looks like:

#include "TimeUtils.hpp"

//More code

int main(int argc, char *argv[])
{
//More code
/*
Increment Sphere radius once a second
*/
long time01, time02;
time01 = time_now();// Returns the time now

long timeDifference = 0;
long lastDifference = 0;
long count = 0;

while(1)
{
time02 = time_now(); // Returns the time now
count = (time02-time01)/1000; // Number of seconds since “time01”
timeDifference = count;

if(timeDifference != lastDifference)
{
lastDifference = timeDifference;
Sphere::itsRadius = Sphere::itsRadius + 0.002; //Does not work: Supposed to increase radius once per second
}

glutReshapeFunc(resize);
glutDisplayFunc(display);
glutIdleFunc(idle);

//More code

glutMainLoop();

if( ((time02-time01)/1000) >= MAX) break;// Stop after MAX seconds
}//End while loop

return EXIT_SUCCESS;

}//End main()

//More code

static void display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,0,0);

glPushMatrix();
glTranslated(0,0,-6);
glutSolidSphere(Sphere::itsRadius,Sphere::itsSlice s,Sphere::itsStacks);
glPopMatrix();

glutSwapBuffers();
}

//More code


The time trick I used above work on its own but, not when I draw my sphere.

Thank you for your help.

Regards,

Herve

carsten neumann
02-09-2012, 01:10 PM
Please use [ code]/[ /code] (no space after '[') around source snippets to make them easier to read.



while(1)
{
time02 = time_now(); // Returns the time now
count = (time02-time01)/1000; // Number of seconds since “time01”
timeDifference = count;

if(timeDifference != lastDifference)
{
lastDifference = timeDifference;
Sphere::itsRadius = Sphere::itsRadius + 0.002; //Does not work: Supposed to increase radius once per second
}

glutReshapeFunc(resize);
glutDisplayFunc(display);
glutIdleFunc(idle);

//More code

glutMainLoop();

if( ((time02-time01)/1000) >= MAX) break;// Stop after MAX seconds
}//End while loop


Never call glutMainLoop() in a loop. This function implements internally an application event loop and only ever returns when your program exits (in some GLUT implementations glutMainLoop() actually never returns so any code after it up to the end of main() is never executed).

To increase the radius once a second: in idle() examine the time elapsed since the last radius increase (or program start for the first one). If a second or more has elapsed, change the radius and call glutPostRedisplay().