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

4 に答える 4

1

ここでは、変換行列を使用して変換を行う何らかの階層 (通常はシーン グラフ) を実装する必要があります。

基本的には、独自の変換行列を持つ「風車」オブジェクトを作成します。次に、独自の「Windmill Fan」オブジェクトを作成します。ファンを親の子にします。変換は基本的に下方に伝播します。ウインドミルを変形させてから、ウインドミルファンを変形させます。

シーン グラフに投稿する

また、stackoverflow のゲーム開発セクションも確認してください。これらの質問は、通常、ここで両手を広げて満たされることはありません。

于 2013-05-09T20:19:54.330 に答える
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;
}
于 2013-05-09T20:49:27.697 に答える
0

新しいフレームを描画する前に、変換をクリアする必要があります。だから、glLoadIdentity()あなたが機能した後に入れてくださいglClear

  void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity(); //  <-- put it here
    glBegin(GL_TRIANGLES);
    ...
于 2013-05-09T20:30:13.670 に答える
0

回転オブジェクトを描画するglRotate に呼び出す必要があります。その前に、現在のモデル ビュー マトリックスを でスタックにプッシュし、残りの風車を描画する前にglPushMatrixでポップする必要があります。glPopMatrix

より複雑なシーンができたら、シーン グラフの使用を検討してください。のような行列関数glRotateは非推奨になっていることに注意してください。できるだけ早く glm などに切り替えることを検討してください。

于 2013-05-09T20:32:26.903 に答える