rotate 5 circle problem [duplicate]

2019-09-27 10:14发布

Possible Duplicate:
how to rotate this openGl code…

below is my code and it work fine.. i draw 5 ring in this.

#include <GL/glut.h>
#include <math.h>

static void redraw(void);
#define PI 3.14159265 
#define EDGES 90
#define factor 10


void display (void) 
{
    glClearColor(1.0,1.0,1.0,0.0);
     glMatrixMode (GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();   


//ring1 
glPushMatrix();
glColor3f (0.0, 0.0 ,1.0);
glTranslatef(-30.0,10.0,-100.0);
redraw();
glutSwapBuffers();
glPopMatrix();

//ring2
glPushMatrix();
glColor3f (0.0, 0.0, 0.0);
glTranslatef(-8.0,10.0,-100.0);
redraw();
glutSwapBuffers();
glPopMatrix();

//ring3
glPushMatrix();
glColor3f (1.0, 0.0 ,0.0);
glTranslatef(14.0,10.0,-100.0);
redraw();
glutSwapBuffers();
glPopMatrix();

//ring4
glPushMatrix();
glColor3f (1.0, 1.0, 0.0);
glTranslatef(-19.0,-2.0,-100.0);
redraw();
glutSwapBuffers();
glPopMatrix();

//ring5
glPushMatrix();
glColor3f (0.0, 1.0, 0.0);
glTranslatef(4.0,-2.0,-100.0);
redraw();
glutSwapBuffers();
glPopMatrix();

}

static void redraw(void)
{
for (int i = 0; i < EDGES; i++)
    { 
      glBegin(GL_LINE_LOOP); 
      glVertex2f(factor*cos((2*PI*i)/EDGES),factor*sin((2*PI*i)/EDGES)); 
      glVertex2f(factor*cos((2*PI*(i+1))/EDGES),factor*sin((2*PI*(i+1))/EDGES)); 
      glEnd();
     } 
}

int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(110*3, 110*3);
glutCreateWindow("draw circle");
glPointSize(3); 
glShadeModel (GL_FLAT); 
glutDisplayFunc(display);
glMatrixMode(GL_PROJECTION);    
gluPerspective(45,1.0,10.0,200.0);
glMatrixMode(GL_MODELVIEW);
glutMainLoop();
return 0; 
}

so i want to rotate all of this circle.. how can i do??

1条回答
Bombasti
2楼-- · 2019-09-27 10:53

You should call glutSwapBuffers only once in the drawing function.

For an animation you have to call glutPostRedisplay, to ensure that the display function will be called again.

The glBegin and glEnd calls only have to be called once per circle. In the for loop you just supply vertices with calls to glVertex.

To simplify debugging I installed a keyboard handler that closes the window when the escape key is pressed.

 // compile in linux: gcc ogl.c -lglut -lGLU

#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>

static void redraw(void);
#define PI 3.14159265 

enum{
  EDGES=90,
};

static void 
circle(float radius)
{
  int i;
  glBegin(GL_LINE_LOOP); 
  for (i = 0; i < EDGES; i++){ 
    glVertex2f(radius*cos((2*PI*i)/EDGES),
           radius*sin((2*PI*i)/EDGES)); 
    glVertex2f(radius*cos((2*PI*(i+1))/EDGES),
           radius*sin((2*PI*(i+1))/EDGES)); 
  } 
  glEnd();
}


int count=0;
void display (void) 
{
  float r=10;
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();   

  glRotated(count,0,0,1);
  count++;
  if(count>360)
    count=0;

  glPushMatrix();
  // ring1
  glColor3f (0.0, 0.0 ,1.0);
  glTranslatef(-30.0,10.0,-100.0);
  circle(r);
  glPopMatrix();

  glPushMatrix();
  // ring2
  glColor3f (0.0, 0.0, 0.0);
  glTranslatef(-8.0,10.0,-100.0);
  circle(r);
  glPopMatrix();

  glPushMatrix();
  //ring3
  glColor3f (1.0, 0.0 ,0.0);
  glTranslatef(14.0,10.0,-100.0);
  circle(r);
  glPopMatrix();

  glPushMatrix();
  //ring4
  glColor3f (1.0, 1.0, 0.0);
  glTranslatef(-19.0,-2.0,-100.0);
  circle(r);
  glPopMatrix();

  glPushMatrix();
  //ring5
  glColor3f (0.0, 1.0, 0.0);
  glTranslatef(4.0,-2.0,-100.0);
  circle(r);
  glPopMatrix();

  glutSwapBuffers();
  glutPostRedisplay();
}

static void 
keyb(unsigned char key, int x, int y)
{
  switch (key) {
  case 27:  /* Escape key */
    exit(0);
  }
}


void
init()
{
  glPointSize(3); 
  glShadeModel (GL_FLAT); 
  glMatrixMode(GL_PROJECTION);    
  gluPerspective(45,1.0,10.0,200.0);
  glMatrixMode(GL_MODELVIEW);
  glClearColor(1.0,1.0,1.0,0.0);
  glLineWidth(2);
}

int
main(int argc, char **argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowPosition(100,100);
  glutInitWindowSize(110*3, 110*3);
  glutCreateWindow("draw circle");
  glutDisplayFunc(display);
  glutKeyboardFunc(keyb);
  init();
  glutMainLoop();
  return 0; 
}
查看更多
登录 后发表回答