예제 #1
0
    public void WalkingUpdate(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");
        GameObject t_hips = p_gameObject.transform.Find("Reference").Find("Hips").gameObject;

        Transform[] t_bones = t_hips.GetComponentsInChildren <Transform>();

        for (int i = 0; i < t_bones.Length; i++)
        {
            List <Quaternion> t_quatList = new List <Quaternion>();
            for (int j = 0; j < p_poses.Count; j++)
            {
                t_quatList.Add(p_poses[j][i]);
            }
            t_bones[i].rotation = SQUAD.SplineFromListLoop(t_quatList, p_transition);
        }
        //if (!p_headbob)
        //{
        //    if (p_transition < 0.25f)
        //    {
        //        t_bones[0].position = Vector3.Slerp(p_hipspos[0], p_hipspos[1],
        //            p_transition / 0.25f);
        //    }
        //
        //    else if (p_transition < 0.5f)
        //    {
        //        t_bones[0].position = Vector3.Slerp(p_hipspos[1], p_hipspos[2],
        //            (p_transition - 0.25f) / 0.25f);
        //        //print(poses[1][1].name + poses[1][1].transform.rotation.eulerAngles);
        //    }
        //    else if (p_transition < 0.75f)
        //    {
        //        t_bones[0].position = Vector3.Slerp(p_hipspos[2], p_hipspos[3],
        //            (p_transition - 0.5f) / 0.25f);
        //    }
        //    else if (p_transition < 1.0f)
        //    {
        //        t_bones[0].position = Vector3.Slerp(p_hipspos[3], p_hipspos[0],
        //            (p_transition - 0.75f) / 0.25f);
        //    }
        //}
        //else
        //{
        //    HeadbobUpdate(p_transition, p_gameObject);
        //}
        if (!p_headbob)
        {
            int   t_listSize = p_hipspos.Count;
            int   section    = (int)Mathf.Floor((t_listSize) * p_transition);
            float alongLine  = (t_listSize) * p_transition - section;
            if (section == t_listSize - 1)
            {
                t_bones[0].position = Vector3.Slerp(p_hipspos[section], p_hipspos[0], alongLine);
            }
            else
            {
                t_bones[0].position = Vector3.Slerp(p_hipspos[section], p_hipspos[section + 1], alongLine);
            }
        }
        else
        {
            HeadbobUpdate(p_transition, p_gameObject); //Vet inte om funkar! Har modifierat !p_headbob för att passa fler keyframes
        }
    }
예제 #2
0
    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);
    }