[訳]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)です.
レンダー関数では、最初にいくつかのコードを追加して、2つの変数を確認し、対応する位置と方向を更新します.
computePosとcomputeDir関数の定義は次のとおりです.
応答キーの押下と開放のイベント関数には自動回復機構が必要である.キーを押すと、指定した変数をゼロ以外の値に設定するだけです.キーを離すと変数は自動的にゼロになる.
最後にmain関数に次のコードを追加します.
glutIngnoreKeyRepeat関数は、GLUTがレポートボタンの繰り返し入力を停止するように非ゼロパラメータが入力.後から見るとglutSpecialkUpFunc関数は、キーの離すイベントを登録するためのものである.
本節の最後の例は回顧である.キーボードの高度な機能を使用します.
方法は、キーボードを押すと動き始めることをテストすることである.そこで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;
}