`
什么世道
  • 浏览: 219291 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)

阅读更多

    上一篇博文介绍了一下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();
            }
        }
 

 

运行示例:
 


 
 
由于Kinect检测精度和鄙人算法能力有限,游戏姿势的检测并不是特别完美,欢迎大家体验测试并提宝贵意见,如果不满意,也欢迎大家拍砖。#^V^#
 友情提示:该项目需要有Kinect SDK的支持才能运行。

Kinect SDK下载地址:http://www.microsoft.com/en-us/kinectforwindowsdev/default.aspx

 

程序所有源代码和项目已打包上传到:
下一篇博文将分享Kinect结合Unity3D进行开发
希望大家多多支持和指正。
 

Kinect开发系列博文:

Kinect开发之结合Unity3D进行游戏应用开发
 
Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)
 
Kinect开发之简单姿势识别
 
Kinect开发之获取骨骼关节数据并绘制成火柴人
 
Kinect开发之获取彩色摄像头数据 
  • 大小: 5.3 KB
  • 大小: 3.2 KB
  • 大小: 3.2 KB
  • 大小: 3.4 KB
  • 大小: 13.4 KB
  • 大小: 22.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics