public static void Validate(AnimData data)
 {
     if (data.jointAngles.Count >= 62)
     {
         data.jointAngles[0] = AxisAngleToUnityEuler(data.jointAngles[0]); // transit angle axis to euler
         for (int i = 1; i < data.jointAngles.Count; i++)
         {
             data.jointAngles[i] = AdamToUnityEuler(data.jointAngles[i]);
         }
         data.isValid = true;
     }
     else
     {
         Debug.Log("too short data length");
     }
 }
        //public List<Vector3> default_skeleton;

        public static AnimDataSet FromJsonData(string text)
        {
            AnimDataSet dataSet = new AnimDataSet();

            try
            {
                dataSet = JsonUtility.FromJson <AnimDataSet>(text);
                foreach (AnimData data in dataSet.dataList)
                {
                    AnimData.Validate(data);
                }
                dataSet.isValid = true;
            }
            catch (Exception err)
            {
                Debug.Log(err);
            }
            return(dataSet);
        }
 public void PushNewFrameData(AnimData animData, float frameTime)
 {
     if (animData != null)
     {
         frameData = animData;
         List <int> animUpdated = new List <int>();
         foreach (AnimUnitData unitData in frameData.units)
         {
             CharacterAnimController animController;
             if (!animControllers.TryGetValue(unitData.id, out animController)) // unit enter
             {
                 Debug.Log("unit enter: " + unitData.id);
                 if (HumanPrefab != null)
                 {
                     animController = Instantiate(HumanPrefab).GetComponent <CharacterAnimController>();
                     animControllers.Add(unitData.id, animController);
                 }
                 else
                 {
                     Debug.LogError("No human model");
                     return;
                 }
             }
             // unit update
             animController.PushNewUnitData(unitData, frameTime);
             animUpdated.Add(unitData.id);
         }
         List <int> toBeDeleted = new List <int>();
         foreach (var animController in animControllers)
         {
             if (!animUpdated.Contains(animController.Key)) // unit exit
             {
                 toBeDeleted.Add(animController.Key);
                 Debug.Log("unit exit: " + animController.Key);
             }
         }
         foreach (var d in toBeDeleted)
         {
             animControllers.Remove(d);
         }
     }
 }
 public static AnimData FromJsonData(string data)
 {
     if (!data.StartsWith("AnimData:"))
     {
         return(new AnimData());
     }
     else
     {
         string text = data.Substring(9); // get rid of "AnimData:"
         try
         {
             AnimData animData = JsonUtility.FromJson <AnimData>(text);
             Validate(animData);
             return(animData);
         }
         catch (Exception err)
         {
             Debug.Log(err.ToString());
             Debug.Log(text);
             return(new AnimData());
         }
     }
 }
Exemple #5
0
        // Update is called once per frame
        void Update()
        {
            switch (Controller.Mode)
            {
            case PlayMode.Stream:
            {
                // Update data
                if (StreamFrameController.DataNew)
                {
                    frameData = StreamFrameController.GetCurrentFrame();
                    //interpolateFrameRest = UDPReceiver.EstimatedRestFrameTime;
                    if (frameData.isValid)
                    {
                        // Calculate vertical stablization
                        if (AllowVerticalStablization)
                        {
                            UpdateModel(1f);         // set to next state
                            PushNewFeetHeights();    // calculate feet heights
                            if (IsVerticalStable() || GetLowestFeetHeight() < 0f)
                            {
                                HeightDiff -= GetLowestFeetHeight();
                            }
                            ChangeModelToLastSavedState();         // change the model state back
                        }
                        // New insert coroutine for new data
                        //if (AllowInterpolation)
                        {
                            StopCoroutine(InsertStepsCoroutine());
                            StartCoroutine(InsertStepsCoroutine());
                        }
                    }
                }
                // Update model every frame for interpolation

                /*if (AllowInterpolation)
                 * {
                 *  if (frameData.isValid)
                 *  {
                 *      UpdateModelAndFace(Time.deltaTime / interpolateFrameRest);
                 *  }
                 * }*/
            }
            break;

            case PlayMode.FileJson:
            {
                frameData = DataFrameController.GetCurrentFrame();
                bool newData = DataFrameController.RestFrameTime > interpolateFrameRest;
                interpolateFrameRest = DataFrameController.RestFrameTime;
                if (frameData.isValid)
                {
                    if (AllowVerticalStablization)
                    {
                        if (newData)                       // push new feet data
                        {
                            UpdateModel(1f);               // set to next state
                            PushNewFeetHeights();          // calculate feet heights
                            ChangeModelToLastSavedState(); // change the model state back
                        }

                        if (IsVerticalStable() || GetLowestFeetHeight() < 0f)
                        {
                            HeightDiff -= GetLowestFeetHeight();
                        }
                    }
                    if (AllowInterpolation)
                    {
                        UpdateModelAndFace(Time.deltaTime / interpolateFrameRest);
                    }
                    else
                    {
                        UpdateModelAndFace();
                    }
                }
            }
            break;

            case PlayMode.FileBvh:
            {
                frameData = DataFrameController.GetCurrentFrame();
                bool newData = DataFrameController.RestFrameTime > interpolateFrameRest;
                interpolateFrameRest = DataFrameController.RestFrameTime;
                if (frameData.isValid)
                {
                    if (AllowVerticalStablization)
                    {
                        if (newData)                       // push new feet data
                        {
                            UpdateModel(1f);               // set to next state
                            PushNewFeetHeights();          // calculate feet heights
                            ChangeModelToLastSavedState(); // change the model state back
                        }

                        if (IsVerticalStable() || GetLowestFeetHeight() < 0f)
                        {
                            HeightDiff -= GetLowestFeetHeight();
                        }
                    }
                    if (AllowInterpolation)
                    {
                        UpdateModel(Time.deltaTime / interpolateFrameRest);
                    }
                    else
                    {
                        UpdateModel();
                    }
                }
            }
            break;
            }
        }
Exemple #6
0
        // Transit BVH data struct to AnimDataSet
        public static AnimDataSet HierarchyToDataSet(BvhHierarchy hierarchy)
        {
            if (hierarchy.nodes.Count != indexMap.Length)
            {
                Debug.Log("Invalid node number: input " + hierarchy.nodes.Count + " indexMap " + indexMap.Length);
                return(new AnimDataSet());
            }
            AnimDataSet dataSet = new AnimDataSet();

            dataSet.frameTime = hierarchy.frameTime;
            // Loop each frame
            foreach (List <float> numbers in hierarchy.frames)
            {
                if (numbers.Count != hierarchy.channelNodes.Count)
                {
                    Debug.Log("Invalid number of numbers");
                    return(new AnimDataSet());
                }
                AnimData     data     = new AnimData();
                AnimUnitData unitData = new AnimUnitData();
                unitData.ResetJointAngles();
                unitData.id   = 1;
                unitData.size = 1f;
                // Loop each node
                for (int i = 0; i < hierarchy.nodes.Count; i++)
                {
                    int opIndex = indexMap[i];
                    if (opIndex < 0)
                    {
                        continue;
                    }
                    Vector3 pos = new Vector3();
                    Vector3 rot = new Vector3();
                    // Loop each channel
                    foreach (KeyValuePair <int, string> ch in hierarchy.nodes[i].channels)
                    {
                        float value = numbers[ch.Key];
                        switch (ch.Value)
                        {
                        case "Xposition": pos.x = value; break;

                        case "Yposition": pos.y = value; break;

                        case "Zposition": pos.z = value; break;

                        case "Xrotation": rot.x = value; break;

                        case "Yrotation": rot.y = value; break;

                        case "Zrotation": rot.z = value; break;

                        default: break;
                        }
                    }
                    if (opIndex == 0)
                    {
                        if (pos != new Vector3())
                        {
                            unitData.totalPosition = pos;
                        }
                        if (rot != new Vector3())
                        {
                            unitData.jointAngles[opIndex] = AnimUnitData.AdamToUnityEuler(rot);
                        }
                    }
                    else
                    {
                        if (rot != new Vector3())
                        {
                            unitData.jointAngles[opIndex] = AnimUnitData.AdamToUnityEuler(rot);
                        }
                    }
                }
                //data.jointAngles[0] += Vector3.left * 180f;
                data.units.Add(unitData);
                dataSet.dataList.Add(data);
            }
            //Debug.Log(dataSet.dataLis);
            return(dataSet);
        }
Exemple #7
0
        static IEnumerator SetReceiveTimeTo(AnimData data)
        {
            yield return(new WaitForEndOfFrame());

            data.receivedTime = Time.time;
        }