private static DancePose createPoseFromBvhPose(BvhNode skeleton, double[] bvhPose, string[] bones) { Dictionary <string, BoneState> items = new Dictionary <string, BoneState>(); int num = 0; foreach (BvhNode current in skeleton.GetAllNodesRecursively()) { Angle x = Angle.Deg000; Angle y = Angle.Deg000; Angle z = Angle.Deg000; BvhChannels[] channels = current.Channels; for (int i = 0; i < channels.Length; i++) { switch (channels[i]) { case BvhChannels.Xrotation: x = -Angle.FromDegree(bvhPose[num]); break; case BvhChannels.Yrotation: y = -Angle.FromDegree(bvhPose[num]); break; case BvhChannels.Zrotation: z = Angle.FromDegree(bvhPose[num]); break; } num++; } BoneState value = new BoneState(x, y, z); if (current.Name.Equals("Hips")) { value.Rotate = new CtQuaternion(new CtVector3D(0f, 1f, 0f), 3.1415926535897931) * value.Rotate; } items[current.Name] = value; } return(new DancePose(bones, Array.ConvertAll <string, BoneState>(bones, delegate(string name) { if (!items.ContainsKey(name)) { return BoneState.Zero; } return items[name]; }))); }
public static BvhMotion Import(TextReader reader) { BvhNode root = null; if (reader.ReadLine().Trim() == "HIERARCHY") { string[] array = reader.ReadLine().Trim().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (array[0] == "ROOT") { root = BvhFormat.ReadNode(array[1], reader); } } if (reader.ReadLine().Trim() == "MOTION") { int num = int.Parse(reader.ReadLine().Split(new char[] { ':' })[1].Trim()); double spf = double.Parse(reader.ReadLine().Split(new char[] { ':' })[1].Trim()); double[][] array2 = new double[num][]; for (int i = 0; i < array2.Length; i++) { array2[i] = ( from token in reader.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries) select double.Parse(token)).ToArray <double>(); } return(new BvhMotion(root, spf, array2)); } return(null); }
public BvhMotion(BvhNode root, double spf, double[][] poses) { this.RootNode = root; this.SecondsPerFrame = spf; this._poses = poses; }