PC用Kinect玩水果忍者核心代码

/******************************
 *PC用Kinect玩水果忍者核心代码*
 ******************************/
 
 private const double ArmXStretchedThreshold = 0.3;//手臂X轴方向伸展阀值,单位米
 private const double ArmZStretchedThreshold = 0.2;//手臂Z轴方向伸展阀值,单位米
 private bool isMouseLeftButtonDown = false;
 
 void kinect_SkeletonFrameReady(object sender,SkeletonFrameReadyEventArgs e)
 {
	if(isWindowsClosing)
	{
		return;
	}
	//获取距离Kinect距离最近的被骨骼跟踪的用户
	Skeleton s = GetClosetSkeleton(e);
	if(s == null)
	{
		return;
	}
	if(s.TrackingState == SkeletonTrackingState.Tracked)
	{
		var joints = s.Joints;
		Joint rightHand = Joints[JointType.HandRight];
		Joint leftHand = Joints[JointType.HandLeft];
		Joint head = Joints[JointType.Head];
		
		//根据Kinect距离判定是左手还是右手操作鼠标,兼容左右手
		var hand = (rightHand.Position.Z < leftHand.Position.Z ? rightHand : leftHand);
		
		//如果手没有伸出,则不做跟踪
		if(head.Position.Z - hand.Position.Z <= ArmZStretchedThreshold)
		{
			return;
		}
		
		//模拟鼠标移动
		TrackHand2SimulateMouseMove(hand);
		
		bool isLeftHandStretched = ((head.Position.X-leftHand.Position.X)>=ArmXStretchedThreshold && (head.Position.Z-hand.Position.Z)<ArmZStretchedThreshold);
		bool isRightHandStretched = ((rightHand.Position.X-leftHand.Position.X)>=ArmXStretchedThreshold) && (head.Position.Z-hand.Position.Z)<ArmZStretchedThreshold);
		//无论左手或右手水平举起,模拟鼠标左键按下事件
		if(isLeftHandStretched || isRightHandStretched)
		{
			MouseToolkit.mouse_event(MouseToolkit.MouseEventFlag.LeftDown,0,0,0,0);
			isMouseLeftButtonDown = true;
		}
		else if(isMouseLeftButtonDown)
		{
			isMouseLeftButtonDown = false;
			MouseToolkit.mouse_event(MouseToolkit.MouseEventFlag.LeftUp,0,0,0,0);
		}
	}
 }
 
 private void TrackHand2SimulateMouseMove(Joint hand)
 {
	if(hand.TrackingState != JointTrackingState.Tracked)
	{
		return;
	}
	//获得屏幕高度和宽度
	int screenWidth = (int)SystemParameters.PrimaryScreenWidth;
	int screenHeight = (int)SystemParameters.PrimaryScreenHeight;
	//将骨骼坐标映射为屏幕坐标且手在有限范围内移动即可覆盖整个屏幕
	float posX = hand.ScaleTo(screenWidth,screenHeight,0.2f,0.2f).Position.X;
	float posY = hand.ScaleTo(screenWidth,screenHeight,0.2f,0.2f).Position.Y;
	Joint scaledCursorJoint = new Joint
	{
		TrackingState = JointTrackingState.Tracked;
		Position = new SkeletonPoint
		{
			X = posX;
			Y = posY;
			Z = hand.Position.Z;
		}
	};
	int x = Convert.ToInt32(scaledCursorJoint.Position.X);
	int y = Convert.ToInt32(scaledCursorJoint.Position.Y);
	int mouseX = Convert.ToInt32(x*65536/screenWidth);
	int mouseY = Convert.ToInt32(x*65536/screenHeight);
	MouseToolkit.mouse_event(MouseToolkit.MouseEventFlag.Absolute|MouseToolkit.MouseEventFlag.Move,mouseX,mouseY,0,0);
 }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值