2013-05-09 5 views
0

이 코드의 아이디어는 풍차와 같은 구조를 회전시키려는 것입니다. 문제는 풍차 팬 자체가 아닌 전체 개체가 회전한다는 것입니다 (빨간색 삼각형 만 해당). 여기에 코드 (I 속도를 제어하기 위해 키를 사용하여) 당신은 당신의 변환을 수행하는 변형 행렬을 사용하여 여기에 계층 구조의 일종 (일반적으로 장면 그래프)를 구현해야전체 개체가 회전합니다

#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

이다.

기본적으로 자체 변형 행렬이있는 "풍차"개체를 만듭니다. 그런 다음 고유 한 "풍차 팬"개체를 만듭니다. 팬을 부모의 자녀로 설정합니다. 변환은 본질적으로 전파됩니다. 풍차를 변형시킨 다음 풍차 팬을 변형시킵니다.

Post on Scene Graphs

는 또한 유래의 게임 개발 섹션을 확인 할 수 있습니다. 이 질문들은 일반적으로 여기에 열린 무기로 만난 것이 아닙니다.

+0

견적을 해당 게시물에서 "2D 장면 그래프 : 2D에 대한 장면 그래프의 사용이 유용 할 수있는 콘텐츠가 충분히 복잡하고 객체가 하위 구성 요소의 수를 경우하지 않을 경우 큰 몸체에 단단히 고정 시켜라. 그렇지 않으면, 다른 사람들이 언급 한 것처럼, 아마도 과잉이라고 할 수있다. " –

0

새 프레임을 그리려면 변형을 지워야합니다. 따라서 glClear 기능을 수행 한 후 glLoadIdentity()을 입력하십시오.

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에서, 감사의 말을하는 방법은 대답을 수락하는 것입니다. –