[訳]GLUTチュートリアル-キーボード
21708 ワード
Lighthouse3d.com >> GLUT Tutorial >> Input >> Keyboard
GLUTは、通常のキーや特殊なキー、例えばF 1やアップキーなど、アプリケーションがキーボード入力を自動的に監視することができる.この節では、キーイベントをどのように監視し、どのように応答するかについて説明します.
これまでGLUTが対応するイベントを処理する必要があることを発見したはずですが、GLUTにイベントを指定関数にバインドするように伝えなければなりません.再描画イベント、システムアイドルイベント、フォーム変更サイズイベントについて説明した.
同様に、キーボードイベントについて説明します.GLUTのどの関数が応答キー処理であるかを示す.
GLUTは、キーボードイベントにコールバック関数を登録する2つの関数を提供する.1つ目はglutKeyboardFuncであり、フォームシステムに通常のキーイベントを処理することを知らせる.例えば、アルファベット、数字、ASCIIに含むイントラコードである.プロトタイプは次のとおりです.
void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y));
func-通常のキーイベントを処理する関数.NULL値が入力された場合、通常のボタンは無視されます.
glutKeyboarFuncバインド関数は3つの結果値を返さなければならない.1つ目はボタンに対応するASCIIコードで、残りの2つはボタンがトリガーされたときのマウスの位置である.マウス位置は、フォームクライアントに対する左上隅である.
比較的実行可能な実施形態は、ユーザがescキーを入力ときにプログラムを終了することである.glutMainLoop関数を見たとき、私たちはそれが死のサイクルの中で、永遠に戻ってこないことに気づいた.デッドサイクルから飛び出す唯一の方法はシステムのexit関数を呼び出すことである.これが関数の中で実現する必要がある部分で、ユーザーがescキーを押すと、システムexit関数を呼び出してプログラムの終了を促す.コードは次のとおりです.
次に特殊キー処理を見る.GLUTはglutSpecialFunc関数を提供し、プロトタイプは以下の通りである.
void glutSpecialFunc(void (*func) (int key, int x, int y));
func-同glutKeyboardFunc関数.
次に、ユーザが特殊なキーを押すことにより三角形の色を変更する機能を実現する.F 1赤、F 2緑、F 3青.
定数GLUT_KEY_*glutです.hヘッダファイルに予め定義する.この定数の具体的な定義は次のとおりです.
カスタムレスポンス関数processsSpecialKeysに合わせるために、コードヘッダに赤緑青変数を追加します.それ以外にrenderScene関数を変更してレンダリング効果を達成します.
glutKeyboardFuncとglutSpecialFunc関数のコードが定義されました.
この関数をどこでも呼び出すことができるようにするには、処理関数のキーボードイベントをいつでも処理できるように変更する必要がある.これは一般的な特徴ではないからです.main関数に入れます次に、キーボード処理を加えたmain関数を示します.
Ctrl,AltおよびShiftキー
ctrl,alt,shiftなどの編集キーを処理する必要がある場合がある.GLUTは編集キーを監視する関数を提供する.ただし、この関数はキーボードとマウス入力イベントのバインド関数でのみ呼び出すことができる.プロトタイプは次のとおりです.
int glutGetModifiers(void);
この関数の戻り値は、ビットまたは組合せ形式で3つのオプションの定数(glut.hヘッダファイルに含む)である.
GLUT_ACTIVE_SHIFT-shiftキーが押下するか、大文字ロックがオン状態であることを通知する.どちらもオン状態であると、逆に大文字ではない.
GLUT_ACTIVE_CTRL-ctrlキーの押下を通知する.
GLUT_ACTIVE_ALT-altキーの押下を通知する.
次にprocessNormalKeys関数を拡張して編集キーを制御します.rキーで赤変数をゼロにしたいと仮定し、altキーとrキーで赤を最大にします.実装コードは次のとおりです.
最後に、ctrl+alt+F 1のような組み合わせキーを監視するには、どのように実現しますか?2つの編集キーを同時に監視します.私たちは2つの必要な定数をビットまたは組み合わせます.例えば、以下のコードはctrl+alt+F 1の結合キーで赤色に変更する.
完全なコードは次のとおりです.
GLUTは、通常のキーや特殊なキー、例えばF 1やアップキーなど、アプリケーションがキーボード入力を自動的に監視することができる.この節では、キーイベントをどのように監視し、どのように応答するかについて説明します.
これまでGLUTが対応するイベントを処理する必要があることを発見したはずですが、GLUTにイベントを指定関数にバインドするように伝えなければなりません.再描画イベント、システムアイドルイベント、フォーム変更サイズイベントについて説明した.
同様に、キーボードイベントについて説明します.GLUTのどの関数が応答キー処理であるかを示す.
GLUTは、キーボードイベントにコールバック関数を登録する2つの関数を提供する.1つ目はglutKeyboardFuncであり、フォームシステムに通常のキーイベントを処理することを知らせる.例えば、アルファベット、数字、ASCIIに含むイントラコードである.プロトタイプは次のとおりです.
void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y));
func-通常のキーイベントを処理する関数.NULL値が入力された場合、通常のボタンは無視されます.
glutKeyboarFuncバインド関数は3つの結果値を返さなければならない.1つ目はボタンに対応するASCIIコードで、残りの2つはボタンがトリガーされたときのマウスの位置である.マウス位置は、フォームクライアントに対する左上隅である.
比較的実行可能な実施形態は、ユーザがescキーを入力ときにプログラムを終了することである.glutMainLoop関数を見たとき、私たちはそれが死のサイクルの中で、永遠に戻ってこないことに気づいた.デッドサイクルから飛び出す唯一の方法はシステムのexit関数を呼び出すことである.これが関数の中で実現する必要がある部分で、ユーザーがescキーを押すと、システムexit関数を呼び出してプログラムの終了を促す.コードは次のとおりです.
void processNormalKeys(unsigned char key, int x, int y) {
if (key == 27)
exit(0);
}
次に特殊キー処理を見る.GLUTはglutSpecialFunc関数を提供し、プロトタイプは以下の通りである.
void glutSpecialFunc(void (*func) (int key, int x, int y));
func-同glutKeyboardFunc関数.
次に、ユーザが特殊なキーを押すことにより三角形の色を変更する機能を実現する.F 1赤、F 2緑、F 3青.
void processSpecialKeys(int key, int x, int y) {
switch(key) {
case GLUT_KEY_F1 :
red = 1.0;
green = 0.0;
blue = 0.0; break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
}
}
定数GLUT_KEY_*glutです.hヘッダファイルに予め定義する.この定数の具体的な定義は次のとおりです.
GLUT_KEY_F1 F1 function key
GLUT_KEY_F2 F2 function key
GLUT_KEY_F3 F3 function key
GLUT_KEY_F4 F4 function key
GLUT_KEY_F5 F5 function key
GLUT_KEY_F6 F6 function key
GLUT_KEY_F7 F7 function key
GLUT_KEY_F8 F8 function key
GLUT_KEY_F9 F9 function key
GLUT_KEY_F10 F10 function key
GLUT_KEY_F11 F11 function key
GLUT_KEY_F12 F12 function key
GLUT_KEY_LEFT Left function key
GLUT_KEY_RIGHT Right function key
GLUT_KEY_UP Up function key
GLUT_KEY_DOWN Down function key
GLUT_KEY_PAGE_UP Page Up function key
GLUT_KEY_PAGE_DOWN Page Down function key
GLUT_KEY_HOME Home function key
GLUT_KEY_END End function key
GLUT_KEY_INSERT Insert function key
カスタムレスポンス関数processsSpecialKeysに合わせるために、コードヘッダに赤緑青変数を追加します.それ以外にrenderScene関数を変更してレンダリング効果を達成します.
void renderScene(void) {
// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt( 0.0f, 0.0f, 10.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
// the function responsible for setting the color
glColor3f(red,green,blue);
glBegin(GL_TRIANGLES);
glVertex3f(-2.0f,-2.0f, 0.0f);
glVertex3f( 2.0f, 0.0f, 0.0);
glVertex3f( 0.0f, 2.0f, 0.0);
glEnd();
angle+=0.1f;
glutSwapBuffers();
}
glutKeyboardFuncとglutSpecialFunc関数のコードが定義されました.
この関数をどこでも呼び出すことができるようにするには、処理関数のキーボードイベントをいつでも処理できるように変更する必要がある.これは一般的な特徴ではないからです.main関数に入れます次に、キーボード処理を加えたmain関数を示します.
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);
// here are the new entries
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(processSpecialKeys);
// enter GLUT event processing cycle
glutMainLoop();
return 1;
}
Ctrl,AltおよびShiftキー
ctrl,alt,shiftなどの編集キーを処理する必要がある場合がある.GLUTは編集キーを監視する関数を提供する.ただし、この関数はキーボードとマウス入力イベントのバインド関数でのみ呼び出すことができる.プロトタイプは次のとおりです.
int glutGetModifiers(void);
この関数の戻り値は、ビットまたは組合せ形式で3つのオプションの定数(glut.hヘッダファイルに含む)である.
GLUT_ACTIVE_SHIFT-shiftキーが押下するか、大文字ロックがオン状態であることを通知する.どちらもオン状態であると、逆に大文字ではない.
GLUT_ACTIVE_CTRL-ctrlキーの押下を通知する.
GLUT_ACTIVE_ALT-altキーの押下を通知する.
次にprocessNormalKeys関数を拡張して編集キーを制御します.rキーで赤変数をゼロにしたいと仮定し、altキーとrキーで赤を最大にします.実装コードは次のとおりです.
void processNormalKeys(unsigned char key, int x, int y) {
if (key == 27)
exit(0);
else if (key=='r') {
int mod = glutGetModifiers();
if (mod == GLUT_ACTIVE_ALT)
red = 0.0;
else
red = 1.0;
}
}
最後に、ctrl+alt+F 1のような組み合わせキーを監視するには、どのように実現しますか?2つの編集キーを同時に監視します.私たちは2つの必要な定数をビットまたは組み合わせます.例えば、以下のコードはctrl+alt+F 1の結合キーで赤色に変更する.
void processSpecialKeys(int key, int x, int y) {
int mod;
switch(key) {
case GLUT_KEY_F1 :
mod = glutGetModifiers();
if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) {
red = 1.0; green = 0.0; blue = 0.0;
}
break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
}
}
完全なコードは次のとおりです.
#include <stdlib.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
// all variables initialized to 1.0, meaning
// the triangle will initially be white
float red=1.0f, blue=1.0f, green=1.0f;
// angle for rotating triangle
float angle = 0.0f;
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
h = 1;
float ratio = w * 1.0 / h;
// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);
// Reset Matrix
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45.0f, ratio, 0.1f, 100.0f);
// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}
void renderScene(void) {
// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt( 0.0f, 0.0f, 10.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glColor3f(red,green,blue);
glBegin(GL_TRIANGLES);
glVertex3f(-2.0f,-2.0f, 0.0f);
glVertex3f( 2.0f, 0.0f, 0.0);
glVertex3f( 0.0f, 2.0f, 0.0);
glEnd();
angle+=0.1f;
glutSwapBuffers();
}
void processNormalKeys(unsigned char key, int x, int y) {
if (key == 27)
exit(0);
}
void processSpecialKeys(int key, int x, int y) {
switch(key) {
case GLUT_KEY_F1 :
red = 1.0;
green = 0.0;
blue = 0.0; break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
}
}
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);
// here are the new entries
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(processSpecialKeys);
// enter GLUT event processing cycle
glutMainLoop();
return 1;
}