/// <summary> /// 旋转动作 /// </summary> /// <param name="handOperate">Hand operate.</param> public void OnRotate(HandOperate handOperate) { //如果左手以及处于旋转状态,则没必要进行下一步了 if (!handOperate.IsRotating) { if (IsRotate(handOperate) && Operate.InputHand.ScreenVector.magnitude > 5) { Operate.InputHand.HandStatus = MInputHandStatus.Rotate; IsRotating = true; } if (Operate.InputHand.IsRotateStatus) { EventCameraRotate.SendListener(Operate.InputHand.ScreenVector); } else { if (IsRotating) { EventCameraRotate.SendListener(Vector3.zero); IsRotating = false; } } } }
/// <summary> /// 具体实现,是旋转还是缩放 /// </summary> /// <param name="inputHand"></param> /// <param name="IsRotate"></param> public void OnAchieve(MInputHand inputHand, bool IsRotate) { ////如果按下右键 //if (Input.GetMouseButtonDown(0)) //{ // IsDown = true; // IsObserved = false; //} //if (Input.GetMouseButtonUp(0)) //{ // IsDown = false; // //已经存在旋转,并且在集合中记录 // if (IsObserved) // { // if (IsRotate) // EventCameraRotate.SendListener(Vector3.zero); // else // EventCameraZoom.SendListener(0); // } // IsObserved = false; // inputHand.HandStatus = MInputHandStatus.Idle; //} //按住右键旋转 if (IsDown) { //向量的模大于2.0时 if (!IsObserved && inputHand.ScreenVector.magnitude > 2.0f) { //将动作记录到集合中 inputHand.HandStatus = IsRotate ? MInputHandStatus.Rotate : MInputHandStatus.Zoom; IsObserved = true; } //已经存在旋转,并且在集合中记录 if (IsObserved) { if (IsRotate) { Vector3 vector = inputHand.ScreenVector; EventCameraRotate.SendListener(vector); } else { EventCameraZoom.SendListener(inputHand.ScreenVector.x / 1200); } } } }
/// <summary> /// 抬起时 /// </summary> /// <param name="IsRotate"></param> public void OnUp(bool IsRotate) { IsDown = false; //已经存在旋转,并且在集合中记录 if (IsObserved) { if (IsRotate) { EventCameraRotate.SendListener(Vector3.zero); } else { EventCameraZoom.SendListener(0); } } IsObserved = false; }
/// <summary> /// 手势动作的判定,用户来实现旋转和缩放 /// </summary> /// <param name="handOperate">Hand operate.</param> public void OnGestureAction(HandOperate handOperate, bool isRotate) { switch (MSwitchManager.CurrentMode) { case OperateModeType.Move: break; case OperateModeType.Rotate: EventCameraRotate.SendListener(Operate.InputHand.ScreenVector); break; case OperateModeType.Zoom: // EventCameraZoom.SendListener(Operate.InputHand.ScreenVector.x / 1200); break; case OperateModeType.Tool: break; default: break; } #region old ////如果左手以及处于旋转状态,则没必要进行下一步了 //if (!handOperate.IsActioning) //{ // if (IsAction(handOperate) && Operate.InputHand.ScreenVector.magnitude > 5) // { // if (isRotate) // Operate.InputHand.HandStatus = MInputHandStatus.Rotate; // else // Operate.InputHand.HandStatus = MInputHandStatus.Zoom; // IsActioning = true; // } // if (isRotate) // { // if (Operate.InputHand.IsRotateStatus) // { // EventCameraRotate.SendListener(Operate.InputHand.ScreenVector); // } // else // { // if (IsActioning) // { // EventCameraRotate.SendListener(Vector3.zero); // IsActioning = false; // } // } // } // else // { // if (Operate.InputHand.IsZoomStatus) // { // EventCameraZoom.SendListener(Operate.InputHand.ScreenVector.x / 1200); // } // else // { // if (IsActioning) // { // EventCameraZoom.SendListener(0); // IsActioning = false; // } // } // } //} #endregion }
/// <summary> /// 鼠标控制端的妹帧执行 /// </summary> void OnMouseUpdate() { if (!IsEnable) { return; } //将他的屏幕坐标传递出去 InputHands[0].OnUpdate(Input.mousePosition); if (Input.GetMouseButtonDown(0) && InputHands[0].IsIdleStatus) { InputHands[0].SetGrip(); } if (Input.GetMouseButtonUp(0) && !(InputHands[0].IsRotateZoomStatus || InputHands[0].IsErrorStatus)) { InputHands[0].SetIdle(); } #region 旋转 //如果按下右键 if (Input.GetMouseButtonDown(1)) { IsRotateDown = true; IsRotate = false; } if (Input.GetMouseButtonUp(1)) { IsRotateDown = false; //已经存在旋转,并且在集合中记录 if (IsRotate) { EventCameraRotate.SendListener(Vector3.zero); } IsRotate = false; InputHands[0].HandStatus = MInputHandStatus.Idle; } //按住右键旋转 if (IsRotateDown) { //向量的模大于2.0时 if (!IsRotate && InputHands[0].IsIdleStatus && InputHands[0].ScreenVector.magnitude > 2.0f) { //将动作记录到集合中 InputHands[0].HandStatus = MInputHandStatus.Rotate; IsRotate = true; } //已经存在旋转,并且在集合中记录 if (IsRotate) { EventCameraRotate.SendListener(InputHands[0].ScreenVector); } } #endregion #region 缩放 //缩放 if (Input.GetAxis("Mouse ScrollWheel") != 0) { float result = Input.GetAxis("Mouse ScrollWheel"); if (!IsZoom && InputHands[0].IsIdleStatus) { InputHands[0].HandStatus = MInputHandStatus.Zoom; IsZoom = true; } //进行缩放 if (IsZoom) { EventCameraZoom.SendListener(result); } } else { //进行缩放 if (IsZoom) { EventCameraZoom.SendListener(0); IsZoom = false; InputHands[0].HandStatus = MInputHandStatus.Idle; } } #endregion if (operateObject != null) { switch (InputHands[0].HandStatus) { case MInputHandStatus.Grabing: //需要处理偏移量 var screenDevice = MUtility.MainWorldToScreenPoint(operateObject.GrabObject.transform.position); Vector3 screenMouse = InputHands[0].ScreenPoint; Vector3 vPos = MUtility.MainScreenToWorldPoint(new Vector3(screenMouse.x, screenMouse.y, screenDevice.z)); Vector3 position = vPos - offset; EventUpdateObject.SendListener(operateObject.GrabObject, position, operateObject.GrabObject.transform.rotation, InputHands[0].HandIndex); break; case MInputHandStatus.Idle: this.operateObject = null; break; default: break; } } }
/// <summary> /// 鼠标控制端的妹帧执行 /// </summary> void OnMouseUpdate() { //将他的屏幕坐标传递出去 InputHands[0].OnUpdate(Input.mousePosition); if (Input.GetMouseButtonDown(0)) { InputHands[0].SetGrip(); } if (Input.GetMouseButtonUp(0)) { InputHands[0].SetIdle(); } //如果按下右键 if (Input.GetMouseButtonDown(1)) { IsRotateDown = true; IsRotate = false; } if (Input.GetMouseButtonUp(1)) { IsRotateDown = false; //已经存在旋转,并且在集合中记录 if (IsRotate && ActionConstraint.IsBind(ActionConstraint.Camera_Rotate_Action)) { EventCameraRotate.SendListener(Vector3.zero); } IsRotate = false; ActionConstraint.RemoveBind(ActionConstraint.Camera_Rotate_Action); } //按住右键旋转 if (IsRotateDown) { //向量的模大于2.0时 if (!IsRotate && ActionConstraint.BindCount == 0 && InputHands[0].ScreenVector.magnitude > 2.0f) { //将动作记录到集合中 ActionConstraint.AddBind(ActionConstraint.Camera_Rotate_Action); IsRotate = true; } //已经存在旋转,并且在集合中记录 if (IsRotate && ActionConstraint.IsBind(ActionConstraint.Camera_Rotate_Action)) { EventCameraRotate.SendListener(InputHands[0].ScreenVector); } } //缩放 if (Input.GetAxis("Mouse ScrollWheel") != 0) { float result = Input.GetAxis("Mouse ScrollWheel"); if (!IsZoom && ActionConstraint.BindCount == 0) { ActionConstraint.AddBind(ActionConstraint.Camera_Zoom_Action); IsZoom = true; } //进行缩放 if (IsZoom && ActionConstraint.IsBind(ActionConstraint.Camera_Zoom_Action)) { EventCameraZoom.SendListener(result); } } else { //进行缩放 if (IsZoom && ActionConstraint.IsBind(ActionConstraint.Camera_Zoom_Action)) { EventCameraZoom.SendListener(0); } IsZoom = false; if (ActionConstraint.BindCount > 0) { ActionConstraint.RemoveBind(ActionConstraint.Camera_Zoom_Action); } } if (operateObject != null) { switch (InputHands[0].HandStatus) { case MInputHandStatus.Grabing: //需要处理偏移量 var screenDevice = MUtility.MainWorldToScreenPoint(operateObject.GrabObject.transform.position); Vector3 screenMouse = InputHands[0].ScreenPoint; Vector3 vPos = MUtility.MainScreenToWorldPoint(new Vector3(screenMouse.x, screenMouse.y, screenDevice.z)); Vector3 position = vPos - offset; EventUpdateObject.SendListener(operateObject.GrabObject, position, operateObject.GrabObject.transform.rotation, InputHands[0].HandIndex); break; case MInputHandStatus.Idle: this.operateObject = null; break; default: break; } } }
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; } } }
internal override void OnLeave(IFsm <OperateSystem> fSM, bool v) { base.OnLeave(fSM, v); EventCameraRotate.SendListener(Vector3.zero); }