//! Initialization method /*! * \param type Data glove hand type. * \return whether data glove is initialized successfully. */ public bool Init(HANDTYPE type) { for (int i = 0; i < 16; i++) { data[i] = Quaternion.identity; } if (sp != null) { try { if (type == HANDTYPE.RIGHT_HAND) { Debug.Log("Try to connect RH index: " + index); } else if (type == HANDTYPE.LEFT_HAND) { Debug.Log("Try to connect LH index: " + index); } if (OpenPort(this.sp, index, type)) { port_opened = true; stat = VRTRIXGloveStatus.NORMAL; } else { Debug.Log("PORT Open Failed"); } return(port_opened); } catch (Exception e) { Console.WriteLine(e); } } return(port_opened); }
//用于计算初始化物体的姿态和手背姿态(由数据手套得到)之间的四元数差值,该方法为静态调用,即只在初始化的时候调用一次,之后所有帧均使用同一个四元数。 //适用于:当动捕设备没有腕关节/手背节点或者只单独使用手套,无其他定位硬件设备时。 private Quaternion CalculateStaticOffset(VRTRIXDataWrapper glove, HANDTYPE type) { if (type == HANDTYPE.RIGHT_HAND) { if (IsVREnabled) { float angle_offset = RH_tracker.transform.rotation.eulerAngles.z; return(Quaternion.AngleAxis(-angle_offset, Vector3.forward)); } else { Quaternion rotation = glove.GetReceivedRotation(VRTRIXBones.R_Hand); Vector3 quat_vec = mr_axisoffset.MultiplyVector(new Vector3(rotation.x, rotation.y, rotation.z)); rotation = new Quaternion(quat_vec.x, quat_vec.y, quat_vec.z, rotation.w); return(RH_ObjectToAlign.transform.rotation * Quaternion.Inverse(rotation)); } } else if (type == HANDTYPE.LEFT_HAND) { if (IsVREnabled) { float angle_offset = LH_tracker.transform.rotation.eulerAngles.z; return(Quaternion.AngleAxis(-angle_offset, Vector3.forward)); } else { Quaternion rotation = glove.GetReceivedRotation(VRTRIXBones.L_Hand); Vector3 quat_vec = ml_axisoffset.MultiplyVector(new Vector3(rotation.x, rotation.y, rotation.z)); rotation = new Quaternion(quat_vec.x, quat_vec.y, quat_vec.z, rotation.w); return(LH_ObjectToAlign.transform.rotation * Quaternion.Inverse(rotation)); } } else { return(Quaternion.identity); } }
private int CalcPoseControl(HANDTYPE ctrlHand, QUADTYPE hitQuad, float poseAngle) { int anglePoint = 0; if (hitQuad == QUADTYPE.LEFTQUAD && ctrlHand == HANDTYPE.RIGHTHAND) { GameManager.Instance.controlPointText.text += string.Format("fantastic Pose!!\n"); anglePoint = CalcPoseAngle(poseAngle); //GameManager.Instance.controlPointText.text += string.Format("PoseDoublePoints!!\n"); return(anglePoint * 2); } else if (hitQuad == QUADTYPE.RIGHTQUAD && ctrlHand == HANDTYPE.LEFTHAND) { GameManager.Instance.controlPointText.text += string.Format("fantastic Pose!!\n"); anglePoint = CalcPoseAngle(poseAngle); //GameManager.Instance.controlPointText.text += string.Format("PoseDoublePoints!!\n"); return(anglePoint * 2); } else //if (hitQuad == QUADTYPE.UPQUAD || hitQuad == QUADTYPE.DOWNQUAD) { { return(CalcPoseAngle(poseAngle)); } //} }
public void SendControlPoint(object[] _params) { int point = 0; Vector3 hitPos = (Vector3)_params[0]; Vector3 hitNormal = (Vector3)_params[1]; Vector3 firePos = (Vector3)_params[2]; Vector3 incomeVector = (hitPos - firePos).normalized; HANDTYPE controlHand = (HANDTYPE)_params[3]; QUADTYPE hitQuad = quadType; float poseAngle = Vector3.Angle(incomeVector, -hitNormal); float poseDistance = (firePos - cameraPos.position).magnitude; Debug.Log(" controlHand : " + controlHand + " poseAngle : " + poseAngle + "//" + " poseDistance : " + poseDistance); GameManager.Instance.controlPointText.text = string.Format(" "); bool isMoved = CheckIsCellMoved(); if (isMoved) { point = CalcControlPoints(controlHand, hitQuad, poseAngle, poseDistance); GameManager.Instance.Score += point; } }
//获取连接状态 //! Get data glove connection status /*! * \param type Data glove hand type. * \return data glove connection status. */ public bool GetGloveConnectionStat(HANDTYPE type) { return(GetReceivedStatus(type) == VRTRIXGloveStatus.NORMAL); }
public VRTRIXGloveGesture GestureDetection(VRTRIXDataWrapper hand, HANDTYPE type) { if (type == HANDTYPE.LEFT_HAND) { float ThumbAngle = hand.GetReceivedGestureAngle(VRTRIXBones.L_Thumb_2); float IndexAngle = hand.GetReceivedGestureAngle(VRTRIXBones.L_Index_2); float MiddleAngle = hand.GetReceivedGestureAngle(VRTRIXBones.L_Middle_2); float RingAngle = hand.GetReceivedGestureAngle(VRTRIXBones.L_Ring_2); float PinkyAngle = hand.GetReceivedGestureAngle(VRTRIXBones.L_Pinky_2); bool ThumbCurve = (ThumbAngle < 10f) || (ThumbAngle > 170f); bool IndexCurve = (IndexAngle < 270f) && (IndexAngle > 95f); bool MiddleCurve = (MiddleAngle < 270f) && (MiddleAngle > 95f); bool RingCurve = (RingAngle < 270f) && (RingAngle > 95f); bool PinkyCurve = (PinkyAngle < 270f) && (PinkyAngle > 95f); bool TeleportCheck = (RingAngle - MiddleAngle < -110f || RingAngle - MiddleAngle > 200) && (PinkyAngle - IndexAngle <-110f || PinkyAngle - IndexAngle> 200f); bool PaperCheck = ((IndexAngle <40f || IndexAngle> 330f) && (MiddleAngle <40f || MiddleAngle> 330f) && (RingAngle <40f || RingAngle> 330f) && (PinkyAngle <40f || PinkyAngle> 330f) && (ThumbAngle > 20f && ThumbAngle < 90f)); //Debug.Log("ThumbAngle: " + ThumbAngle + ", IndexAngle: " + IndexAngle + ", MiddleAngle: " + MiddleAngle + ", RingAngle: " + RingAngle + ", PinkyAngle: " + PinkyAngle); //Debug.Log("TeleportCheck1: " + (RingAngle - MiddleAngle) + ", TeleportCheck2: " + (PinkyAngle - IndexAngle)); if (ThumbCurve && MiddleCurve && RingCurve && PinkyCurve && !IndexCurve) { return(VRTRIXGloveGesture.BUTTONCLICK); } if (ThumbCurve && RingCurve && PinkyCurve && !IndexCurve && !MiddleCurve && TeleportCheck) { return(VRTRIXGloveGesture.BUTTONTELEPORT); } if (ThumbCurve && IndexCurve && !MiddleCurve && !RingCurve && !PinkyCurve) { return(VRTRIXGloveGesture.BUTTONOK); } if (ThumbCurve && MiddleCurve && RingCurve && PinkyCurve && IndexCurve) { return(VRTRIXGloveGesture.BUTTONGRAB); } if (!ThumbCurve && !MiddleCurve && !RingCurve && !PinkyCurve && !IndexCurve && PaperCheck) { return(VRTRIXGloveGesture.BUTTONPAPER); } } else if (type == HANDTYPE.RIGHT_HAND) { float ThumbAngle = hand.GetReceivedGestureAngle(VRTRIXBones.R_Thumb_2); float IndexAngle = hand.GetReceivedGestureAngle(VRTRIXBones.R_Index_2); float MiddleAngle = hand.GetReceivedGestureAngle(VRTRIXBones.R_Middle_2); float RingAngle = hand.GetReceivedGestureAngle(VRTRIXBones.R_Ring_2); float PinkyAngle = hand.GetReceivedGestureAngle(VRTRIXBones.R_Pinky_2); bool ThumbCurve = (ThumbAngle < 10f) || (ThumbAngle > 170f); bool IndexCurve = (IndexAngle < 270f) && (IndexAngle > 95f); bool MiddleCurve = (MiddleAngle < 270f) && (MiddleAngle > 95f); bool RingCurve = (RingAngle < 270f) && (RingAngle > 95f); bool PinkyCurve = (PinkyAngle < 270f) && (PinkyAngle > 95f); bool TeleportCheck = (RingAngle - MiddleAngle < -80f || RingAngle - MiddleAngle > 200) && (PinkyAngle - IndexAngle <-90f || PinkyAngle - IndexAngle> 210f); bool PaperCheck = ((IndexAngle <40f || IndexAngle> 330f) && (MiddleAngle <40f || MiddleAngle> 330f) && (RingAngle <40f || RingAngle> 330f) && (PinkyAngle <40f || PinkyAngle> 330f) && (ThumbAngle > 20f && ThumbAngle < 90f)); //Debug.Log("ThumbAngle: " + ThumbAngle + ", IndexAngle: " + IndexAngle + ", MiddleAngle: " + MiddleAngle + ", RingAngle: " + RingAngle + ", PinkyAngle: " + PinkyAngle); //Debug.Log("ThumbAngle: " + ThumbAngle + ", ThumbCurve: " + ThumbCurve); if (ThumbCurve && MiddleCurve && RingCurve && PinkyCurve && !IndexCurve) { return(VRTRIXGloveGesture.BUTTONCLICK); } if (ThumbCurve && RingCurve && PinkyCurve && !IndexCurve && !MiddleCurve && TeleportCheck) { return(VRTRIXGloveGesture.BUTTONTELEPORT); } if (ThumbCurve && IndexCurve && !MiddleCurve && !RingCurve && !PinkyCurve) { return(VRTRIXGloveGesture.BUTTONOK); } if (ThumbCurve && MiddleCurve && RingCurve && PinkyCurve && IndexCurve) { return(VRTRIXGloveGesture.BUTTONGRAB); } if (!ThumbCurve && !MiddleCurve && !RingCurve && !PinkyCurve && !IndexCurve && PaperCheck) { return(VRTRIXGloveGesture.BUTTONPAPER); } } return(VRTRIXGloveGesture.BUTTONNONE); }
public bool CheckGameOverClaim(List <ICard> cardset, HANDTYPE wintype) { if (cardset.Count != 5) { return(false); Console.WriteLine("This is not a valid hand to win with"); } switch (wintype) { case HANDTYPE.STRAIGHT: { sortbyValue(cardset); int[] values = (from i in cardset select i.GetCardNumValue()).ToArray(); //manual check for A2345 straight if (cardset.Last().GetCardNumValue() == 14 && cardset.First().GetCardNumValue() == 2) { return(values[1] == 2 && values[2] == 3 && values[3] == 4 && values[4] == 5); } Array.Sort(values); for (int i = 1; i < values.Length; i++) { if (values [i] - 1 != values [i - 1]) { return(false); } } return(true); } case HANDTYPE.FLUSH: { string suit = cardset.First().getSuitorColor(); foreach (ICard i in cardset) { if (i.getSuitorColor() != suit) { return(false); } } return(true); } case HANDTYPE.FULLHOUSE: { int[] values = (from i in cardset select i.GetCardNumValue()).ToArray(); Array.Sort(values); return(values[0] == values[1] && values[3] == values[4] && (values[2] == values[1] || values[2] == values[3])); } case HANDTYPE.FOURKIND: { sortbyValue(cardset); int[] values = (from i in cardset select i.GetCardNumValue()).ToArray(); Array.Sort(values); return((values[1] == values[2] && values[2] == values[3]) && (values[0] == values[1] || values[4] == values[1])); } } return(false); }
//TODO: Add AlignmentCheck for Righthand public void alignmentCheck(HANDTYPE type) { alignment_check(this.sp); }
public bool Init(HANDTYPE type) { byte[] buf = new byte[300]; for (int i = 0; i < 6; i++) { valid[i] = true; } for (int i = 0; i < 16; i++) { data[i] = Quaternion.identity; } if (this.sp != null) { if (type == HANDTYPE.RIGHT_HAND) { try { if (get_RH_port(buf)) { Console.WriteLine("Try to opening RH Port: " + System.Text.Encoding.ASCII.GetString(buf)); if (open_port(this.sp, buf, baud_rate, type)) { Console.WriteLine("COM_PORT Opened: " + System.Text.Encoding.ASCII.GetString(buf)); port_opened = true; stat = VRTRIXGloveStatus.NORMAL; } else { Console.WriteLine("COM_PORT Open Failed"); } } } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } } else if (type == HANDTYPE.LEFT_HAND) { try { if (get_LH_port(buf)) { Console.WriteLine("Try to opening LH Port: " + System.Text.Encoding.ASCII.GetString(buf)); if (open_port(this.sp, buf, baud_rate, type)) { Console.WriteLine("COM_PORT Opened: " + System.Text.Encoding.ASCII.GetString(buf)); port_opened = true; stat = VRTRIXGloveStatus.NORMAL; } else { Console.WriteLine("COM_PORT Open Failed"); } } } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } } } return(port_opened); }
private bool GetPaperButtonDown(HANDTYPE tpye) { return(VRTRIXGloveSimpleDataRead.GetGesture(tpye) == VRTRIXGloveGesture.BUTTONPAPER); }
private bool GetRockButtonDown(HANDTYPE tpye) { return(VRTRIXGloveSimpleDataRead.GetGesture(tpye) == VRTRIXGloveGesture.BUTTONGRAB); }
private bool GetScissorsButtonDown(HANDTYPE tpye) { return(VRTRIXGloveSimpleDataRead.GetGesture(tpye) == VRTRIXGloveGesture.BUTTONTELEPORT); }
public void OnCloseFingerAlignment(HANDTYPE type) { OnCloseFingerAlignment(sp); }
public static extern bool OpenPort(IntPtr sp, int glove_id, HANDTYPE type);
//用于计算左手/右手腕关节姿态(由动捕设备得到)和左手手背姿态(由数据手套得到)之间的四元数差值,该方法为动态调用,即每一帧都会调用该计算。 //适用于:当动捕设备有腕关节/手背节点时 private Quaternion CalculateDynamicOffset(GameObject tracker, VRTRIXDataWrapper glove, HANDTYPE type) { //计算场景中角色右手腕在unity世界坐标系下的旋转与手套的右手腕在手套追踪系统中世界坐标系下右手腕的旋转之间的角度差值,意在匹配两个坐标系的方向; if (type == HANDTYPE.RIGHT_HAND) { Quaternion rotation = glove.GetReceivedRotation(VRTRIXBones.R_Hand); Vector3 quat_vec = mr_axisoffset.MultiplyVector(new Vector3(rotation.x, rotation.y, rotation.z)); rotation = new Quaternion(quat_vec.x, quat_vec.y, quat_vec.z, rotation.w); Quaternion target = tracker.transform.rotation * qroffset * Quaternion.Euler(0, -90, 90); return(target * Quaternion.Inverse(rotation)); } //计算场景中角色左手腕在unity世界坐标系下的旋转与手套的左手腕在手套追踪系统中世界坐标系下左手腕的旋转之间的角度差值,意在匹配两个坐标系的方向; else if (type == HANDTYPE.LEFT_HAND) { Quaternion rotation = glove.GetReceivedRotation(VRTRIXBones.L_Hand); Vector3 quat_vec = ml_axisoffset.MultiplyVector(new Vector3(rotation.x, rotation.y, rotation.z)); rotation = new Quaternion(quat_vec.x, quat_vec.y, quat_vec.z, rotation.w); Quaternion target = tracker.transform.rotation * qloffset * Quaternion.Euler(0, 90, -90); return(target * Quaternion.Inverse(rotation)); } else { return(Quaternion.identity); } }
//! Check the tracked device model name stored in hardware config to find specific hardware type. (SteamVR Tracking support) /*! * \param type Hand type to check(if wrist tracker for data glove is the hardware to check). * \param device Device type to check(if other kind of interactive hardware to check). * \return the gameobject of the tracked device. */ public static GameObject CheckDeviceModelName(HANDTYPE type = HANDTYPE.NONE, InteractiveDevice device = InteractiveDevice.NONE) { var system = OpenVR.System; if (system == null) { return(null); } for (int i = 0; i < 16; i++) { var error = ETrackedPropertyError.TrackedProp_Success; var capacity = system.GetStringTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_RenderModelName_String, null, 0, ref error); if (capacity <= 1) { continue; } var buffer = new System.Text.StringBuilder((int)capacity); system.GetStringTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_RenderModelName_String, buffer, capacity, ref error); var s = buffer.ToString(); if (type == HANDTYPE.LEFT_HAND) { if (s.Contains("LH")) { return(GameObject.Find("Device" + i)); } } else if (type == HANDTYPE.RIGHT_HAND) { if (s.Contains("RH")) { return(GameObject.Find("Device" + i)); } } else if (device == InteractiveDevice.SWORD) { if (s.Contains("sword")) { GameObject sword_ref = GameObject.Find("Device" + i); sword_ref.GetComponent <SteamVR_RenderModel>().enabled = false; return(sword_ref); } } else if (device == InteractiveDevice.SHIELD) { if (s.Contains("shield")) { GameObject shield_ref = GameObject.Find("Device" + i); shield_ref.GetComponent <SteamVR_RenderModel>().enabled = false; return(shield_ref); } } else if (device == InteractiveDevice.EXTINGUISHER) { if (s.Contains("fire")) { GameObject ex_ref = GameObject.Find("Device" + i); return(ex_ref); } } } return(null); }
public static extern bool open_port(IntPtr sp, byte[] com_port_name, int baud_rate, HANDTYPE type);