Мне нужно сделать это колесо, чтобы анимация вращения вокруг его центра в openGL непрерывно выполнялась без щелчка мышью, потому что колесо вращается при нажатии левой кнопки мыши !!, это колесо:

enter image description here

Это код, который я использовал для рисования колеса и его вращения:

#include <freeglut.h>

#include <glaux.h>


void whiteStud()

{


        glColor3f(1.0, 1.0, 1.0);
        glutSolidSphere(0.01, 16, 16);


}

void blackWheel() 

{


       glColor3f(0.129412, 0.129412, 0.129412);
       glutSolidSphere(0.1, 16, 16);


}


void wheelWithStuds()

   {  
       /**********************************/
        int iTimeElapsed = glutGet(GLUT_ELAPSED_TIME);
        float fScale= 0.5f;
        long i;
       /**********************************/
       /* clear all pixels */
       glClear(GL_COLOR_BUFFER_BIT);
       /**********************************/
       glPushMatrix();
       glTranslatef(0.25, 0.25, 0.0);
       glRotatef(iTimeElapsed * fScale,0.0,0.0,1.0);
       blackWheel(); // draw the wheel without studs.
       /**********************************/
       // five studs, step 72 degree (72*5=360 degree).
       for (i=0; i<5; i++) {
            glPushMatrix();
            glRotatef(72*i,0.0,0.0,1.0); // rotate coordinate 72 degree.
            glTranslatef(0.04, 0.0, 0.0);// translate on the rotated coordinate.
            whiteStud(); // draw the stud.
            glPopMatrix();
            } 
            glTranslatef(0.0, 0.0, 0.0);// translate in order to draw a stud at the center of the wheel.
            whiteStud();// draw the stud at the center of the wheel.
            /**********************************/
            /* don't wait! start processing buffered OpenGL routines */
            glFlush();
            glPopMatrix();
            /**********************************/

   }


int main(int argc, char** argv)

   {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
      glutInitWindowSize(400, 400);
      glutInitWindowPosition(10, 10);
      glutCreateWindow("(-Rotating Car Wheel-)");
      /* select clearing (background) color */
      glClearColor(1.0, 1.0,1.0, 1.0);
      /* initialize viewing values */
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      glutDisplayFunc(wheelWithStuds);
      glutMainLoop();
      return 0;
   }

Я хочу, чтобы это колесо вращалось само по себе, не щелкая левой кнопкой мыши, как я могу это сделать?

0
Akari 31 Дек 2013 в 06:33
1
Сначала нарисуйте колесо в начале координат, затем поверните его и переместите в нужное место.
 – 
Dinesh Subedi
31 Дек 2013 в 07:58
1
Вам нужно добавить glutPostRedisplay () в конец draw_wheel (). Я упоминаю об этом в своем ответе ниже. Вам также не понадобится glFlush ().
 – 
Lokno
31 Дек 2013 в 21:39

1 ответ

Лучший ответ

Вот новый draw_wheel () с желаемым движением. Примечательно, что вы забыли glutPostRedisplay() в конце метода рисования; эта функция сообщает перенасыщению перерисовать окно. Кроме того, вы не сбрасывали свой первый вызов на glTranslatef(), поэтому каждый раз, когда вы щелкали по окну, объект уходил все дальше от своего исходного положения.

void draw_wheel()
{  
    int iTimeElapsed = glutGet(GLUT_ELAPSED_TIME);
    float fRevolveScale1 = 0.2f;
    float fRevolveScale2 = 0.4f;
    long i;

    // clear all pixels
    glClear(GL_COLOR_BUFFER_BIT);

    // push temp state
    glPushMatrix();

    // translate to center
    glTranslatef(0.5f, 0.5f, 0.0); 

    // rotate around pivot
    glRotatef(iTimeElapsed * fRevolveScale1,0.0,0.0,1.0);

    // translate to planet location
    glTranslatef(0.25f, 0.25f, 0.0); 

    glRotatef(iTimeElapsed * fRevolveScale2,0.0,0.0,1.0);

    glColor3f(0.129412f, 0.129412f, 0.129412f);
    glutSolidSphere(0.1f, 16, 16);

    // five bolts, step 72 degree (72*5=360 degree)
    glColor3f(1.0, 1.0, 1.0);
    for(i=0; i<5; ++i) 
    {
        glPushMatrix();
        glRotatef(72.0f*i,0.0,0.0,1.0); // rotate coordinate 72 degree
        glTranslatef(0.04f, 0.0, 0.0);// translate on the rotated coordinate
        glutSolidSphere(0.01f, 16, 16);
        glPopMatrix();
    }

    glTranslatef(0.0f, 0.0f, 0.0f);// translate on the rotated coordinate
    glutSolidSphere(0.01, 16, 16);

    // pop temp state
    glPopMatrix();

    glFlush();
    glutPostRedisplay();
}
1
Lokno 31 Дек 2013 в 21:27
1
Вы вращаете объект вокруг центра окна, или вращаете вокруг центра объекта, или и то, и другое? Кроме того, что сейчас происходит?
 – 
Lokno
31 Дек 2013 в 20:33
1
Я обновил draw_wheel () тем, что, как мне кажется, вы хотите. Дайте мне знать, если это не совсем так.
 – 
Lokno
31 Дек 2013 в 21:30