我要发帖 回复

正式会员

5

主题

33

积分

0

专家分

:

私信
发表时间 : 2007-10-21 18:38:47 | 浏览 : 1655    评论 : 5
上次直接读取z数据不可行的问题要先道歉了。我有点想当然,后来想起vega中joystick只支持x和y数据,不支持z。要解决这个问题,需要使用自定义输入设备,从自定义输入设备中读取z就可以了。以下是代码。但我没有方向盘,所以没有测试过,如有问题请与我联系

  1. //以下6行放在vgConfig之后,循环之前
  2. vgIDev *joyInput= vgNewIDev();
  3. vgProp( joyInput, VGIDEV_DEVICETYPE, VGIDEV_USER_DEFINED );   
  4. vgIDevUserOpenFunc(  joyInput, OpenFunc );  
  5. vgIDevUserReadFunc(  joyInput, ReadFunc );   
  6. vgIDevUserCloseFunc( joyInput, CloseFunc );  
  7. vgIDevOpen ( joyInput );


  8. int OpenFunc(vgIDevUserOpenStruct* openStruct)
  9. {         
  10.      openStruct->num_toggles = 8;        
  11.      openStruct->num_sliders = 1;         
  12.      return 1;
  13. }

  14. int ReadFunc(vgIDevUserReadStruct* readStruct)
  15. {         

  16.      int toggles[8];

  17.      Joy.GetJoystickData();  //Joy是我自己写的手柄操纵类的实例,后面有详细实现代码。

  18.      //读取JoyStick的各个按键的状态
  19.      if (Joy.Button1IsPressed())
  20.          toggles[0] = 1;
  21.      else
  22.          toggles[0] = 0;
  23.      if (Joy.Button2IsPressed())
  24.          toggles[1] = 1;
  25.      else
  26.          toggles[1] = 0;
  27.      if (Joy.Button3IsPressed())
  28.          toggles[2] = 1;
  29.      else
  30.          toggles[2] = 0;
  31.     if (Joy.Button4IsPressed())
  32.          toggles[3] = 1;
  33.     else
  34.          toggles[3] = 0;
  35.    if (Joy.Button5IsPressed())
  36.          toggles[4] = 1;
  37.    else
  38.          toggles[4] = 0;
  39.    if (Joy.Button6IsPressed())
  40.         toggles[5] = 1;
  41.    else
  42.         toggles[5] = 0;
  43.    if (Joy.Button7IsPressed())
  44.         toggles[6] = 1;
  45.    else
  46.         toggles[6] = 0;
  47.    if (Joy.Button8IsPressed())
  48.         toggles[7] = 1;
  49.    else
  50.         toggles[7] = 0;

  51.    //将节流阀数据放到自定义输入设备的Sliders[0]中
  52.    readStruct->sliders[0] = Joy.GetThrottle();

  53.    //将JoyStick的x,y,rudder数据放到自定义输入设备的Pos的X,Y,H分量上   
  54.    vgPosVec( readStruct->pos, Joy.GetPosX(), Joy.GetPosY(), Joy.GetPosZ, Joy.GetRudder(), 0, 0 );
  55.   
  56.    //按键状态到自定义输入设备的toggles中
  57.    for (i = 0; i < 8; i++)
  58.        readStruct->toggles[ i ] = toggles[ i ];
  59.   
  60.    return 1;
  61. }

  62. int CloseFunc()
  63. {           
  64.     return 1;
  65. }

  66. windows操纵JoyStick有特定的API,为了使用方便和后期扩展,我自己定义了个类,如下:

  67. //MyJoyStick.h
  68. #include <windows.h>
  69. #include <mmsystem.h>
  70. #if !defined(MYJOYSTICK_H_INCLUDE)
  71. #define MYJOYSTICK_H_INCLUDE

  72. class MyJoystick
  73. {
  74. public:
  75.         MyJoystick(int);
  76.         int  GetPosX();
  77.         int  GetPosY();
  78.         int  GetPosZ();
  79.         int  GetPosR();
  80.         int  GetPosU();
  81.         int  GetPosV();
  82.         int  GetPosPov();
  83.         float GetThrottle();
  84.         float GetRudder();
  85.         bool Button1IsPressed();
  86.         bool Button2IsPressed();
  87.         bool Button3IsPressed();
  88.         bool Button4IsPressed();
  89.         bool Button5IsPressed();
  90.         bool Button6IsPressed();
  91.         bool Button7IsPressed();
  92.         bool Button8IsPressed();
  93.         void GetJoystickData();
  94. protected:
  95.         UINT jID;
  96.         JOYINFOEX jInfo;
  97.         JOYCAPS   jCaps;
  98. private:
  99.         int  PosX;
  100.         int  PosY;
  101.         int  PosZ;
  102.         int  PosR;
  103.         int  PosU;
  104.         int  PosV;
  105.         int  PosPov;
  106.         bool Btn1IsPressed;
  107.         bool Btn2IsPressed;
  108.         bool Btn3IsPressed;
  109.         bool Btn4IsPressed;
  110.         bool Btn5IsPressed;
  111.         bool Btn6IsPressed;
  112.         bool Btn7IsPressed;
  113.         bool Btn8IsPressed;
  114. };
  115. #endif


  116. //MyJoyStick.cpp
  117. #include "stdafx.h"
  118. #include "MyJoyStick.h"
  119. #include "stdio.h"
  120. #include <math.h>

  121. MyJoystick::MyJoystick(int jid=1)
  122. {
  123.         if (jid == 1)
  124.                   jID = JOYSTICKID1;
  125.         else if (jid == 2)
  126.                   jID = JOYSTICKID2;
  127.         else jID = 0;
  128.                 joyGetDevCaps(jID, &jCaps, sizeof(jCaps));
  129.         PosX = 0;
  130.         PosY = 0;
  131.         PosZ = 0;
  132.         PosR = 0;
  133.         PosU = 0;
  134.         PosV = 0;
  135.         PosPov = 0;
  136.         Btn1IsPressed = false;
  137.         Btn2IsPressed = false;
  138.         Btn3IsPressed = false;
  139.         Btn4IsPressed = false;
  140.         Btn5IsPressed = false;
  141.         Btn6IsPressed = false;
  142.         Btn7IsPressed = false;
  143.         Btn8IsPressed = false;
  144. }
  145. int  MyJoystick::GetPosX()
  146. {
  147.         return PosX;
  148. }
  149. int  MyJoystick::GetPosY()
  150. {
  151.         return PosY;
  152. }
  153. int  MyJoystick::GetPosZ()
  154. {
  155.         return PosZ;
  156. }
  157. int  MyJoystick::GetPosR()
  158. {
  159.         return PosR;
  160. }
  161. int  MyJoystick::GetPosU()
  162. {
  163.         return PosU;
  164. }
  165. int  MyJoystick::GetPosV()
  166. {
  167.         return PosV;
  168. }
  169. int  MyJoystick::GetPosPov()
  170. {
  171.         return PosPov;
  172. }
  173. float MyJoystick::GetThrottle()
  174. {
  175.         float th;
  176.         th = 1.0f - ((float)PosZ) / ((float)(jCaps.wZmax - jCaps.wZmin));
  177.         return th;
  178. }
  179. float MyJoystick::GetRudder()
  180. {
  181.         float ru;
  182.         ru = 2.0f*(((float)PosR) / ((float)(jCaps.wRmax - jCaps.wRmin)) - 0.5f);
  183.         if (ru > 0 )
  184.                      ru = abs(ru *10000) / 10000.0;
  185.         else
  186.                      ru = -abs(ru *10000) / 10000.0;
  187.             return ru;
  188. }
  189. bool MyJoystick::Button1IsPressed()
  190. {
  191.         return Btn1IsPressed;
  192. }
  193. bool MyJoystick::Button2IsPressed()
  194. {
  195.         return Btn2IsPressed;
  196. }
  197. bool MyJoystick::Button3IsPressed()
  198. {
  199.         return Btn3IsPressed;
  200. }
  201. bool MyJoystick::Button4IsPressed()
  202. {
  203.         return Btn4IsPressed;
  204. }
  205. bool MyJoystick::Button5IsPressed()
  206. {
  207.         return Btn5IsPressed;
  208. }
  209. bool MyJoystick::Button6IsPressed()
  210. {
  211.         return Btn6IsPressed;
  212. }
  213. bool MyJoystick::Button7IsPressed()
  214. {
  215.         return Btn7IsPressed;
  216. }
  217. bool MyJoystick::Button8IsPressed()
  218. {
  219.         return Btn8IsPressed;
  220. }
  221. void MyJoystick::GetJoystickData()
  222. {
  223.         MMRESULT res;

  224.         jInfo.dwSize = sizeof (jInfo);
  225.         jInfo.dwFlags = JOY_RETURNALL;
  226.         res = joyGetPosEx(jID, &jInfo);
  227.         if ( res== JOYERR_NOERROR)
  228.         {
  229.                   PosX   = jInfo.dwXpos;
  230.                   PosY   = jInfo.dwYpos;
  231.                   PosZ   = jInfo.dwZpos;
  232.                   PosR   = jInfo.dwRpos;
  233.                   PosU   = jInfo.dwUpos;
  234.                   PosV   = jInfo.dwVpos;
  235.                   PosPov = jInfo.dwPOV / 100;
  236.                   Btn1IsPressed = ((jInfo.dwButtons & JOY_BUTTON1) ? true : false);
  237.                   Btn2IsPressed = ((jInfo.dwButtons & JOY_BUTTON2) ? true : false);
  238.                   Btn3IsPressed = ((jInfo.dwButtons & JOY_BUTTON3) ? true : false);
  239.                   Btn4IsPressed = ((jInfo.dwButtons & JOY_BUTTON4) ? true : false);
  240.                   Btn5IsPressed = ((jInfo.dwButtons & JOY_BUTTON5) ? true : false);
  241.                   Btn6IsPressed = ((jInfo.dwButtons & JOY_BUTTON6) ? true : false);
  242.                   Btn7IsPressed = ((jInfo.dwButtons & JOY_BUTTON7) ? true : false);
  243.                   Btn8IsPressed = ((jInfo.dwButtons & JOY_BUTTON8) ? true : false);
  244.         }
  245.         else
  246.         {
  247.                   if (res == MMSYSERR_NODRIVER)
  248.                            printf("MMSYSERR_NODRIVER\n");
  249.                   if (res == MMSYSERR_INVALPARAM)
  250.                            printf("MMSYSERR_INVALPARAM\n");
  251.                   if (res == MMSYSERR_BADDEVICEID)
  252.                            printf("MMSYSERR_BADDEVICEID\n");
  253.                   if (res == JOYERR_UNPLUGGED)
  254.                            printf("JOYERR_UNPLUGGED\n");
  255.                   PosX = 0;
  256.                   PosY = 0;
  257.                   PosZ = 0;
  258.                   PosR = 0;
  259.                   PosU = 0;
  260.                   PosV = 0;
  261.                   PosPov = 0;
  262.                   Btn1IsPressed = false;
  263.                   Btn2IsPressed = false;
  264.                   Btn3IsPressed = false;
  265.                   Btn4IsPressed = false;
  266.                   Btn5IsPressed = false;
  267.                   Btn6IsPressed = false;
  268.                   Btn7IsPressed = false;
  269.                   Btn8IsPressed = false;
  270.         }
  271. }
复制代码

最近VR访客

obuil 评论于2007-10-21 19:24:20
好同志!
wenyg 评论于2007-11-11 01:08:51
太好了,应该受到伟大领袖胡主席的嘉奖
yangwang21 评论于2008-4-24 16:27:28
说不定有用
henry0henry 评论于2008-5-9 08:49:25
支持
llllppppjjjj 评论于2008-6-7 17:25:15

ding

支持,太好了

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-9-17 11:55 PM

返回顶部