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

5270 ワード

Lighthouse3d.com >> GLUT Tutorial >> Input >> Moving the Camera III
 
 
前節の例では、キーボードでレンズの方向を変更する.この節ではマウスで代用します.
ユーザがマウスの左ボタンを押すと、マウスのX軸位置を記録する.マウスが移動すると、新しいX軸位置を検出し、変位差を利用してdeltaAngle変数を設定します.この変数は、レンズの現在の方向を計算するために初期角度に加算.
マウスクリック時のX軸位置も変数で保存する必要がある.
float deltaAngle = 0.0f;

int xOrigin = -1;

 
なお、xOrigin変数は、1つのマウス入力時に発生しない値(少なくとも0)に初期化すべきである.これにより、ユーザが入力左キーか他のキーかを区別することができる.
次の関数は、キーの状態の変更に応答するために使用されます.
void mouseButton(int button, int state, int x, int y) {



    // only start motion if the left button is pressed

    if (button == GLUT_LEFT_BUTTON) {



        // when the button is released

        if (state == GLUT_UP) {

            angle += deltaAngle;

            xOrigin = -1;

        }

        else  {// state = GLUT_DOWN

            xOrigin = x;

        }

    }

}

なお、xOrigin変数は、左ボタンを離すときに-1に設定.
 
マウスの移動イベントを処理する関数は、次のようになります.
void mouseMove(int x, int y) {



    // this will only be true when the left button is down

    if (xOrigin >= 0) {



        // update deltaAngle

        deltaAngle = (x - xOrigin) * 0.001f;



        // update camera's direction

        lx = sin(angle + deltaAngle);

        lz = -cos(angle + deltaAngle);

    }

}

 
main関数に新しいコールバック関数を2つ登録します.
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);



    glutIgnoreKeyRepeat(1);

    glutKeyboardFunc(processNormalKeys);

    glutSpecialFunc(pressKey);

    glutSpecialUpFunc(releaseKey);



    // here are the two new functions

    glutMouseFunc(mouseButton);

    glutMotionFunc(mouseMove);



    // OpenGL init

    glEnable(GL_DEPTH_TEST);



    // enter GLUT event processing cycle

    glutMainLoop();



    return 1;

}

 
完全なコードは次のセクションで説明します.