[訳]GLUTチュートリアル-レンズを移動する2

6810 ワード

Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera II
 
本節の最後の例は回顧である.キーボードの高度な機能を使用します.
方法は、キーボードを押すと動き始めることをテストすることである.そこでglutIgnoreKeyRepeatで繰り返しボタンのコールバック関数を閉じるつもりです.
キーを押すと、ゼロ以外の変数値を設定します.ボタンを離すと、変数はゼロになります.
キーの押下と解除イベントにバインド関数がない場合、更新レンズの位置と方向の一致を維持するために、レンダリング関数の次の2つの変数を確認する必要がある.
入門のセクションでは、deltaAngleとdeltaMoveの2つの変数があります.この2つの変数はそれぞれレンズの回転と移動を制御.非ゼロが発生すると、レンズは動作を実行し、ゼロになるとレンズは変わらない.この2つの変数の初期値は0である、すなわち、初期はレンズである.
コードの先頭に2つの変数を追加してキーの状態を追跡するつもりです.1つは方向(deltaAngle)、もう1つは位置(deltaMove)です.
// the key states. These variables will be zero

// when no key is being presses

float deltaAngle = 0.0f;

float deltaMove = 0;

 
レンダー関数では、最初にいくつかのコードを追加して、2つの変数を確認し、対応する位置と方向を更新します.
void renderScene(void) {



    if (deltaMove)

        computePos(deltaMove);

    if (deltaAngle)

        computeDir(deltaAngle);

    ...

 
computePosとcomputeDir関数の定義は次のとおりです.
void computePos(float deltaMove) {



    x += deltaMove * lx * 0.1f;

    z += deltaMove * lz * 0.1f;

}



void computeDir(float deltaAngle) {



    angle += deltaAngle;

    lx = sin(angle);

    lz = -cos(angle);

}

 
応答キーの押下と開放のイベント関数には自動回復機構が必要である.キーを押すと、指定した変数をゼロ以外の値に設定するだけです.キーを離すと変数は自動的にゼロになる.
void pressKey(int key, int xx, int yy) {



    switch (key) {

        case GLUT_KEY_LEFT : deltaAngle = -0.01f; break;

        case GLUT_KEY_RIGHT : deltaAngle = 0.01f; break;

        case GLUT_KEY_UP : deltaMove = 0.5f; break;

        case GLUT_KEY_DOWN : deltaMove = -0.5f; break;

    }

}



void releaseKey(int key, int x, int y) {



    switch (key) {

        case GLUT_KEY_LEFT :

        case GLUT_KEY_RIGHT : deltaAngle = 0.0f;break;

        case GLUT_KEY_UP :

        case GLUT_KEY_DOWN : deltaMove = 0;break;

    }

}

 
最後にmain関数に次のコードを追加します.
glutIngnoreKeyRepeat関数は、GLUTがレポートボタンの繰り返し入力を停止するように非ゼロパラメータが入力.後から見るとglutSpecialkUpFunc関数は、キーの離すイベントを登録するためのものである.
int main(int argc, char **argv) {



    // init GLUT and create window

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100,100);

    glutInitWindowSize(320,320);

    glutCreateWindow("Lighthouse3D - GLUT Tutorial");



    // register callbacks

    glutDisplayFunc(renderScene);

    glutReshapeFunc(changeSize);

    glutIdleFunc(renderScene);

    glutSpecialFunc(pressKey);



    // here are the new entries

    glutIgnoreKeyRepeat(1);

    glutSpecialUpFunc(releaseKey);



    // OpenGL init

    glEnable(GL_DEPTH_TEST);



    // enter GLUT event processing cycle

    glutMainLoop();



    return 1;

}