/// <summary> /// 1. Вычисляет смещения каждой следующей точки относительно предыдущей /// 2. Вызываем FillCoordinateForCurrentJoint /// </summary> /// <param name="root"></param> private static void GetHierachyOffset(HierarchyNode root) { var hierarchyEnumerator = root.GetEnumerator() as HierarchyEnumerator; HierarchyNode currentPoint = null; HierarchyNode parentForCurrentPoint = null; if (hierarchyEnumerator != null) { //сам энумератор дает корректных родителей () hierarchyEnumerator.MoveNext(); hierarchyEnumerator.MoveNext(); do { currentPoint = hierarchyEnumerator.Current; parentForCurrentPoint = hierarchyEnumerator.ParentForCurrentNode; SkeletonPoint point; if (parentForCurrentPoint.GetJointType == JointType.HipCenter) point = hierarchyEnumerator.ParentForCurrentNode.Point; else point = hierarchyEnumerator.ParentForCurrentNode.LastPointValue; //Делаем пересчет //currentPoint.Point = new SkeletonPoint() //{ // X = currentPoint.Point.X - point.X, // Y = currentPoint.Point.Y - point.Y, // Z = currentPoint.Point.Z - point.Z //}; currentPoint.Point = FillCoordinateForCurrentJoint(point, currentPoint.Point); } while (hierarchyEnumerator.MoveNext()); } }
/// <summary> /// 1. Вычисляет смещения каждой следующей точки относительно предыдущей /// 2. Вызываем FillCoordinateForCurrentJoint /// </summary> /// <param name="root"></param> private static void GetHierachyOffset(HierarchyNode root) { var hierarchyEnumerator = root.GetEnumerator() as HierarchyEnumerator; if (hierarchyEnumerator != null) { //сам энумератор дает корректных родителей () hierarchyEnumerator.MoveNext(); hierarchyEnumerator.MoveNext(); do { HierarchyNode currentPoint = hierarchyEnumerator.Current; //Пропускаем Корневой крест, иначе его сложит в линию по Y. Т.к. матриц поворота для него нет, то крест не развернется if (currentPoint.GetTypeNode() == ConstBodyPoints.LeftHip || currentPoint.GetTypeNode() == ConstBodyPoints.RightHip) continue; currentPoint.Point = FillCoordinateForCurrentJoint(hierarchyEnumerator.Current.Point); } while (hierarchyEnumerator.MoveNext()); } }
/// <summary> /// Печать одной строки координат - фрейма /// </summary> /// <param name="skelet"></param> /// <param name="root"></param> /// <param name="skelet2"></param> /// <returns></returns> private static string GetCoordinateFrame(Skeleton skelet, HierarchyNode root, Skeleton skelet2 = null) { string str = ""; var enumerator = root.GetEnumerator(); enumerator.Reset(); //Для рутовой точки получим позицию str += root.Point.PrintCoordinate(); do { if (enumerator.Current.GetTypeNode() == ConstBodyPoints.Site) continue; if (skelet2 != null) str +=MathHelper.GetElersAnglesZXY( BoneMapperBvhToKinect.GetBoneMatrixByBvhName(skelet, enumerator.Current), BoneMapperBvhToKinect.GetBoneMatrixByBvhName(skelet2, enumerator.Current)); else str +=MathHelper.GetElersAnglesZXY(BoneMapperBvhToKinect.GetBoneMatrixByBvhName(skelet, enumerator.Current)); } while (enumerator.MoveNext()); return (str += Environment.NewLine); }