为了实现利用体感进行方向盘模拟,我们首先要明白,方向盘是一个线性的虚拟手柄,因为玩家在进行不同的旋转操作的时候,会有不同的角度,在这种情况下,我们需要反映成游戏中不同的拐弯角度。而不是像按键手柄,一个按钮实现一个功能。在这里我们使用线性手柄的轴度,模拟线性方向盘的感觉,但是在这里我们只实现与虚拟手柄的通信,而不是创建虚拟手柄。

在这里我们使用四轴虚拟线性手柄,但是因为只需要两个轴,所以我们只用两个。一个控制转角,一个控制油门。

这里的难点其实在于如何去与虚拟线性手柄进行通讯,这里,我们使用了USBHID,也就是一种USB通讯协议,我们常用的鼠标,键盘,手柄之类的外设一般通过这个来进行驱动,从而进行控制。USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。另外,使用HID设备的一个好处就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的驱动程序,只要直接使用API调用即可完成通信。所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
具体关于USBHID的详细信息,可以参考博文http://blog.csdn.net/leo_wonty/article/details/6721214。

但是我们如何进行USBHID的通讯,在这里我们使用的是DDK,win DDK是微软官方出的专门用于驱动编写的sdk。下载与安装都很简单,https://www.microsoft.com/en-us/download/details.aspx?id=11800在这里下载,下载之后点击setup的那个就可以了。然后就安装好了。当然,由于我们要实现的功能不需要那么多库文件,所以我们也可以单独下载所需要的头文件和链接库。

接下来是代码部分:

HANDLE OpenContorlDevice()
{HDEVINFO hardwareDeviceInfo;SP_DEVICE_INTERFACE_DATA deviceInterfaceData;SP_DEVICE_INTERFACE_DATA devInfoData;GUID hidguid;PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData=NULL;DWORD predictedLength=0;DWORD requiredLength=0;HANDLE file=INVALID_HANDLE_VALUE;PHIDP_PREPARSED_DATA Ppd=NULL;HIDD_ATTRIBUTES Attributes;HIDP_CAPS Caps;int i;HidD_GetHidGuid(&hidguid);hardwareDeviceInfo=SetupDiGetClassDevs((LPGUID)&hidguid,NULL,NULL,(DIGCF_PRESENT|DIGCF_INTERFACEDEVICE));if (INVALID_HANDLE_VALUE==hardwareDeviceInfo){printf("SertupDiGetClassDevs failed:",GetLastError());goto cleanup;}deviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);devInfoData.cbSize=sizeof(SP_DEVINFO_DATA);for (i=0;SetupDiEnumDeviceInterfaces(hardwareDeviceInfo,0,(LPGUID)&hidguid,i,&deviceInterfaceData);i++){SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfo,&deviceInterfaceData,NULL,0,&requiredLength,NULL);predictedLength=requiredLength;deviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(predictedLength);if (!deviceInterfaceDetailData){printf("Error: OpenDeviceInterface:malloc faild\n");goto cleanup;}deviceInterfaceDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);if (!SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfo,&deviceInterfaceData,deviceInterfaceDetailData,predictedLength,&requiredLength,NULL)){printf("Error: SetupDiGetInterfaceDeviceDetail failed: %x\r\n",GetLastError());goto cleanup;}file=CreateFile(deviceInterfaceDetailData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if (INVALID_HANDLE_VALUE==file){printf("Error:Creat file failed:%d\r\n",GetLastError());CloseHandle(file);}else{if (!HidD_GetPreparsedData(file,&Ppd)){printf("Error: HidD_GetPreparsedData failed\r\n");file=INVALID_HANDLE_VALUE;}else{if (!HidD_GetAttributes(file,&Attributes)){printf("Error: HidD_GetAttributes failed\r\n");file=INVALID_HANDLE_VALUE;}else{if (Attributes.VendorID==0x045E&&Attributes.ProductID==0x02AE){if (!HidP_GetCaps(Ppd,&Caps)){printf("Error:HidP_GetCaps failed\r\n");file=INVALID_HANDLE_VALUE;}else{if ((Caps.UsagePage==0x09)&&(Caps.Usage==0x00)){printf("Success:Found my device..\r\n");goto cleanup;}}}else{printf("Error: VendorID or ProductID is not what we want\r\n");file=INVALID_HANDLE_VALUE;}}}}free(deviceInterfaceDetailData);}cleanup:if (Ppd!=NULL){HidD_FreePreparsedData(Ppd);}SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);return file;
}

在这里,我大概说一下这些代码所进行的流程,总的来说就是枚举设备,再打开设备,由于在这个过程中涉及到设备的描述符等参数,大家可以稍微了解一下。要与USB设备通信,就要先获取你的USB设备类的 GUID标识,然后再根据GUID来枚举该类的设备,然后从中找到你的设备。

首先,获取本系统中HID类的GUID标识,准备查找符合HID规范的USB设备,若找到了一个USB设备,则找到设备后则以读写的方式打开以进行操作,获取该设备的细节信息,然后根据VendorID 和 ProductID判断是否是目标设备。在这里我们需要注意的就是
VendorID 和 ProductID以及USAGE和USAGEPAPER这四个参数,一定要对应好虚拟手柄上的设备参数。

