static Quaternion PerformSQUADForceShortWay(Quaternion q2, Quaternion t1, Quaternion t2, Quaternion q3, float t) { float slerpT = 2.0f * t * (1.0f - t); Quaternion slerp1 = QuaternionExtensionsC.SlerpNoInvertForceShortWay(q2, q3, t); Quaternion slerp2 = QuaternionExtensionsC.SlerpNoInvertForceShortWay(t1, t2, t); return(QuaternionExtensionsC.SlerpNoInvertForceShortWay(slerp1, slerp2, slerpT)); }
public void IdleUpdate(float p_transition, float p_prevTrans, List <List <Quaternion> > p_poses, List <Vector3> p_hipspos, bool p_headbob, GameObject p_gameObject) { GameObject t_hips = GameObject.FindGameObjectWithTag("Bicubic"); Transform[] t_bones = t_hips.GetComponentsInChildren <Transform>(); List <List <Quaternion> > t_poses = new List <List <Quaternion> >(); List <Vector3> t_hipspos = new List <Vector3>(); //print(SQUAD.Spline(poses[0][1], poses[1][1], poses[2][1], poses[3][1], 0.0f).eulerAngles); //print(SQUAD.Spline(poses[0][1], poses[1][1], poses[2][1], poses[3][1], 1.0f).eulerAngles); float t_tempTransition = p_transition * 2; if (t_tempTransition > 1.0f) { t_tempTransition -= 1; } //if (p_transition < 0.1f && p_prevTrans > 0.9f) //{ // m_switch = !m_switch; //} if (p_transition > 1) { p_transition -= 1.0f; } if ((p_transition < 0.1f && p_prevTrans > 0.9f) || (p_transition > 0.25f && p_prevTrans < 0.25f) || (p_transition > 0.5f && p_prevTrans < 0.5f) || (p_transition > 0.75f && p_prevTrans < 0.75f)) { m_switch = !m_switch; } if (m_frames != 2) { //if ((p_transition < 0.1f && p_prevTrans > 0.9f) || (p_transition > 0.25f && p_prevTrans < 0.25f) || (p_transition > 0.5f && p_prevTrans < 0.5f) || (p_transition > 0.75f && p_prevTrans < 0.75f)) //{ // m_switch = !m_switch; //} p_transition = p_transition * 4.0f; if (p_transition > 1.0f) { p_transition -= 1; } if (p_transition > 1.0f) { p_transition -= 1; } if (p_transition > 1.0f) { p_transition -= 1; } if (p_transition > 1.0f) { p_transition -= 1; } } if (m_switch) { for (int i = 0; i < p_poses.Count; i++) { t_poses.Add(p_poses[p_poses.Count - 1 - i]); t_hipspos.Add(p_hipspos[p_hipspos.Count - 1 - i]); } } else { for (int i = 0; i < p_poses.Count; i++) { t_poses.Add(p_poses[i]); t_hipspos.Add(p_hipspos[i]); } } hipstest += 0.01f; //float mod = (hipstest % (Mathf.PI * 2)); //if (mod < 0.01f || mod > ((Mathf.PI *2) -0.01f)) //{ // yrand = Random.Range(0.5f, 1); // xrand = Random.Range(0.5f, 1); // zrand = Random.Range(0.5f, 1); //} //if (m_switch) //{ // hipstest -= 0.01f; //} //else //{ // hipstest += 0.01f; //} //if (hipstest < -1) //{ // m_switch = !m_switch; // hipstest = -1; //} //else if (hipstest > 1) //{ // m_switch = !m_switch; // hipstest = 1; //} //print(t_tempTransition + " "+p_transition); int poseListSize = p_poses.Count; if (m_frames != 2) { //print(m_frames + "inte 2"); List <Quaternion> t_qList = new List <Quaternion>(); //p_transition += 0.25f; //if (p_transition > 1) //{ // p_transition -= 1.0f; //} for (int i = 0; i < t_bones.Length; i++) { //print(t_bones[i].name + " " + i); //if (t_bones[i].name.Contains("RightHand")) //{ // // This really shouldnt work. But for some reason a mistake made it look good and now we don't wanna change it // if (t_tempTransition > 0.5f) // { // t_bones[i].rotation = QuaternionExtensionsC.SlerpNoInvertForceShortWay(p_poses[1][i], p_poses[0][i], t_tempTransition / 0.5f); // } // else // { // t_bones[i].rotation = QuaternionExtensionsC.SlerpNoInvertForceShortWay(p_poses[0][i], p_poses[1][i], (t_tempTransition - 0.5f) / 0.5f); // } // //t_bones[i].rotation = SQUAD.Spline(p_poses[0][i], p_poses[1][i], p_poses[0][i], p_poses[1][i], p_transition).quat; //} // else { for (int k = 0; k < poseListSize; k++) { t_qList.Add(t_poses[k][i]); } //print(t_qList.Count); //print(SQUAD.SplineMoreThanFivePoints(t_qList, p_transition).m_section); //SQUAD.Spline(p_poses[0][i], p_poses[1][i], p_poses[2][i], p_poses[3][i], p_transition).quat; t_bones[i].rotation = SQUAD.SplineMoreThanFivePoints(t_qList, p_transition).quat; //SQUAD.Spline(p_poses[0][i], p_poses[1][i], p_poses[2][i], p_poses[3][i], p_transition).quat; t_qList.Clear(); } } } if (m_frames == 2) { //p_transition += 0.5f; //if(p_transition>1) //{ // p_transition -= 1.0f; //} for (int i = 0; i < t_bones.Length; i++) { //print(t_bones[i].name + " " + i); if (t_bones[i].name.Contains("RightHand")) { // This really shouldnt work. But for some reason a mistake made it look good and now we don't wanna change it if (t_tempTransition > 0.5f) { t_bones[i].rotation = QuaternionExtensionsC.SlerpNoInvertForceShortWay(p_poses[poseListSize - 1][i], p_poses[0][i], t_tempTransition / 0.5f); } else { t_bones[i].rotation = QuaternionExtensionsC.SlerpNoInvertForceShortWay(p_poses[0][i], p_poses[poseListSize - 1][i], (t_tempTransition - 0.5f) / 0.5f); } //t_bones[i].rotation = SQUAD.Spline(p_poses[0][i], p_poses[1][i], p_poses[0][i], p_poses[1][i], p_transition).quat; } else { t_bones[i].rotation = SQUAD.Spline(p_poses[1][i], p_poses[0][i], p_poses[1][i], p_poses[0][i], p_transition).quat; } } } //t_bones[0].rotation = t_bones[0].rotation * Quaternion.AngleAxis(5 * Mathf.Sin(t_tempTransition*3.14f*2+(3.14f/2.0f)), new Vector3(0, 0, 1)); //t_bones[1].rotation = t_bones[1].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(t_tempTransition*3.14f*2+(3.14f/2.0f)), new Vector3(0, 0, 1)); //t_bones[5].rotation = t_bones[5].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(t_tempTransition*3.14f*2+(3.14f/2.0f)), new Vector3(0, 0, 1)); //t_bones[0].rotation = t_bones[0].rotation * Quaternion.AngleAxis(5 * Mathf.Sin(hipstest) * zrand, new Vector3(0, 0, 1)); //t_bones[1].rotation = t_bones[1].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest)* zrand, new Vector3(0, 0, 1)); //t_bones[5].rotation = t_bones[5].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest) * zrand, new Vector3(0, 0, 1)); //t_bones[0].rotation = t_bones[0].rotation * Quaternion.AngleAxis(5 * Mathf.Sin(hipstest) * yrand, new Vector3(0, 1, 0)); //t_bones[1].rotation = t_bones[1].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest) * yrand, new Vector3(0, 1,0)); //t_bones[5].rotation = t_bones[5].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest) * yrand, new Vector3(0, 1 ,0)); //t_bones[0].rotation = t_bones[0].rotation * Quaternion.AngleAxis(5 * Mathf.Sin(hipstest) * xrand, new Vector3(1, 0, 0)); //t_bones[1].rotation = t_bones[1].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest) * xrand, new Vector3(1, 0, 0)); //t_bones[5].rotation = t_bones[5].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest) * xrand, new Vector3(1, 0, 0)); //t_bones[0].rotation = QuaternionExtensionsC.Add(t_bones[0].rotation, Quaternion.AngleAxis(20 * hipstest, new Vector3(0, 0, 1))); /// added skön effekt //t_bones[0].rotation = t_bones[0].rotation * Quaternion.AngleAxis(5 * Mathf.Sin(hipstest), new Vector3(0, 0, 1)); //t_bones[1].rotation = t_bones[1].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest), new Vector3(0, 0, 1)); //t_bones[5].rotation = t_bones[5].rotation * Quaternion.AngleAxis(-5 * Mathf.Sin(hipstest), new Vector3(0, 0, 1)); //m_prevTransition = p_transition; if (m_frames == 4 || m_frames == 3) { //int section = (int)Mathf.Floor((t_hipspos.Count) * p_transition); //float alongLine = (t_hipspos.Count) * p_transition - section; int section = (int)Mathf.Floor((t_hipspos.Count - 1) * p_transition); float alongLine = (t_hipspos.Count - 1) * p_transition - section; if (section == t_hipspos.Count - 1) { //t_bones[0].position = CubicInterp(p_hipspos[section-1], p_hipspos[section], p_hipspos[section+1], p_hipspos[section], alongLine); print("Derpderp Idle fail inne i en konstig seciton"); //t_bones[0].position = Vector3.Slerp(p_hipspos[section], p_hipspos[0], alongLine); // OM vi skippar cubic kolla över denna kan vara fel } else if (section == 0) { t_bones[0].position = CubicInterp(t_hipspos[section + 1], t_hipspos[section], t_hipspos[section + 1], t_hipspos[section + 2], alongLine); } else if (section == t_hipspos.Count - 2) { t_bones[0].position = CubicInterp(t_hipspos[section - 1], t_hipspos[section], t_hipspos[section + 1], t_hipspos[section], alongLine); } else { t_bones[0].position = CubicInterp(t_hipspos[section - 1], t_hipspos[section], t_hipspos[section + 1], t_hipspos[section + 2], alongLine); //t_bones[0].position = Vector3.Slerp(p_hipspos[section], p_hipspos[section + 1], alongLine); } //t_bones[0].position = new Vector3(, t_bones[0].position.y, t_bones[0].position.z); } else { //int section = (int)Mathf.Floor((p_hipspos.Count-1) * p_transition); //float alongLine = (p_hipspos.Count-1) * p_transition - section; int section = (int)Mathf.Floor((p_hipspos.Count - 1) * t_tempTransition); float alongLine = (p_hipspos.Count - 1) * t_tempTransition - section; //if (section == t_hipspos.Count - 1) //{ // t_bones[0].position = Vector3.Slerp(t_hipspos[section], t_hipspos[section-1], alongLine); //} //t_bones[0].position = CubicInterp(p_hipspos[1], p_hipspos[0], p_hipspos[1], p_hipspos[0], alongLine); t_bones[0].position = Vector3.Slerp(t_hipspos[section], t_hipspos[section + 1], alongLine); } t_bones[0].position = new Vector3(t_bones[0].position.x, t_bones[0].position.y, 0); }