上一篇博文介绍了一下Kinect的简单姿势识别,详细内容请转到http://yacare.iteye.com/blog/1950112,鄙人之前还写过一个俄罗斯方块的程序,具体请看http://yacare.iteye.com/blog/1949398,本博文主要将这两者结合起来,用Kinect姿势来控制游戏。仅作为一个抛砖引玉的案例,不知道公安局是否备案(哈哈,开个玩笑)。来说明去我们利用Kinect开发使用的只是其9牛1毛,杯水车薪的功能。
至于纯代码键盘控制的俄罗斯方块游戏请阅读C#实现俄罗斯方块,在此就不展开说明。此博文是基于二维仿真版的俄罗斯方块制作。界面与之前的可能有点不一样,但用Kinect姿势控制游戏的部分是基本相同的。
首先,我们要自定义一个姿势库,来存放自定义的姿势。
定义该姿势为方块旋转,左右肩膀,手腕,手掌都为水平方向,阈值角度为8度
定义该姿势为方块左移,左边肩膀,手腕,手掌都为竖直向上方向,阈值角度为10度 ;右边肩膀,手腕,手掌都为竖直向下方向, 阈值角度为30度。
定义该姿势为方块右移,右边肩膀,手腕,手掌都为竖直向上方向,阈值角度为10度 , 左边肩膀,手腕,手掌都为竖直向下方向, 阈值角度为30度。
定义该姿势为方块加速下落,左右边肩手腕,手掌都为水平方向,阈值角度为8度 , 左右肩膀,手腕与竖直竖直向下方向成25度(多次测试,手自然交叉接近这个角度), 阈值角度为8度。
/// <summary> /// 自定义姿势库 /// </summary> private void PopulatePoseLibrary() { this.poseLibrary = new Pose[4]; //Pose 1 - 伸开双臂 Arms Extended this.poseLibrary[0] = new Pose(); this.poseLibrary[0].Title = "伸开双臂(Arms Extended)"; this.poseLibrary[0].Angles = new PoseAngle[4]; this.poseLibrary[0].Angles[0] = new PoseAngle(JointType.ShoulderLeft, JointType.ElbowLeft, 180, 8); this.poseLibrary[0].Angles[1] = new PoseAngle(JointType.ElbowLeft, JointType.WristLeft, 180, 8); this.poseLibrary[0].Angles[2] = new PoseAngle(JointType.ShoulderRight, JointType.ElbowRight, 0, 8); this.poseLibrary[0].Angles[3] = new PoseAngle(JointType.ElbowRight, JointType.WristRight, 0, 8); //Pose 2 - 把双手交叉 Both Hands Cross this.poseLibrary[1] = new Pose(); this.poseLibrary[1].Title = "把手交叉(Hands Cross)"; this.poseLibrary[1].Angles = new PoseAngle[4]; this.poseLibrary[1].Angles[0] = new PoseAngle(JointType.ShoulderLeft, JointType.ElbowLeft, 245, 8); this.poseLibrary[1].Angles[1] = new PoseAngle(JointType.ElbowLeft, JointType.WristLeft, 0, 8); this.poseLibrary[1].Angles[2] = new PoseAngle(JointType.ShoulderRight, JointType.ElbowRight, 285, 8); this.poseLibrary[1].Angles[3] = new PoseAngle(JointType.ElbowRight, JointType.WristRight, 180, 8); //Pose 3 - 举起左手 Left Up and Right Down this.poseLibrary[2] = new Pose(); this.poseLibrary[2].Title = "(举起左手)Left Up and Right Down"; this.poseLibrary[2].Angles = new PoseAngle[4]; this.poseLibrary[2].Angles[0] = new PoseAngle(JointType.ShoulderLeft, JointType.ElbowLeft, 95, 10); this.poseLibrary[2].Angles[1] = new PoseAngle(JointType.ElbowLeft, JointType.WristLeft, 95, 10); this.poseLibrary[2].Angles[2] = new PoseAngle(JointType.ShoulderRight, JointType.ElbowRight, 270, 30); this.poseLibrary[2].Angles[3] = new PoseAngle(JointType.ElbowRight, JointType.WristRight, 270, 30); //Pose 4 - 举起右手 Right Up and Left Down this.poseLibrary[3] = new Pose(); this.poseLibrary[3].Title = "(举起右手)Right Up and Left Down"; this.poseLibrary[3].Angles = new PoseAngle[4]; this.poseLibrary[3].Angles[0] = new PoseAngle(JointType.ShoulderLeft, JointType.ElbowLeft, 270, 30); this.poseLibrary[3].Angles[1] = new PoseAngle(JointType.ElbowLeft, JointType.WristLeft, 270, 30); this.poseLibrary[3].Angles[2] = new PoseAngle(JointType.ShoulderRight, JointType.ElbowRight, 85, 10); this.poseLibrary[3].Angles[3] = new PoseAngle(JointType.ElbowRight, JointType.WristRight, 85, 10); }
处理姿势的事件,控制方块的运动
/// <summary> /// 处理玩家姿势的方法 /// </summary> /// <param name="skeleton"></param> private void ProcessPosePerforming(Skeleton skeleton) { bool ret; Graphics grMain = screenPanel.CreateGraphics(); int value = 0; if (IsPose(skeleton, this.poseLibrary[0]))// up { Console.WriteLine("双手上举垂直姿势符合条件"); value = UP; } else if (IsPose(skeleton, this.poseLibrary[1])) { Console.WriteLine("双手交叉姿势符合条件");// fall down value = DOWN; } else if (IsPose(skeleton, this.poseLibrary[2])) { Console.WriteLine("伸直左手姿势符合条件");// left value = LEFT; } else if (IsPose(skeleton, this.poseLibrary[3])) { Console.WriteLine("伸直右手姿势符合条件"); // right value = RIGHT; } switch (value) { case UP: // up ret = mainBody.MoveShape(grMain, Body.MOVE_TYPE.MOVE_ROATE); break; case LEFT: // left ret = mainBody.MoveShape(grMain, Body.MOVE_TYPE.MOVE_LEFT); break; case RIGHT: // right ret = mainBody.MoveShape(grMain, Body.MOVE_TYPE.MOVE_RIGHT); break; case DOWN: // fall down ret = mainBody.MoveShape(grMain, Body.MOVE_TYPE.MOVE_FALL); break; default: ret = false; break; } if (ret && value == DOWN) { DisposeShapeDown(); } }
相关推荐
本资源与Blog《Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)》配套。 如果您下载到了本资源。请去blog上看原文,方便一起学习交流。 游戏需要Kinect SDK的支持,请先安装Kinect SDK 本资源对应博文地址为...
python
原始信息首先通过与伪随机序列相乘或者异或实现扩频调制,再利用振荡器所产生的载波进行载波调制后通过发射机发射出去,在接收端使用混频器对信号进行降频处理,再利用本地扩频码和载波对信号进行解扩、解调后得到发送端所发送的信息。 扩频系统的扩频运算是通过伪随机码来实现的。理论上,用纯随机序列来扩展信号的频谱是理想的,但是接收端必须复制同一个随机序列,由于随机序列的不可复制性,因此在工程应用中,采用伪随机序列。伪随机序列具有类似于随机噪声的某些统计特性,同时又能重复发生。m序列是最长线性反馈移位寄存器序列(Maximal Length Linear Feedback Shift Register Sequence)的简称。它是由带线性反馈的移位寄存器产生的周期最长的序列。 由于BPSK中,输入0时,输出相位为0,输入1时,输出相位为Π。 将二进制序列,串并转换后将分成两路速率减半的二进制序列得到基带波形I(t),Q(t)。这两路码元在时间上是对齐的,称这两路信号分别是同相支路和正交支路,后续进行上采样,成型滤波器,最后通过IQ调制实现QPSK信号的波形生成。 1.生成双极性的 15 位 m 序列: 2.生成随机的50位待发送二进制信息序列,并进行扩频: 3.对扩频前后的待发送序列进行 BPSK 调制,并观察时域波形: 4.计算并观察扩频前后 BPSK 调制信号的频谱: 循环谱法利用循环平稳信号与随机信号谱相关特性之间的不同,实现对DSSS 信号的检测,而这些算法在检测信号的过程中也可以将载频参数提取出来。设x(t)是一个零均值的非平稳信号,其时变自相关函数定义为: Rr(t,T)= E{x(t)x*(t-T)}若R(t,T)是周期为T的周期函数,统计特性具有二阶周期性,则可用傅里叶级数将其展开为:
汽车轮帽外壳模具设计.zip
基于bpx-api自动交易工具.zip
游戏机按钮注塑模具设计.rar
Ollama 0.5.7 Windows版本
STM32F103ZET6开发板
该资源为h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl,欢迎下载使用哦!
汽车半轴机械加工工艺及工装设计.zip
圆珠笔笔盖的模具设计.rar
20190417-护花小萌宠.rar
橡胶履带牵引车辆改进设计(机械双功率流转向装置).rar
该资源为h5py-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl,欢迎下载使用哦!
Nacos动态路由教学案例.rar
移动手柄的工艺工装设计.rar
深度学习入门-基于Python的理论与实践
关于新闻事件的命名实体的训练集数据
蓝桥杯嵌入式16届省赛学习资源之蓝桥杯嵌入式串口外设代码供学习例程。
内容概要:本文详细介绍了主机厂产线EOL(End of Line,生产线终端)的流程及其重要性。EOL是汽车制造的最后环节,主要负责对已装配完成的整车进行全面检测与调整,确保产品符合出厂标准。其工作内容涵盖功能测试与验证、性能检测与校准、质量检测与缺陷修复及数据记录与追溯。EOL通过自动化检测设备、诊断工具与软件、数据管理系统等技术手段实现。未来,EOL将向智能化、数字化、新能源与自动驾驶适配、柔性化生产方向发展。文中还详述了各桩位的具体作业内容,包括加注、软件下载、电器检查、驾驶辅助标定、转縠及最终电检工位的操作。 适合人群:汽车制造行业从业人员,特别是从事汽车电子、质量检测、生产工艺改进等工作的工程师和技术人员。 使用场景及目标:①了解EOL流程及其在汽车制造中的作用;②掌握各桩位的具体作业内容和操作规范;③为生产工艺改进、供应链管理和产品设计优化提供依据;④确保车辆符合国家/地区的安全、环保、排放等法规要求,顺利通过市场准入。 其他说明:作者是一位魔都的汽车电子工程师,分享了关于EOL流程的专业知识,并表达了对未来发展的展望。此外,作者还提供了与车载诊断架构、AUTOSAR软件架构、电子电器架构等相关的培训服务。