[訳]GLUTチュートリアル-レンズを移動する3
5270 ワード
Lighthouse3d.com >> GLUT Tutorial >> Input >> Moving the Camera III
前節の例では、キーボードでレンズの方向を変更する.この節ではマウスで代用します.
ユーザがマウスの左ボタンを押すと、マウスのX軸位置を記録する.マウスが移動すると、新しいX軸位置を検出し、変位差を利用してdeltaAngle変数を設定します.この変数は、レンズの現在の方向を計算するために初期角度に加算.
マウスクリック時のX軸位置も変数で保存する必要がある.
なお、xOrigin変数は、1つのマウス入力時に発生しない値(少なくとも0)に初期化すべきである.これにより、ユーザが入力左キーか他のキーかを区別することができる.
次の関数は、キーの状態の変更に応答するために使用されます.
なお、xOrigin変数は、左ボタンを離すときに-1に設定.
マウスの移動イベントを処理する関数は、次のようになります.
main関数に新しいコールバック関数を2つ登録します.
完全なコードは次のセクションで説明します.
前節の例では、キーボードでレンズの方向を変更する.この節ではマウスで代用します.
ユーザがマウスの左ボタンを押すと、マウスの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;
}
完全なコードは次のセクションで説明します.