旋转5圈问题

时间:2011-07-03 21:19:15

标签: c opengl 3d rotation

  

可能重复:
  how to rotate this openGl code…

下面是我的代码,它工作正常..我在这里画了5个戒指。

#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; 
}

所以我想旋转所有这个圈子......我该怎么办?

1 个答案:

答案 0 :(得分:3)

你应该在绘图函数中只调用一次glutSwapBuffers。

对于动画,您必须调用glutPostRedisplay,以确保再次调用显示功能。

每个圆圈只需调用一次glBegin和glEnd调用。在for循环中,您只需向glVertex调用顶点。

为简化调试,我安装了一个键盘处理程序,在按下转义键时关闭窗口。

 // 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; 
}