[訳]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関数を呼び出してプログラムの終了を促す.コードは次のとおりです.
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;

}