/// <summary> /// 变更平台 /// </summary> void ChangePlatform() { if (!MInputKinect.IsHandActive(2)) { if (MUtility.CurrentPlatform != OperatePlatform.Mouse) { mouseController.IsEnable = true; MUtility.CurrentPlatform = OperatePlatform.Mouse; //MLog.WriteLog("切换:鼠标平台"); //Debug.Log("切换:鼠标平台"); } } else { if (MUtility.CurrentPlatform != OperatePlatform.Kinect) { mouseController.IsEnable = false; MUtility.CurrentPlatform = OperatePlatform.Kinect; //MLog.WriteLog("切换:Kinect平台"); //Debug.Log("切换:Kinect平台"); } } }
public float ZoomCameraToMoveFloat() { float moveDistance = 0; lastDistance = Vector3.Distance(MInputKinect.ScreenHandPostion(0), MInputKinect.ScreenHandPostion(1)); moveDistance = lastDistance - distance; distance = lastDistance; return(moveDistance); }
// 单手操作处理 void KinectHandOne() { if (MInputKinect.IsHandActive(0)) { handIndex = 0; } else if (MInputKinect.IsHandActive(1)) { handIndex = 1; } //将他的屏幕坐标传递出去 InputHands[0].OnUpdate(MInputKinect.ScreenHandPostion(handIndex)); if (MInputKinect.HandGrip(handIndex)) { InputHands[0].SetGrip(); } if (MInputKinect.HandRelease(handIndex)) { InputHands[0].SetIdle(); } if (rightOperateObject != null) { switch (InputHands[0].HandStatus) { case MInputHandStatus.Grabing: var screenDevice = MUtility.MainWorldToScreenPoint(rightOperateObject.GrabObject.transform.position); Vector3 screenMouse = InputHands[0].ScreenPoint; Vector3 vPos = MUtility.MainScreenToWorldPoint(new Vector3(screenMouse.x, screenMouse.y, screenDevice.z)); rightOperateObject.GrabObject.transform.position = vPos - rightOffset; //需要处理偏移量 break; case MInputHandStatus.Idle: this.rightOperateObject = null; break; default: break; } } }
/// <summary> /// Kinect控制端数据初始化 /// </summary> /// <param name="handModel">Hand model.</param> private void KinectInitialize(KinectHandModel handModel) { InputHands = new Dictionary <int, MInputHand>(); inputKinect = gameObject.GetComponent <MInputKinect>() ?? gameObject.AddComponent <MInputKinect>(); MInputKinect.HandModel = handModel; IsPlaying = true; //实例化右手 var rightHandUI = MHandUIManager.CreateHandUI(transform, rightHandOperate.handIcon); var rightInputHand = new MInputHand(rightHandOperate.HandIndex, rightHandUI, OperatePlatform.Kinect); rightHandUI.name = "kinect-Hand-0"; InputHands.Add(rightHandOperate.HandIndex, rightInputHand); //实例化左手 var leftHandUI = MHandUIManager.CreateHandUI(transform, leftHandOperate.handIcon); var leftInputHand = new MInputHand(leftHandOperate.HandIndex, leftHandUI, OperatePlatform.Kinect); leftHandUI.name = "Kinect-Hand-1"; InputHands.Add(leftHandOperate.HandIndex, leftInputHand); //右手操作端相关初始化与事件绑定 rightHandOperate.Operate = MOperateManager.AddOperateHand(rightInputHand, this); rightHandOperate.BindGrab(); //左手操作端相关初始化与事件的绑定 leftHandOperate.Operate = MOperateManager.AddOperateHand(leftInputHand, this); leftHandOperate.BindGrab(); IsEnable = true; //mouseController = gameObject.GetComponent<MouseController>() ?? gameObject.AddComponent<MouseController>(); //mouseController.IsEnable = false; //检查一次是否激活手 HandStop(2);//默认也禁止 }
/// <summary> /// 设置手的状态 /// </summary> /// <param name="handIndex">Hand index.</param> private void SetHandStatus(int handIndex) { if (MInputKinect.IsHandActive(handIndex)) { //发送抓取事件等相关事件 InputHands[handIndex].OnUpdate(MInputKinect.ScreenHandPostion(handIndex)); if (MInputKinect.HandGrip(handIndex)) { InputHands[handIndex].SetGrip(); } if (MInputKinect.HandRelease(handIndex)) { InputHands[handIndex].SetIdle(); } if (MInputKinect.HandLasso(handIndex)) { InputHands[handIndex].SetLasso(); } } }
public void OnHandGrip() { distance = Vector3.Distance(MInputKinect.ScreenHandPostion(0), MInputKinect.ScreenHandPostion(1)); lastDistance = distance; }
void KinectRotateZoom() { if (MInputKinect.HandGrip(0)) { handIndex = 0; isRightGrip = true; } else if (MInputKinect.HandRelease(0)) { isRightGrip = false; } if (MInputKinect.HandGrip(1)) { handIndex = 1; isLeftGrip = true; } else if (MInputKinect.HandRelease(1)) { isLeftGrip = false; handIndex = 0; } if (IsRotate) // 旋转 { if ((isLeftGrip && !isRightGrip) || (isRightGrip && !isLeftGrip)) { if (!isTempRotate && ActionConstraint.BindCount == 0 && InputHands[0].ScreenVector.magnitude > 2.0f) { //将动作记录到集合中 ActionConstraint.AddBind(ActionConstraint.Camera_Rotate_Action); isTempRotate = true; } //已经存在旋转,并且在集合中记录 if (isTempRotate && ActionConstraint.IsBind(ActionConstraint.Camera_Rotate_Action)) { EventCameraRotate.SendListener(InputHands[handIndex].ScreenVector); } } else { EventCameraRotate.SendListener(Vector3.zero); } } if (IsZoom) // 缩放 { if (isRightGrip && isLeftGrip) { if (!isTempZoom) { if (twoHandDistance != null) { twoHandDistance.TwoHandGrip(); } isTempZoom = true; } if (twoHandDistance == null) { twoHandDistance = new TwoHandDistance(); twoHandDistance.TwoHandGrip(); } else { float result = twoHandDistance.ZoomCameraToMoveFloat() / 10000; if (result != 0 /* && isTempZoom *//*&& ActionConstraint.IsBind(ActionConstraint.Camera_Zoom_Action)*/) { EventCameraZoom.SendListener(result); } } } else if (!isRightGrip && !isLeftGrip && twoHandDistance != null) { twoHandDistance.TwoHandIdle(); EventCameraZoom.SendListener(0); isTempZoom = false; } } }
// 双手操作处理 void KinectHandTwo() { //将他的屏幕坐标传递出去 InputHands[0].OnUpdate(MInputKinect.ScreenHandPostion(0)); if (MInputKinect.HandGrip(0)) { InputHands[0].SetGrip(); } if (MInputKinect.HandRelease(0)) { InputHands[0].SetIdle(); } //将他的屏幕坐标传递出去 InputHands[1].OnUpdate(MInputKinect.ScreenHandPostion(1)); if (MInputKinect.HandGrip(1)) { InputHands[1].SetGrip(); } if (MInputKinect.HandRelease(1)) { InputHands[1].SetIdle(); } KinectRotateZoom(); if (rightOperateObject != null) { switch (InputHands[0].HandStatus) { case MInputHandStatus.Grabing: var screenDevice = MUtility.MainWorldToScreenPoint(rightOperateObject.GrabObject.transform.position); Vector3 screenMouse = InputHands[0].ScreenPoint; Vector3 vPos = MUtility.MainScreenToWorldPoint(new Vector3(screenMouse.x, screenMouse.y, screenDevice.z)); //rightOperateObject.GrabObject.transform.position = vPos - rightOffset; Vector3 position = vPos - rightOffset; EventUpdateObject.SendListener(rightOperateObject.GrabObject, position, rightOperateObject.GrabObject.transform.rotation, InputHands[0].HandIndex); //需要处理偏移量 break; case MInputHandStatus.Idle: this.rightOperateObject = null; break; default: break; } } if (leftOperateObject != null) { switch (InputHands[1].HandStatus) { case MInputHandStatus.Grabing: var screenDevice = MUtility.MainWorldToScreenPoint(leftOperateObject.GrabObject.transform.position); Vector3 screenMouse = InputHands[1].ScreenPoint; Vector3 vPos = MUtility.MainScreenToWorldPoint(new Vector3(screenMouse.x, screenMouse.y, screenDevice.z)); //leftOperateObject.GrabObject.transform.position = vPos - leftOffset; Vector3 position = vPos - leftOffset; EventUpdateObject.SendListener(leftOperateObject.GrabObject, position, leftOperateObject.GrabObject.transform.rotation, InputHands[0].HandIndex); //需要处理偏移量 break; case MInputHandStatus.Idle: this.leftOperateObject = null; break; default: break; } } if (kinectHandStartStatus == KinectActiveHandStadus.One) { if (MInputKinect.IsHandActive(0) && !MInputKinect.IsHandActive(1) && isRight == false) { MOperateManager.GetOperateHand(0, OperatePlatform.Kinect).OnEnable(); MOperateManager.GetOperateHand(1, OperatePlatform.Kinect).OnDisable(); isRight = true; isLeft = false; } else if (MInputKinect.IsHandActive(1) && !MInputKinect.IsHandActive(0) && isLeft == false) { MOperateManager.GetOperateHand(1, OperatePlatform.Kinect).OnEnable(); MOperateManager.GetOperateHand(0, OperatePlatform.Kinect).OnDisable(); isLeft = true; isRight = false; } } }