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()); } } }
// 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; } }
// 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); }
static IEnumerator SetReceiveTimeTo(AnimData data) { yield return(new WaitForEndOfFrame()); data.receivedTime = Time.time; }