OpenGLで USB ゲームパッド
[ Last updated : 2009-01-05 ]
OpenGL での 3D CG の操作をスムーズにするために USB ゲームパッドを導入し た際の覚え書きです。
- USB ゲームパッドの接続
- Linux では USB ゲームパッドは 通常 /dev/input/js0 または /dev/js0 として 認識される。
- OpenGL ( + FreeGLUT) での利用
- ボタン 5 - 10 の登録
- OpenGL ではボタン1-4 がそれぞれ GLUT_JOYSTICK_BUTTON_A から D として登録されている。 5 - 10 を登録するにはプログラムの最初に次の定義を付け加える。
- ボタン 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 */
- Joystick イベントの登録
- マウスやキーボードのように glutJoystickFunc() を main() 中で glutMainLoop() の前に登録する。
main()
{
...
glutMouseFunc(mouse);
glutJoystickFunc(joystick,100);
glutMainLoop();
...
{
- glutJoystickFunc() の定義は次のとおり
void glutJoystickFunc(void (*func)(unsigned int buttonMask, int x, int y, int z),
int pollInterval);
- 上では呼出し関数として joystick() を登録し, ポーリングタイムとして100ms を設定している。
- Joystick での動作の設定
- 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;
...
}
}
- ちなみに、x, y, z の値は -1000 から 1000 である。
- Joystick イベントについて
- ゲームコントローラによって挙動が違う。
- SANWA SUPPLY JYP59UG [Sanmos JY-P59U Series MICRO GRIP Pro]
- BUFFALO BGCUCF1201BKA [DragonRise Inc. Generic USB Joystick ]
- ゲームコントローラによって挙動が違う。
- サンプルプログラム