OpenGLで USB ゲームパッド

[ Last updated : 2009-01-05 ]

OpenGL での 3D CG の操作をスムーズにするために USB ゲームパッドを導入し た際の覚え書きです。

  1. USB ゲームパッドの接続
    1. Linux では USB ゲームパッドは 通常 /dev/input/js0 または /dev/js0 として 認識される。
  2. OpenGL ( + FreeGLUT) での利用
    1. ボタン 5 - 10 の登録
      1. OpenGL ではボタン1-4 がそれぞれ GLUT_JOYSTICK_BUTTON_A から D として登録されている。 5 - 10 を登録するにはプログラムの最初に次の定義を付け加える。
/* 10 button Joystick */
#define GLUT_JOYSTICK_BUTTON_E  0x10    /* 5 */
#define GLUT_JOYSTICK_BUTTON_F  0x20    /* 6 */
#define GLUT_JOYSTICK_BUTTON_G  0x40    /* 7 */
#define GLUT_JOYSTICK_BUTTON_H  0x80    /* 8 */
#define GLUT_JOYSTICK_BUTTON_I  0x100   /* 9 */
#define GLUT_JOYSTICK_BUTTON_J  0x200   /* 10 */
/* 10 button Joystick */
    1. Joystick イベントの登録
      1. マウスやキーボードのように glutJoystickFunc() を main() 中で glutMainLoop() の前に登録する。
main()
{
      ...
      glutMouseFunc(mouse);
      glutJoystickFunc(joystick,100);
      glutMainLoop();
      ...
{
      1. glutJoystickFunc() の定義は次のとおり
void glutJoystickFunc(void (*func)(unsigned int buttonMask, int x, int y, int z),
                      int pollInterval);
      1. 上では呼出し関数として joystick() を登録し, ポーリングタイムとして100ms を設定している。
    1. Joystick での動作の設定
      1. Joystick イベントが発生した際の関数を定義する。 ただし、マウスと違ってボタンの状態(Up/Down)はわからず、ポーリングした際に押されていたかどうかしかわからないことに注意。
void joystick(unsigned int buttonMask, int x, int y, int z)
{
        if (x)
        {
                /* 左スティックを左右に倒した際の処理 */
        }
        if (y)
        {
                /* 左スティックを上下に倒した際の処理 */
        }
        if (z)
        {
                /* 右スティックを左右に倒した際の処理 */
        }
        switch (buttonMask) {
                case GLUT_JOYSTICK_BUTTON_A:
                        /* ボタン 1 を押した際の処理 */
                        break;
                 ...
         }
}
      1. ちなみに、x, y, z の値は -1000 から 1000 である。
    1. Joystick イベントについて
      1. ゲームコントローラによって挙動が違う。
          1. SANWA SUPPLY JYP59UG [Sanmos JY-P59U Series MICRO GRIP Pro]
          2. BUFFALO BGCUCF1201BKA [DragonRise Inc. Generic USB Joystick ]
    2. サンプルプログラム