所需要的头文件为:

#include <stdio.h>
#include <windows.h>extern "C" {
#include "hidsdi.h"
#include "setupapi.h"
}
#pragma comment (lib,"hid.lib")
#pragma comment (lib,"setupapi.lib")
#pragma comment (lib,"kernel32.lib")

OPENNI实践-体感方向盘玩赛车游戏相关推荐

  1. OPENNI实践-体感方向盘玩赛车游戏(2)

    这一篇是关于获取到的数据与虚拟手柄之间通信的过程.首先设置要发送的指令,然后通过WriteFile将指令发送给设备. [cpp] view plaincopy <span style=" ...

  2. 体感交互动画与游戏概述

    体感交互动画与游戏概述 1 概念 用身体去感受的动画或电子游戏.突破以往单纯以手柄按键输入的操作方式,是一种通过肢体动作变化来进行(操作)的新型动画或电子游戏. 2 体感交互动画的发展历史 1.  鼠 ...

  3. python编写赛车游戏单机版_使用Keras和DDPG玩赛车游戏(自动驾驶)

    为什么选择TORCS游戏 <The Open Racing Car Simulator>(TORCS)是一款开源3D赛车模拟游戏 看着AI学会开车是一件很酷的事 可视化并考察神经网络的学习 ...

  4. 使用Keras和DDPG玩赛车游戏(自动驾驶)

    Using Keras and Deep Deterministic Policy Gradient to play TORCS--300行python代码展示DDPG(基于Keras)--视频 可以 ...

  5. 基于Kinect体感的仿真对抗游戏系统

    项目意义: 1.Kinect的研究和应用在国内外都呈现出比较高的热潮,相关技术,如人脸识别.动态跟踪.手势识别等均出现了比较优越的实际效果.让机器人能够实时跟踪人的动作功能并完成与人的沟通互动是机器人 ...

  6. MYO:体感新玩法,生物电感应

    什么是最好的人机交互?笔者认为是趋向于人体自然行为的交互活动,比如人手正常的拿.捏,或是眼睛的注视.远眺等. 何玺在之前的博客中曾向大家介绍过Google Glass.Xbox Kinect.Leap ...

  7. 【不可不看】体感游戏的发展经历

    根据十几年游戏经验的总结,双人体感游戏,体感游戏的发展是由电子游戏输入设备地进步展开的.而安卓游戏可以说是体感游戏最大的贡献者. 电子游戏最开始的输入方式来自于计算机键盘,后来衍生出的专业电子游戏机以 ...

  8. 基础设备硬件常识----体感游戏机

    内容多位资源整理,尊重原创: 体感游戏机就是用手或身体的动作姿态控制游戏的游戏机,特点是游戏感强.运动健康.多人一起玩,很适合家庭用户,是家用游戏机的一个分支.目前市场上的品牌以微软Xbox Kine ...

  9. kinect体感互动解决方案:体感炫舞

    体感炫舞互动系统是一款音乐节奏型游戏,采用最新的虚拟现实+体感技术,高精度巨幅画面+炫酷,游戏玩家跟随动感节奏.其精彩纷呈的互动效果令人大跌眼镜. 体感炫舞互动游戏,炫击节拍,舞动节奏,它无须再借助地 ...

最新文章

  1. SQL Server技术问题之视图优缺点
  2. 提权学习之旅——Linux操作系统提权
  3. vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项
  4. UVa10006-Carmichael Numbers
  5. USACO-Section1.2 Friday the Thirteenth (简单日期处理)
  6. python正则匹配表达式(1)
  7. Mysql数据库-面试题
  8. DVWA 黑客攻防演练(七)Weak Session IDs
  9. Eclipse 中 去掉控制台最大行数限制
  10. Slim下的函数介绍(一)(转)
  11. Emacs一个键绑定多个命令
  12. Qt Creator使用clang-format格式化代码
  13. 网管培训之基础知识介绍
  14. 获取 IE 浏览器版本以及判断是否开启 cookie
  15. win7如何设置通电自动开机_WIN7旗舰版在BIOS界面下如何设置自动开机?
  16. arm学习之基本汇编指令
  17. 十九 Redis AOF持久化
  18. 如何将二维码分解成链接?二维码解码在线怎么操作?
  19. 如何对一年级小学生进行养成教育
  20. 工程伦理--9.1 岗位胜任力

热门文章

  1. android模拟门禁,IT之家学院:利用tasker实现门禁卡模拟
  2. Web直播播放器1.0——腾讯sdk网页直播播放器
  3. UE4性能观察的基础
  4. 大学四年看了这18般书籍,我成了别人眼中的程序员大神!
  5. ITK05 孔洞填充
  6. ssh爆破获取用户密码
  7. 【电子学会】2021年03月图形化四级 -- 十字回文诗
  8. Scrum实践指南:一个可运行的Scrum是怎样的
  9. 龙王传说古月_龙王传说最新话:真虐!古月疏远唐舞麟,却又忍不住偷瞄他
  10. uniapp开发微信小程序使用painter生成海报