private int findMiddlePoint(StreemData networkData, int firstPoint) { float minDistance = 0; int result = 0; bool found = false; for (int i = 0; i < 4; i++) { if (i != firstPoint) { float tempMinDist = Vector3.Distance(networkData._markers[firstPoint].pos, networkData._markers[i].pos); if (!found) { minDistance = tempMinDist; found = true; result = i; } else if (tempMinDist < minDistance) { minDistance = tempMinDist; result = i; } } } point2.transform.position = networkData._markers[result].pos; middlePointVec = networkData._markers[result].pos; return(result); }
private int findThumb(StreemData networkData, int firstPoint, int middle) { int result = 0; float minDistance = 0.0f; bool found = false; for (int i = 0; i < 4; i++) { if (i != firstPoint && i != middle) { float tempminDistance = Vector3.Distance(wrist.transform.position, networkData._markers[i].pos); if (!found) { minDistance = tempminDistance; found = true; result = i; } else if (tempminDistance < minDistance) { minDistance = tempminDistance; result = i; } } } thumb.transform.position = networkData._markers[result].pos; thumbPointVec = networkData._markers[result].pos; return(result); }
public bool checkPointGesture(StreemData networkData) { //Sort the array to take the 4 closest to the wrist markers Array.Sort(networkData._markers, delegate(Marker marker1, Marker marker2) { float distance1 = Vector3.Distance(wrist.transform.position, marker1.pos); float distance2 = Vector3.Distance(wrist.transform.position, marker2.pos); return(distance1.CompareTo(distance2)); }); firstPoint = findFirstPoint(networkData); middle = findMiddlePoint(networkData, firstPoint); theThumb = findThumb(networkData, firstPoint, middle); laser = findLaserPoint(networkData, firstPoint, theThumb, middle); if (checkFingerAngle(networkData, firstPoint, middle, laser)) { // LaserPointing = true; return(true); } else { //LaserPointing = false; return(false); } }
public bool checkWristOrientation(StreemData networkData) { _moveVector = transform.position; _moveVector = networkData._rigidBody[0].pos + origin.position; // Rigid body rotation streamed from Motive Tracker Quaternion rot = networkData._rigidBody[0].ori * origin.rotation; // Invert pitch and yaw Vector3 euler = rot.eulerAngles; rot.eulerAngles = new Vector3(-euler.x, euler.y, -euler.z); // Apply rotation wrist.transform.rotation = rot; wrist.transform.position = _moveVector; TheWrist = wrist.transform; if ((wrist.transform.rotation.eulerAngles.x >= 0.0f && wrist.transform.rotation.eulerAngles.x <= 25.0f) || (wrist.transform.rotation.eulerAngles.x >= 315.0f && wrist.transform.rotation.eulerAngles.x <= 360.0f)) { return(true); } else { //LaserPointing = false; return(false); } }
// Update is called once per frame void Update() { if (OptitrackManagement.DirectMulticastSocketClient.IsInit() && OptitrackManagement.DirectMulticastSocketClient.IsDataReceivedCorrectly()) { StreemData networkData = OptitrackManagement.DirectMulticastSocketClient.GetStreemData(); if (_manager.checkWristOrientation(networkData)) { if (_manager.checkPointGesture(networkData)) { _manager.LaserPointing = true; if (_manager.SelectGesture) { if (frameCounter <= framesOfSelectGesture) { if (_manager.checkForClick(networkData)) { _manager.ClickGesture = true; _manager.SelectGesture = false; frameCounter = 0; } else { frameCounter++; } } else { frameCounter = 0; _manager.SelectGesture = false; } } else if (_manager.checkSelectGesture(networkData)) { _manager.SelectGesture = true; _manager.ClickGesture = false; } else { _manager.SelectGesture = false; _manager.ClickGesture = false; } } else { noGestures(); } } else { noGestures(); } } else { noGestures(); } }
private bool checkFingerAngle(StreemData networkData, int firstPoint, int middle, int laser) { Vector3 v1 = networkData._markers[firstPoint].pos; Vector3 v2 = networkData._markers[middle].pos; Vector3 v3 = networkData._markers[laser].pos; float angle = signedAngleBetween(v1, v3, v2); if (angle >= 2.30f && angle <= 2.95f) { return(true); } else { return(false); } }
private int findLaserPoint(StreemData networkData, int firstPoint, int theThumb, int middle) { int result = 0; for (int i = 0; i < 4; i++) { if (i != firstPoint && i != theThumb && i != middle) { result = i; } } laserpoint.transform.position = networkData._markers[result].pos; laserPointVec = networkData._markers[result].pos; return(result); }
public bool checkForClick(StreemData networkData) { Vector3 v1 = networkData._markers[middle].pos; Vector3 v2 = networkData._markers[firstPoint].pos; Vector3 v3 = networkData._markers[theThumb].pos; float angle = signedAngleBetween(v1, v3, v2); // Debug.Log(angle); if (angle <= 0.25f) { return(true); } else { return(false); } }
private int findFirstPoint(StreemData networkData) { float minDistance = Vector3.Distance(wrist.transform.position, networkData._markers[0].pos); int result = 0; for (int i = 0; i < 4; i++) { float tempDist = Vector3.Distance(wrist.transform.position, networkData._markers[i].pos); if (tempDist < minDistance) { minDistance = tempDist; result = i; } } poin1.transform.position = networkData._markers[result].pos; firstPointVec = networkData._markers[result].pos; return(result); }