public AngleBasedHandModel createRandomFromSavedMorph() { TrainingUnit first = PostureDataHandler.instance.getRand(); TrainingUnit second; do { second = PostureDataHandler.instance.getRand(); }while(first.posture == second.posture); AngleBasedHandModel temp1 = first.hand; AngleBasedHandModel temp2 = second.hand; AngleBasedHandModel result = new AngleBasedHandModel(); for (int i = 0; i < result.fingers.Length; i++) { result.fingers [i] = AngleBasedFingerModel.Lerp(temp1.fingers[i], temp2.fingers[i], ((float)i) / ((float)result.fingers.Length)); } //Debug.Log ("First: "+first.posture+", Second: "+second.posture); temp1 = PostureDataHandler.instance.getRand().hand; result.thumb = temp1.thumb; return(result); }
public AngleBasedHandModel createRandomRandom() { AngleBasedHandModel result = new AngleBasedHandModel(); float random = Mathf.Pow(Random.value, 2.0f); result.fingers[(int)AngleBasedHandModel.FingerName.index].mcp = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), random * abduct_index, 0); result.fingers[(int)AngleBasedHandModel.FingerName.middle].mcp = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), 0, 0); result.fingers[(int)AngleBasedHandModel.FingerName.ring].mcp = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), random * abduct_ring, 0); result.fingers[(int)AngleBasedHandModel.FingerName.pinky].mcp = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), random * abduct_pinky, 0); for (int i = 0; i < result.fingers.Length; i++) { AngleBasedFingerModel finger = result.fingers[i]; random = Random.value; finger.jointAngles[(int)AngleBasedFingerModel.Fingerjoints.DIP] = DIP_min + random * (DIP_max - DIP_min); finger.jointAngles[(int)AngleBasedFingerModel.Fingerjoints.PIP] = PIP_min + random * (PIP_max - PIP_min); } random = Random.value; result.thumb.tmc = Quaternion.Lerp(PostureDataHandler.instance.getRand().hand.thumb.tmc, Quaternion.Euler(Random.Range(XTMC_min, XTMC_max), Random.Range(YTMC_min, YTMC_max), Random.Range(ZTMC_min, ZTMC_max)), 0.5f); result.thumb.jointAngles[(int)AngleBasedThumbModel.Fingerjoints.IP] = IP_min + random * (IP_max - IP_min); result.thumb.jointAngles[(int)AngleBasedThumbModel.Fingerjoints.MP] = MP_min + random * (MP_max - MP_min); result.rotation = Quaternion.identity; result.position = Vector3.zero; return(result); }
public AngleBasedHandModel() { rotation = new sQuaternion(); position = new sVector3(0, 0, 0); thumb = new AngleBasedThumbModel(); for (int i = 0; i < fingers.Length; i++) { fingers[i] = new AngleBasedFingerModel(); } }
public AngleBasedHandModel createRandomProcedural() { AngleBasedHandModel result = new AngleBasedHandModel(); FingerState[] fingers = new FingerState[result.fingers.Length]; for (int i = 0; i < fingers.Length; i++) { fingers [i] = (FingerState)Random.Range(0, System.Enum.GetNames(typeof(FingerState)).Length); } //abduction float random = Mathf.Pow(Random.value, 2.0f); float[] abductions = { random *abduct_index, 0, random *abduct_ring, random *abduct_pinky }; for (int i = 0; i < result.fingers.Length; i++) { float xmcp = 0; if (fingers [i] == FingerState.ForwardFist || fingers [i] == FingerState.Flat) { xmcp = 0; } if (fingers [i] == FingerState.Fist) { xmcp = XMCP_max; } if (fingers [i] == FingerState.HyperExtended) { xmcp = XMCP_min; } result.fingers [i].mcp = Quaternion.Euler(xmcp, abductions[i], 0); AngleBasedFingerModel finger = result.fingers[i]; if (fingers [i] == FingerState.HyperExtended || fingers [i] == FingerState.Flat) { finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.DIP] = DIP_min; finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.PIP] = PIP_min; } if (fingers [i] == FingerState.Fist || fingers [i] == FingerState.ForwardFist) { finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.DIP] = DIP_max; finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.PIP] = PIP_max; } } ThumbState thumb = (ThumbState)Random.Range(0, System.Enum.GetNames(typeof(ThumbState)).Length); result.thumb = PostureDataHandler.instance.getRand().hand.thumb; result.rotation = Quaternion.identity; result.position = Vector3.zero; result = AngleBasedHandModel.Lerp(result, PostureDataHandler.instance.getRand(TrainingUnit.Posture.idle).hand, 0.2f); return(result); }
public float euclidianDistance(AngleBasedFingerModel other) { float result = 0; for (int i = 0; i < jointAngles.Length - 2; i++) { result += Mathf.Pow(jointAngles [i] - other.jointAngles [i], 2.0f); } result += Mathf.Pow(Quaternion.Angle(other.mcp, mcp), 2.0f); return(Mathf.Sqrt(result)); }
public static AngleBasedFingerModel Lerp(AngleBasedFingerModel first, AngleBasedFingerModel second, float t) { AngleBasedFingerModel result = new AngleBasedFingerModel(); t = Mathf.Clamp(t, 0, 1); result.mcp = Quaternion.Lerp(first.mcp, second.mcp, t); for (int i = 0; i < result.jointAngles.Length; i++) { result.jointAngles [i] = Mathf.Lerp(first.jointAngles [i], second.jointAngles [i], t); } return(result); }
public static string getCSVHeader(string endl, string handname) { string result = ""; result += AngleBasedThumbModel.getCSVHeader(endl, handname + "Thumb") + endl; for (int i = 0; i < System.Enum.GetNames(typeof(FingerName)).Length; i++) { result += AngleBasedFingerModel.getCSVHeader(endl, handname + System.Enum.GetNames(typeof(FingerName))[i]) + endl; } result += sQuaternion.getCSVHeader(endl, handname + "Rot") + endl; result += sVector3.getCSVHeader(endl, handname + "Pos"); return(result); }
public static AngleBasedHandModel Lerp(AngleBasedHandModel first, AngleBasedHandModel second, float t) { AngleBasedHandModel result = new AngleBasedHandModel(); t = Mathf.Clamp(t, 0, 1); result.rotation = Quaternion.Lerp(first.rotation, second.rotation, t); result.position = Vector3.Lerp(first.position, second.position, t); for (int i = 0; i < result.fingers.Length; i++) { result.fingers [i] = AngleBasedFingerModel.Lerp(first.fingers [i], second.fingers [i], t); } result.thumb = AngleBasedThumbModel.Lerp(first.thumb, second.thumb, t); return(result); }