bool IsEstimatedLocalTranslation() { BvhBone hip = null; foreach (var bone in bones) { if (bone.isHipBone) { hip = bone; } } if (hip == null) { return(true); // best estimate without a hip bone } var index = hip.frameOffset + 1; // Use hip 'y' to estimate the translation mode (local or "absolute") float sum = 0; for (var i = 0; i < nFrames; i++) { var data = frames[i]; sum += data[index]; } float average = sum / nFrames; float absScore = Mathf.Abs(hip.offset.y - average); // absolute will have average close to offset float locScore = Mathf.Abs(average); // lowest score wins return(locScore < absScore); }
BvhBone[] ReadHierarchy(string[] lines) { char[] delims = { ' ', '\t' }; var boneList = new List <BvhBone>(); BvhBone current = null; int frameOffset = 0; for (var i = 0; i < lines.Length; i++) { if (lines[i] == "MOTION") { break; } var parts = lines[i].Split(delims, System.StringSplitOptions.RemoveEmptyEntries); if (parts.Length >= 2 && (parts[0] == "JOINT" || parts[0] == "ROOT")) { current = new BvhBone(); current.name = parts[1]; current.offset = Vector3.zero; current.frameOffset = frameOffset; if (current.name == "hip") { current.isHipBone = true; } boneList.Add(current); } if (parts.Length >= 4 && parts[0] == "OFFSET" && current != null) { current.offset = new Vector3(-float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3])) * 0.01f; } if (parts.Length >= 2 && parts[0] == "CHANNELS" && current != null) { var nChannels = int.Parse(parts[1]); frameOffset += nChannels; // XXX: examples may exist that are not covered here (but I think they're rare) -- Found some! // We now support 6 channels with X,Y,Zpos in first 3 and any rotation order // Or 3 channels with any rotation order if (nChannels == 3) { current.hasPosition = false; current.hasRotation = true; current.rotationOrder = GetRotationOrder(parts[2], parts[3], parts[4]); } else if (nChannels == 6) { current.hasPosition = true; current.hasRotation = true; current.rotationOrder = GetRotationOrder(parts[5], parts[6], parts[7]); } else { SuperController.LogError(string.Format("Unexpect number of channels in BVH Hierarchy {1} {0}", nChannels, current.name)); } } if (parts.Length >= 2 && parts[0] == "End" && parts[1] == "Site") { current = null; } } return(boneList.ToArray()); }