Exemple #1
0
 public State(MotionExporter exporter, MotionEditor editor, float t)
 {
     Root       = editor.GetCurrentFrame().GetRootTransformation(editor.Mirror);
     Posture    = editor.GetCurrentFrame().GetBoneTransformations(editor.Mirror);
     Velocities = editor.GetCurrentFrame().GetBoneVelocities(editor.Mirror);
     Trajectory = editor.GetCurrentFrame().GetTrajectory(editor.Mirror);
 }
Exemple #2
0
 public State(MotionExporter exporter, MotionEditor editor)
 {
     Timestamp  = editor.GetCurrentFrame().Timestamp;
     Root       = editor.GetCurrentFrame().GetRootTransformation(editor.Mirror);
     Posture    = editor.GetCurrentFrame().GetBoneTransformations(editor.Mirror);
     Velocities = editor.GetCurrentFrame().GetBoneVelocities(editor.Mirror);
     Trajectory = ((TrajectoryModule)editor.GetCurrentFile().Data.GetModule(Module.TYPE.Trajectory)).GetTrajectory(editor.GetCurrentFrame(), editor.Mirror);
 }
        public static void Export(MotionExporter exporter, Data X, Data Y, float tCurrent, float tNext)
        {
            Container current = new Container(exporter.Editor, tCurrent);
            Container next    = new Container(exporter.Editor, tNext);

            if (current.Frame.Index == next.Frame.Index)
            {
                Debug.LogError("Same frames for input output pairs selected!");
            }

            string[] styles = new string[] { "Stand", "Move", "Dribble", "Hold", "Shoot" };

            //Input
            //Control
            for (int k = 0; k < current.TimeSeries.Samples.Length; k++)
            {
                X.FeedXZ(next.RootSeries.GetPosition(k).GetRelativePositionTo(current.Root), "TrajectoryPosition" + (k + 1));
                X.FeedXZ(next.RootSeries.GetDirection(k).GetRelativeDirectionTo(current.Root), "TrajectoryDirection" + (k + 1));
                X.FeedXZ(next.RootSeries.GetVelocity(k).GetRelativeDirectionTo(current.Root), "TrajectoryVelocity" + (k + 1));
                X.Feed(next.DribbleSeries.Pivots[k].GetDirectionFromTo(next.RootSeries.Transformations[k], current.RootSeries.Transformations[k]), "DribblePivot" + (k + 1));
                X.Feed(next.DribbleSeries.Momentums[k].GetDirectionFromTo(next.RootSeries.Transformations[k], current.RootSeries.Transformations[k]), "DribbleMomentum" + (k + 1));
                X.Feed(next.StyleSeries.GetStyles(k, styles), "Style" + (k + 1) + "-");
            }

            //Auto-Regressive Posture
            for (int k = 0; k < current.ActorPosture.Length; k++)
            {
                X.Feed(current.ActorPosture[k].GetPosition().GetRelativePositionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Position");
                X.Feed(current.ActorPosture[k].GetForward().GetRelativeDirectionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Forward");
                X.Feed(current.ActorPosture[k].GetUp().GetRelativeDirectionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Up");
                X.Feed(current.ActorVelocities[k].GetRelativeDirectionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Velocity");
            }

            //Ball
            for (int k = 0; k <= current.TimeSeries.Pivot; k++)
            {
                X.Feed(current.DribbleSeries.GetControlWeight(k, current.RootSeries.Transformations[k].GetPosition()), "BallWeight" + (k + 1));
                X.Feed(current.DribbleSeries.GetWeightedBallPosition(k, current.RootSeries.Transformations[k].GetPosition()).GetRelativePositionTo(current.Root), "WeightedBallPosition" + (k + 1));
                X.Feed(current.DribbleSeries.GetWeightedBallVelocity(k, current.RootSeries.Transformations[k].GetPosition()).GetRelativeDirectionTo(current.Root), "WeightedBallVelocity" + (k + 1));
            }

            //Contacts
            for (int k = 0; k <= current.TimeSeries.Pivot; k++)
            {
                X.Feed(current.ContactSeries.GetContacts(k), "Contacts" + (k + 1) + "-");
            }

            //Rival
            for (int k = 0; k < current.TimeSeries.Samples.Length; k++)
            {
                X.Feed(current.DribbleSeries.GetInteractorWeight(k), "InteractorWeight" + (k + 1));
            }
            for (int k = 0; k < current.TimeSeries.Samples.Length; k++)
            {
                X.FeedXZ(current.DribbleSeries.GetInteractorGradient(k), "InteractorRootGradient" + (k + 1));
                X.FeedXZ(current.DribbleSeries.GetInteractorDirection(k), "InteractorRootDirection" + (k + 1));
                X.FeedXZ(current.DribbleSeries.GetInteractorVelocity(k), "InteractorRootVelocity" + (k + 1));
            }
            X.Feed(current.RivalBoneDistances, "InteractorBoneDistances");

            //Gating Variables
            {
                int index = 0;
                for (int k = 0; k < current.TimeSeries.Samples.Length; k++)
                {
                    for (int b = 0; b < current.PhaseSeries.Bones.Length; b++)
                    {
                        Vector2 phase = Utility.PhaseVector(current.PhaseSeries.Phases[k][b], current.PhaseSeries.Amplitudes[k][b]);
                        index += 1;
                        X.Feed(phase.x, "Gating" + index + "-Key" + (k + 1) + "-Bone" + current.PhaseSeries.Bones[b]);
                        index += 1;
                        X.Feed(phase.y, "Gating" + index + "-Key" + (k + 1) + "-Bone" + current.PhaseSeries.Bones[b]);
                    }
                }
            }

            //Output
            //Root Update
            Matrix4x4 delta = next.Root.GetRelativeTransformationTo(current.Root);

            Y.Feed(new Vector3(delta.GetPosition().x, Vector3.SignedAngle(Vector3.forward, delta.GetForward(), Vector3.up), delta.GetPosition().z), "RootUpdate");
            Y.FeedXZ(next.RootSeries.Velocities[next.TimeSeries.Pivot].GetRelativeDirectionTo(next.Root), "RootVelocity");
            Y.Feed(next.DribbleSeries.Pivots[next.TimeSeries.Pivot], "RootDribblePivot");
            Y.Feed(next.DribbleSeries.Momentums[next.TimeSeries.Pivot], "RootDribbleMomentum");
            Y.Feed(next.StyleSeries.GetStyles(next.TimeSeries.Pivot, styles), "RootStyle");

            //Control
            for (int k = next.TimeSeries.Pivot + 1; k < next.TimeSeries.Samples.Length; k++)
            {
                Y.FeedXZ(next.RootSeries.GetPosition(k).GetRelativePositionTo(next.Root), "TrajectoryPosition" + (k + 1));
                Y.FeedXZ(next.RootSeries.GetDirection(k).GetRelativeDirectionTo(next.Root), "TrajectoryDirection" + (k + 1));
                Y.FeedXZ(next.RootSeries.GetVelocity(k).GetRelativeDirectionTo(next.Root), "TrajectoryVelocity" + (k + 1));
                Y.Feed(next.DribbleSeries.Pivots[k], "DribblePivot" + (k + 1));
                Y.Feed(next.DribbleSeries.Momentums[k], "DribbleMomentum" + (k + 1));
                Y.Feed(next.StyleSeries.GetStyles(k, styles), "Style" + (k + 1) + "-");
            }

            //Auto-Regressive Posture
            for (int k = 0; k < next.ActorPosture.Length; k++)
            {
                Y.Feed(next.ActorPosture[k].GetPosition().GetRelativePositionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Position");
                Y.Feed(next.ActorPosture[k].GetForward().GetRelativeDirectionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Forward");
                Y.Feed(next.ActorPosture[k].GetUp().GetRelativeDirectionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Up");
                Y.Feed(next.ActorVelocities[k].GetRelativeDirectionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Velocity");
            }

            //Ball
            Y.Feed(next.DribbleSeries.GetControlWeight(next.TimeSeries.Pivot, next.Root.GetPosition()), "BallWeight");
            Y.Feed(next.DribbleSeries.GetWeightedBallPosition(next.TimeSeries.Pivot, next.Root.GetPosition()).GetRelativePositionTo(next.Root), "BallPosition");
            Y.Feed(next.DribbleSeries.GetWeightedBallVelocity(next.TimeSeries.Pivot, next.Root.GetPosition()).GetRelativeDirectionTo(next.Root), "BallVelocity");
            Quaternion rotationDelta = next.DribbleSeries.BallTransformations[next.TimeSeries.Pivot].GetRotation().GetRelativeRotationTo(current.DribbleSeries.BallTransformations[current.TimeSeries.Pivot]);

            Y.Feed(next.DribbleSeries.GetControlWeight(next.TimeSeries.Pivot, next.Root.GetPosition()) * rotationDelta.GetForward(), "BallForwardDelta");
            Y.Feed(next.DribbleSeries.GetControlWeight(next.TimeSeries.Pivot, next.Root.GetPosition()) * rotationDelta.GetUp(), "BallUpDelta");

            //Contacts
            for (int k = next.TimeSeries.Pivot; k <= next.TimeSeries.Pivot; k++)
            {
                Y.Feed(next.ContactSeries.GetContacts(k), "Contacts-");
            }

            //Phase Update
            for (int k = next.TimeSeries.Pivot; k < next.TimeSeries.Samples.Length; k++)
            {
                for (int b = 0; b < next.PhaseSeries.Bones.Length; b++)
                {
                    Y.Feed(Utility.PhaseVector(Utility.SignedPhaseUpdate(current.PhaseSeries.Phases[k][b], next.PhaseSeries.Phases[k][b]), next.PhaseSeries.Amplitudes[k][b]), "PhaseUpdate-" + (k + 1) + "-" + (b + 1));
                    Y.Feed(Utility.PhaseVector(next.PhaseSeries.Phases[k][b], next.PhaseSeries.Amplitudes[k][b]), "PhaseState-" + (k + 1) + "-" + (b + 1));
                }
            }
        }
        public static void Export(MotionExporter exporter, Data X, Data Y, float tCurrent, float tNext)
        {
            Container current = new Container(exporter.Editor, tCurrent);
            Container next    = new Container(exporter.Editor, tNext);

            if (current.Frame.Index == next.Frame.Index)
            {
                Debug.LogError("Same frames for input output pairs selected!");
            }

            string[] styles    = new string[] { "Idle", "Move", "Speed" };
            string[] contacts  = new string[] { "LeftHandSite", "RightHandSite", "LeftFootSite", "RightFootSite" };
            string[] alignment = new string[] { "LeftHandSite", "RightHandSite", "LeftFootSite", "RightFootSite" };

            //Input
            //Control
            for (int k = 0; k < current.TimeSeries.Samples.Length; k++)
            {
                X.FeedXZ(next.RootSeries.GetPosition(k).GetRelativePositionTo(current.Root), "TrajectoryPosition" + (k + 1));
                X.FeedXZ(next.RootSeries.GetDirection(k).GetRelativeDirectionTo(current.Root), "TrajectoryDirection" + (k + 1));
                X.FeedXZ(next.RootSeries.GetVelocity(k).GetRelativeDirectionTo(current.Root), "TrajectoryVelocity" + (k + 1));
                X.Feed(next.StyleSeries.GetStyles(k, styles), "Action" + (k + 1) + "-");
            }

            //Auto-Regressive Posture
            for (int k = 0; k < current.ActorPosture.Length; k++)
            {
                X.Feed(current.ActorPosture[k].GetPosition().GetRelativePositionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Position");
                X.Feed(current.ActorPosture[k].GetForward().GetRelativeDirectionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Forward");
                X.Feed(current.ActorPosture[k].GetUp().GetRelativeDirectionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Up");
                X.Feed(current.ActorVelocities[k].GetRelativeDirectionTo(current.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Velocity");
            }

            //Contacts
            for (int k = 0; k <= current.TimeSeries.Pivot; k++)
            {
                X.Feed(current.ContactSeries.GetContacts(k, contacts), "Contacts" + (k + 1) + "-");
            }

            //Gating Variables
            {
                int index = 0;
                for (int k = 0; k < current.TimeSeries.Samples.Length; k++)
                {
                    for (int b = 0; b < current.PhaseSeries.Bones.Length; b++)
                    {
                        if (alignment.Contains(current.PhaseSeries.Bones[b]))
                        {
                            Vector2 phase = Utility.PhaseVector(current.PhaseSeries.Phases[k][b], current.PhaseSeries.Amplitudes[k][b]);
                            index += 1;
                            X.Feed(phase.x, "Gating" + index + "-Key" + (k + 1) + "-Bone" + current.PhaseSeries.Bones[b]);
                            index += 1;
                            X.Feed(phase.y, "Gating" + index + "-Key" + (k + 1) + "-Bone" + current.PhaseSeries.Bones[b]);
                        }
                    }
                }
            }

            //Output
            //Root Update
            Matrix4x4 delta = next.Root.GetRelativeTransformationTo(current.Root);

            Y.Feed(new Vector3(delta.GetPosition().x, Vector3.SignedAngle(Vector3.forward, delta.GetForward(), Vector3.up), delta.GetPosition().z), "RootUpdate");
            Y.FeedXZ(next.RootSeries.Velocities[next.TimeSeries.Pivot].GetRelativeDirectionTo(next.Root), "RootVelocity");
            Y.Feed(next.StyleSeries.GetStyles(next.TimeSeries.Pivot, styles), "RootAction");

            //Control
            for (int k = next.TimeSeries.Pivot + 1; k < next.TimeSeries.Samples.Length; k++)
            {
                Y.FeedXZ(next.RootSeries.GetPosition(k).GetRelativePositionTo(next.Root), "TrajectoryPosition" + (k + 1));
                Y.FeedXZ(next.RootSeries.GetDirection(k).GetRelativeDirectionTo(next.Root), "TrajectoryDirection" + (k + 1));
                Y.FeedXZ(next.RootSeries.GetVelocity(k).GetRelativeDirectionTo(next.Root), "TrajectoryVelocity" + (k + 1));
                Y.Feed(next.StyleSeries.GetStyles(k, styles), "Action" + (k + 1) + "-");
            }

            //Auto-Regressive Posture
            for (int k = 0; k < next.ActorPosture.Length; k++)
            {
                Y.Feed(next.ActorPosture[k].GetPosition().GetRelativePositionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Position");
                Y.Feed(next.ActorPosture[k].GetForward().GetRelativeDirectionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Forward");
                Y.Feed(next.ActorPosture[k].GetUp().GetRelativeDirectionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Up");
                Y.Feed(next.ActorVelocities[k].GetRelativeDirectionTo(next.Root), "Bone" + (k + 1) + exporter.Editor.GetActor().Bones[k].GetName() + "Velocity");
            }

            //Contacts
            for (int k = next.TimeSeries.Pivot; k <= next.TimeSeries.Pivot; k++)
            {
                Y.Feed(next.ContactSeries.GetContacts(k, contacts), "Contacts-");
            }

            //Phase Update
            for (int k = next.TimeSeries.Pivot; k < next.TimeSeries.Samples.Length; k++)
            {
                for (int b = 0; b < next.PhaseSeries.Bones.Length; b++)
                {
                    if (alignment.Contains(current.PhaseSeries.Bones[b]))
                    {
                        Y.Feed(Utility.PhaseVector(Utility.SignedPhaseUpdate(current.PhaseSeries.Phases[k][b], next.PhaseSeries.Phases[k][b]), next.PhaseSeries.Amplitudes[k][b]), "PhaseUpdate-" + (k + 1) + "-" + (b + 1));
                        Y.Feed(Utility.PhaseVector(next.PhaseSeries.Phases[k][b], next.PhaseSeries.Amplitudes[k][b]), "PhaseState-" + (k + 1) + "-" + (b + 1));
                    }
                }
            }
        }
 private void Awake()
 {
     Target = (MotionExporter)target;
 }