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);
    }
Пример #2
0
    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;
        }
    }
Пример #4
0
    /*
     * 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);
    }