/// <summary> /// Updates the packet with the skeleton-independant data from the Skeleton Frame /// </summary> /// <param name="frame">Skeleton Frame to use for update</param> private void UpdatePacketGlobalData(SkeletonFrame frame) { m_version1Packet.PlayerCount.Set((byte)KinectUtils.CountTrackedSkeletons(m_skeletonArray)); m_version1Packet.Flags.Set(0); //Flags only accessible in the C++ API?? m_version1Packet.FloorClipPlane.Set(frame.FloorClipPlane.Item1, frame.FloorClipPlane.Item2, frame.FloorClipPlane.Item3, frame.FloorClipPlane.Item4); m_version1Packet.GravityNormal.Set(0, 0, 0); //Gravity Normal removed from SDK }
void Update() { bool isOverBtn1 = false, isOverBtn2 = false, isOverBtn3 = false; if (_manager == null) { _manager = KinectManager.Instance; } if (_manager && _manager.IsInitialized())//如果初始化成功 { #region 检测切割,更新划线 //先检查人物是否被检测 if (_manager.IsUserDetected()) { long userId = _manager.GetPrimaryUserID(); //获取左右手手掌的关节视口坐标 Vector3 leftJointPos = KinectUtils.GetViewportToScreenPoint(KinectInterop.JointType.HandLeft); Vector3 rightJointPos = KinectUtils.GetViewportToScreenPoint(KinectInterop.JointType.HandRight); //将左右手坐标转换为ugui坐标 Vector2 leftHandScreenpos; bool isLeftHandOver = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, leftJointPos, Camera.main, out leftHandScreenpos); Vector2 rightHandScreenpos; bool isRightHandOver = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, rightJointPos, Camera.main, out rightHandScreenpos); //左手是否悬浮在区域上 bool l1 = RectTransformUtility.RectangleContainsScreenPoint(fruit1, leftJointPos, Camera.main); bool l2 = RectTransformUtility.RectangleContainsScreenPoint(fruit2, leftJointPos, Camera.main); bool l3 = RectTransformUtility.RectangleContainsScreenPoint(fruit3, leftJointPos, Camera.main); //右手是否悬浮在区域上 bool r1 = RectTransformUtility.RectangleContainsScreenPoint(fruit1, rightJointPos, Camera.main); bool r2 = RectTransformUtility.RectangleContainsScreenPoint(fruit2, rightJointPos, Camera.main); bool r3 = RectTransformUtility.RectangleContainsScreenPoint(fruit3, rightJointPos, Camera.main); isOverBtn1 = l1 || r1; isOverBtn2 = l2 || r2; isOverBtn3 = l3 || r3; //更新显示线位置 leftLine.UpdateCutLine(leftHandScreenpos); rightLine.UpdateCutLine(rightHandScreenpos); } else { leftLine.UpdateCutLine(new Vector2(-1000, 1000)); rightLine.UpdateCutLine(new Vector2(1000, 1000)); } #endregion //检测是否选中按钮 ClickBtnEvent(isOverBtn1, isOverBtn2, isOverBtn3); RotatePic(); } }
/// <summary> /// Processes the given skeleton and updates the network packet data structure, then /// sends the resulting packet. /// </summary> /// <param name="frame">The Kinect Skeleton frame to process.</param> public void ProcessSkeletonData(SkeletonFrame frame) { if ((m_skeletonArray == null) || (m_skeletonArray.Length != frame.SkeletonArrayLength)) { m_skeletonArray = new Skeleton[frame.SkeletonArrayLength]; } frame.CopySkeletonDataTo(m_skeletonArray); // Do stuff here lock (m_version1Packet) { UpdatePacketGlobalData(frame); // Get the best skeleton Skeleton skeleton = KinectUtils.SelectBestSkeleton(m_skeletonArray); UpdatePacketSkeletonData(skeleton); UpdatePacketJoystickData(skeleton); } Send(); m_heartbeatTimer.Change(HEARTBEAT_PERIOD_MS, HEARTBEAT_PERIOD_MS); NTKinect.UpdateHeartBeat(); }
void Update() { timer += Time.deltaTime * creatSpeed; if (timer >= creatTime) { // random time to create fruit int num = Random.Range(1, 3); for (int i = 0; i < num; i++) { _currentFruitArray[i] = CreatFruit(); } timer = 0; } bool isRightOverFrult = false; bool isLeftOverFrult = false; if (_manager == null) { _manager = KinectManager.Instance; } for (int i = 0; i < _currentFruitArray.Length; i++) { if (_currentFruitArray [i] != null) { RectTransform rt = _currentFruitArray [i].transform as RectTransform; if (_manager && _manager.IsInitialized()) //如果初始化成功 { #region 检测切割,更新划线 //先检查人物是否被检测 if (_manager.IsUserDetected()) { long userId = _manager.GetPrimaryUserID(); //获取左右手手掌的关节视口坐标 Vector3 leftJointPos = KinectUtils.GetViewportToScreenPoint(KinectInterop.JointType.HandLeft); Vector3 rightJointPos = KinectUtils.GetViewportToScreenPoint(KinectInterop.JointType.HandRight); //将左右手坐标转换为ugui坐标 Vector2 leftHandScreenpos; bool isLeftHandOver = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, leftJointPos, Camera.main, out leftHandScreenpos); Vector2 rightHandScreenpos; bool isRightHandOver = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, rightJointPos, Camera.main, out rightHandScreenpos); //左手是否悬浮在区域上 isLeftOverFrult = RectTransformUtility.RectangleContainsScreenPoint(rt, leftJointPos, Camera.main); //右手是否悬浮在区域上 isRightOverFrult = RectTransformUtility.RectangleContainsScreenPoint(rt, rightJointPos, Camera.main); //更新显示线位置 leftLine.UpdateCutLine(leftHandScreenpos); rightLine.UpdateCutLine(rightHandScreenpos); } else { leftLine.UpdateCutLine(new Vector2(-1000, 1000)); rightLine.UpdateCutLine(new Vector2(1000, 1000)); } #endregion } #region 切水果 if (isLeftOverFrult || isRightOverFrult) { int t = _currentFruitArray[i].type; if (t == 0) //切到最终boom { lifeNum--; } else //切到水果加分 { scoreNum++; CreatLeftRightFurit(t, _currentFruitArray[i]); } Destroy(_currentFruitArray[i].gameObject); } #endregion } } lifeContent.setLife(lifeNum); gameUIControlOne.SetScore(scoreNum, lifeNum); }
/// <summary> /// Processes the given skeleton and updates the network packet data structure, then /// sends the resulting packet. /// </summary> /// <param name="frame">The Kinect skeleton to process.</param> public void ProcessSkeleton(SkeletonFrame frame) { sbyte[] nullAxis = new sbyte[6]; if ((m_skeletonArray == null) || (m_skeletonArray.Length != frame.SkeletonArrayLength)) { m_skeletonArray = new Skeleton[frame.SkeletonArrayLength]; } frame.CopySkeletonDataTo(m_skeletonArray); // Do stuff here lock (m_version0Packet) { m_version0Packet.PlayerCount.Set((byte)KinectUtils.CountTrackedSkeletons(m_skeletonArray)); m_version0Packet.Flags.Set(0); //Flags only accessible in the C++ API?? m_version0Packet.FloorClipPlane.Set(frame.FloorClipPlane.Item1, frame.FloorClipPlane.Item2, frame.FloorClipPlane.Item3, frame.FloorClipPlane.Item4); m_version0Packet.GravityNormal.Set(0, 0, 0); //Gravity Normal removed from SDK // Get the best skeleton Skeleton s = KinectUtils.SelectBestSkeleton(m_skeletonArray); m_version0Packet.Quality.Set((byte)s.ClippedEdges); m_version0Packet.CenterOfMass.Set(s.Position.X, s.Position.Y, s.Position.Z); m_version0Packet.SkeletonTrackState.Set((uint)s.TrackingState); // Loop through joints; get tracking states and positions byte[] trackingStates = new byte[20]; WritableVertex[] vertices = new WritableVertex[20]; for (uint i = 0; i < s.Joints.Count; i++) { Joint j = s.Joints[(JointType)i]; trackingStates[i] = (byte)(j.TrackingState); vertices[i] = new WritableVertex(j.Position.X, j.Position.Y, j.Position.Z); } m_version0Packet.SkeletonTrackingStates.Set(trackingStates); m_version0Packet.SkeletonJoints.Set(vertices); // Update Joysticks WritableJoystick[] sticks = new WritableJoystick[2] { m_version0Packet.Joystick1, m_version0Packet.Joystick2 }; if (m_version0Packet.PlayerCount.Get() != 0) //Only process and send valid data if a player is detected { m_gestureProcessor.ProcessGestures(sticks, s); } else { m_version0Packet.Joystick1.Set(nullAxis, 0); m_version0Packet.Joystick2.Set(nullAxis, 0); } } send(); m_heartbeatTimer.Change(HEARTBEAT_PERIOD_MS, HEARTBEAT_PERIOD_MS); }