private void ParseLine(int index) { var line = fileLines[index]; if (String.IsNullOrWhiteSpace(line)) { return; } var lineSplit = line.Split(','); Assert.AreEqual(numberOfColumns, lineSplit.Length, $"Line does not contain {numberOfColumns} columns... It is line #{index}: \n {line}"); var timeString = lineSplit[0]; var time = CheckForDotAndParse(timeString); var frame = new AnimationFrame { Time = time, JointPoints = new List <AnimationJointPoint>() }; foreach (var nameIndex in namesToHeader) { var jointPoint = new AnimationJointPoint(); jointPoint.Name = nameIndex.Key; ParseJointPoint(lineSplit, nameIndex.Value, ref jointPoint); frame.JointPoints.Add(jointPoint); } Frames.Add(frame); }
private MotionJointPoint MakeMotionJoint(AnimationJointPoint current, AnimationJointPoint last) { var motionJointPoint = new MotionJointPoint { LocalPosition = current.Position, LocalRotation = current.Rotation, Rotation = current.Rotation, Name = current.Name, Position = current.Position, Velocity = current.Position - last.Position }; return(motionJointPoint); }
private void ParseJointPoint(string[] lineSplit, int jointIndex, ref AnimationJointPoint jointPoint) { var pxString = lineSplit[jointIndex]; var pyString = lineSplit[jointIndex + 1]; var pzString = lineSplit[jointIndex + 2]; var rxString = lineSplit[jointIndex + 3]; var ryString = lineSplit[jointIndex + 4]; var rzString = lineSplit[jointIndex + 5]; var rwString = lineSplit[jointIndex + 6]; var px = CheckForDotAndParse(pxString); var py = CheckForDotAndParse(pyString); var pz = CheckForDotAndParse(pzString); var rx = CheckForDotAndParse(rxString); var ry = CheckForDotAndParse(ryString); var rz = CheckForDotAndParse(rzString); var rw = CheckForDotAndParse(rwString); /* * Assert.AreEqual(pxString, px.ToString()); * Assert.AreEqual(pyString, py.ToString()); * Assert.AreEqual(pzString, pz.ToString()); * Assert.AreEqual(rxString, rx.ToString()); * Assert.AreEqual(ryString, ry.ToString()); * Assert.AreEqual(rzString, rz.ToString()); * Assert.AreEqual(rwString, rw.ToString()); */ jointPoint.Position = new Vector3(px, py, pz); jointPoint.Rotation = new Quaternion(rx, ry, rz, rw); if (Frames.Count < 1) { jointPoint.BaseRotation = jointPoint.Rotation; } else { var firstFrame = Frames[0]; var jpName = jointPoint.Name; var baseJoint = firstFrame.JointPoints.First(x => x.Name.Equals(jpName)); jointPoint.BaseRotation = baseJoint.Rotation; } }
/* * private MotionFrame GetBakedMotionFrame(string motionName, float normalizedTime, MotionClipType clipType) * { * for (int i = 0; i < MotionClips.Count; i++) { * var clip = MotionClips[i]; * * if (clipType != null) { * if (clipType == clip.ClipType) { * return clip.MotionFrames[0]; * } * } else if (clip.Name.Equals(motionName)) { * int frameBasedOnTime = Mathf.FloorToInt(clip.MotionFrames.Length * normalizedTime); * * return clip.MotionFrames[frameBasedOnTime]; * } * } * * return null; * } */ public void ExtractMotionClips(AnimClip animationClip) { var motionClip = new MotionClipData(); motionClip.Name = animationClip.name; //motionClip.MotionClipLengthInMilliseconds = animationClip.ClipLengthInMilliseconds; //no value for animationClip.ClipLengthInMilliseconds motionClip.ClipType = animationClip.ClipType; motionClip.MotionFrames = new MotionFrame[animationClip.Frames.Count - 10]; // The very first frame var firstMotionFrame = new MotionFrame(); var firstFrame = animationClip.Frames[0]; var stubAnimationjointPoint = new AnimationJointPoint { Position = Vector3.zero }; firstMotionFrame.Joints = (from jp in firstFrame.JointPoints select MakeMotionJoint(jp, stubAnimationjointPoint)).ToArray(); foreach (var jt in firstMotionFrame.Joints) { jt.BaseRotation = jt.Rotation; } var rootMotionJoint = firstMotionFrame.Joints.First(x => x.Name.Equals(RootName)); firstMotionFrame.AngularVelocity = Vector3.Angle(Vector3.forward, rootMotionJoint.Velocity) / 180f; firstMotionFrame.Velocity = rootMotionJoint.Velocity.sqrMagnitude; firstMotionFrame.Direction = rootMotionJoint.Velocity.normalized; firstMotionFrame.Time = firstFrame.Time; GetClipTrajectoryData(firstMotionFrame); //motionClip.MotionFrames[0] = firstMotionFrame; // All the other ones for (int i = 10; i < animationClip.Frames.Count; i++) { var frame = animationClip.Frames[i]; var lastFrame = animationClip.Frames[i - 1]; var motionFrame = new MotionFrame(); motionFrame.Time = frame.Time; var joints = (from jp in frame.JointPoints from jp2 in lastFrame.JointPoints where jp.Name.Equals(jp2.Name) select MakeMotionJoint(jp, jp2)).ToArray(); foreach (var jt in joints) { var firstJt = firstMotionFrame.Joints.First(x => x.Name.Equals(jt.Name)); jt.BaseRotation = firstJt.Rotation; } motionFrame.Joints = joints; var root = joints.First(x => x.Name.Equals(RootName)); motionFrame.AngularVelocity = Vector3.Angle(Vector3.forward, root.Velocity) / 180f; motionFrame.Velocity = root.Velocity.sqrMagnitude; motionFrame.Direction = root.Velocity.normalized; GetClipTrajectoryData(motionFrame); motionClip.MotionFrames[i - 10] = motionFrame; } motionClip.MotionClipLengthInMilliseconds = animationClip.Frames.Last().Time; MotionClips.Add(motionClip); }