2013-05-09 3 views
0

Идея этого кода состоит в том, чтобы вращающаяся ветряная мельница могла вращаться, проблема в том, что весь объект вращается вместо самого ветряного мельница (а не только красные треугольники). Вот код (я использую клавиши для управления скоростью)Весь объект вращается

#include <windows.h> // for MS Windows 
    #include <GL/glut.h> // GLUT, include glu.h and gl.h 

    float angle = 0.00002f; 
    int refreshMills = 30; 

    void initGL() { 
     glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black and opaque 
    } 

    void Timer(int value) { 
     glutPostRedisplay();  // Post re-paint request to activate display() 
     glutTimerFunc(refreshMills, Timer, 0); // next Timer call milliseconds later 
    } 

    void display() { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glBegin(GL_TRIANGLES); 
       glColor3f(1.0f, 0.0f, 0.0f) 
       glVertex2f(0.0f, 0.0f); 
       glVertex2f(-0.4f, 0.2f); 
       glVertex2f(-0.2f, 0.4f); 
       glColor3f(1.0f, 0.0f, 0.0f); 
       glVertex2f(0.0f, 0.0f); 
       glVertex2f(0.4f, -0.2f); 
       glVertex2f(0.2f, -0.4f); 
       glColor3f(1.0f, 0.0f, 0.0f); 
       glVertex2f(0.0f, 0.0f); 
       glVertex2f(-0.4f, -0.2f) 
       glVertex2f(-0.2f, -0.4f); 
       glColor3f(1.0f, 0.0f, 0.0f); 
       glVertex2f(0.0f, 0.0f); 
       glVertex2f(0.4f, 0.2f);  
       glVertex2f(0.2f, 0.4f); 
     glEnd(); 

     glRotatef(angle, 0.0f, 0.0f, 1.0f); 
     angle=angle+0.000002f; 
     glutPostRedisplay(); 
     glBegin(GL_TRIANGLES); 
       glColor3f(1.0f, 1.0f, 1.0f); 
       glVertex2f(0.0f, 0.0f); 
       glVertex2f(-0.4f, -0.6f); 
       glVertex2f(0.4f, -0.6f); 
     glEnd(); 
     glFlush(); 
     glutSwapBuffers(); 
    } 

    void keyboard(unsigned char key, int x, int y) { 
     switch (key) { 
     case 'a':{  
       angle+=1; 
       glutPostRedisplay(); 
     } 

     case 's': 
       angle+=2; 
     glutPostRedisplay(); 

     case 'd':  
       angle+=3 
     glutPostRedisplay(); 

     case 'f':  
       angle=0; 
     } 
    } 

    } 

    int main(int argc, char** argv) { 
     glutInit(&argc, argv);   // Initialize GLUTx 
     glutCreateWindow("Windmill"); // Create window with the given title 
     glutInitWindowSize(320, 320); // Set the window's initial width & height 
     glutInitWindowPosition(50, 50); // Position the window's initial top-left corner 
     glutDisplayFunc(display); 
     glutTimerFunc(0, Timer, 0); 
     glutSpecialFunc(specialKeys); 
     glutKeyboardFunc(keyboard); 
     initGL();      // Our own OpenGL initialization 
     glutMainLoop();     // Enter the event-processing loop 

     return 0; 
    } 

ответ

1

Вы должны реализовать какое-то иерархия (обычно граф сцены) здесь, который использует матрицы преобразования, чтобы сделать ваши преобразования.

В принципе, создайте объект «Ветряная мельница», у которого есть своя матрица преобразования. Затем создайте объект «Windmill Fan», который имеет свой собственный. Сделайте поклонником ребенка родителя. Преобразования существенно распространяются вниз. Преобразуйте ветряную мельницу, затем трансформируйте ветряную мельницу.

Post on Scene Graphs

Вы также можете проверить раздел развития игры в StackOverflow. Эти вопросы обычно не встречаются здесь с распростертыми объятиями.

+0

Цитата с этого поста: «2D сцены Графы: Использование графа сцены для 2D может быть полезно, если содержание является достаточно сложным, и если ваши объекты имеют ряд вспомогательных компонентов, не жестко привязанный к большему телу. В противном случае, как говорили другие, это, вероятно, слишком велико ». –

0

Перед попыткой нарисовать новый кадр вам нужно очистить свои преобразования. Итак, положите glLoadIdentity() после вас glClear функции.

void display() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); // <-- put it here 
    glBegin(GL_TRIANGLES); 
    ... 
0

Вам нужно позвонить glRotateперед рисования вращающегося объекта. И до этого вам нужно нажать текущую матрицу вида модели на стек с glPushMatrix, а затем поместить ее glPopMatrix, прежде чем рисовать остальную часть ветряной мельницы.

Как только у вас будет более сложная сцена, вы можете использовать граф сцены. Обратите внимание, что функции матрицы, такие как glRotate, теперь устарели. Вы можете рассмотреть возможность переключения на, например, glm как можно скорее.

0

Попробуйте это:

#include <GL/glut.h> // GLUT, include glu.h and gl.h 

void Timer(int value) 
{ 
    glutPostRedisplay();  // Post re-paint request to activate display() 
    glutTimerFunc(16, Timer, 0); // next Timer call milliseconds later 
} 

float rate = 1.0f; 
void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 
    case 'a': 
     rate=2; 
     break; 
    case 's': 
     rate=3; 
     break; 
    case 'd':  
     rate=4; 
     break; 
    case 'f':  
     rate=0; 
     break; 
    } 
    glutPostRedisplay(); 
} 

float angle = 0.0f; 
void display() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black and opaque 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // base  
    glPushMatrix(); 
     glBegin(GL_TRIANGLES); 
      glColor3f(1.0f, 1.0f, 1.0f); 
      glVertex2f(0.0f, 0.0f); 
      glVertex2f(-0.4f, -0.6f); 
      glVertex2f(0.4f, -0.6f); 
     glEnd(); 
    glPopMatrix(); 

    // prop 
    glPushMatrix(); 
     glRotatef(angle, 0.0f, 0.0f, 1.0f); 
     angle=angle+rate; 
     glBegin(GL_TRIANGLES); 
      glColor3f(1.0f, 0.0f, 0.0f); 
      glVertex2f(0.0f, 0.0f); 
      glVertex2f(-0.4f, 0.2f); 
      glVertex2f(-0.2f, 0.4f); 
      glColor3f(1.0f, 0.0f, 0.0f); 
      glVertex2f(0.0f, 0.0f); 
      glVertex2f(0.4f, -0.2f); 
      glVertex2f(0.2f, -0.4f); 
      glColor3f(1.0f, 0.0f, 0.0f); 
      glVertex2f(0.0f, 0.0f); 
      glVertex2f(-0.4f, -0.2f); 
      glVertex2f(-0.2f, -0.4f); 
      glColor3f(1.0f, 0.0f, 0.0f); 
      glVertex2f(0.0f, 0.0f); 
      glVertex2f(0.4f, 0.2f);  
      glVertex2f(0.2f, 0.4f); 
     glEnd(); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv);   // Initialize GLUTx 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(320, 320); // Set the window's initial width & height 
    glutInitWindowPosition(50, 50); // Position the window's initial top-left corner 
    glutCreateWindow("Windmill"); // Create window with the given title 
    glutDisplayFunc(display); 
    glutTimerFunc(0, Timer, 0); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop();     // Enter the event-processing loop 
    return 0; 
} 
+0

Большое спасибо, я ценю вашу помощь – freeglut233

+1

На stackoverflow, способ сказать спасибо - это принять ответ. –

Смежные вопросы