Esempio n. 1
0
    public Vector3 GetInteractorGradient(int index)
    {
        if (GetInteractorDistance(index) == GetInteractionRadius())
        {
            return(Vector3.zero);
        }
        float distance        = Mathf.Min(GetInteractorDistance(index), GetInteractionRadius());
        float inverseDistance = GetInteractionRadius() - distance;

        return(inverseDistance * RivalRoot.GetPosition(index).GetRelativePositionTo(ActorRoot.Transformations[index]));
    }
Esempio n. 2
0
 private float GetInteractorDistance(int index)
 {
     if (Rival == null || RivalRoot == null)
     {
         return(GetInteractionRadius());
     }
     return(Mathf.Clamp(Vector3.Distance(ActorRoot.GetPosition(index).ZeroY(), RivalRoot.GetPosition(index).ZeroY()), 0f, GetInteractionRadius()));
 }
Esempio n. 3
0
    protected override void Feed()
    {
        //User Input Control
        Control();

        //Get Root
        Matrix4x4 root = Actor.GetRoot().GetWorldMatrix(true);

        //Input Timeseries
        for (int i = 0; i < TimeSeries.KeyCount; i++)
        {
            int index = TimeSeries.GetKey(i).Index;
            NeuralNetwork.FeedXZ(RootSeries.GetPosition(index).GetRelativePositionTo(root));
            NeuralNetwork.FeedXZ(RootSeries.GetDirection(index).GetRelativeDirectionTo(root));
            NeuralNetwork.FeedXZ(RootSeries.Velocities[index].GetRelativeDirectionTo(root));
            NeuralNetwork.Feed(StyleSeries.Values[index]);
        }

        //Input Character
        for (int i = 0; i < Actor.Bones.Length; i++)
        {
            NeuralNetwork.Feed(Actor.Bones[i].Transform.position.GetRelativePositionTo(root));
            NeuralNetwork.Feed(Actor.Bones[i].Transform.forward.GetRelativeDirectionTo(root));
            NeuralNetwork.Feed(Actor.Bones[i].Transform.up.GetRelativeDirectionTo(root));
            NeuralNetwork.Feed(Actor.Bones[i].Velocity.GetRelativeDirectionTo(root));
        }

        //Input Contacts
        for (int i = 0; i <= TimeSeries.PivotKey; i++)
        {
            int index = TimeSeries.GetKey(i).Index;
            NeuralNetwork.Feed(ContactSeries.Values[index]);
        }

        //Input Gating Features
        NeuralNetwork.Feed(PhaseSeries.GetAlignment());
    }
    protected override void Feed()
    {
        //User Input Control
        Control();

        //Get Root
        Matrix4x4 root = Actor.GetRoot().GetWorldMatrix(true);

        //Input Timeseries
        for (int i = 0; i < TimeSeries.KeyCount; i++)
        {
            int index = TimeSeries.GetKey(i).Index;
            NeuralNetwork.FeedXZ(RootSeries.GetPosition(index).GetRelativePositionTo(root));
            NeuralNetwork.FeedXZ(RootSeries.GetDirection(index).GetRelativeDirectionTo(root));
            NeuralNetwork.FeedXZ(RootSeries.Velocities[index].GetRelativeDirectionTo(root));

            NeuralNetwork.Feed(DribbleSeries.Pivots[index]);
            NeuralNetwork.Feed(DribbleSeries.Momentums[index]);

            NeuralNetwork.Feed(StyleSeries.Values[index]);
        }

        //Input Character
        for (int i = 0; i < Actor.Bones.Length; i++)
        {
            NeuralNetwork.Feed(Actor.Bones[i].Transform.position.GetRelativePositionTo(root));
            NeuralNetwork.Feed(Actor.Bones[i].Transform.forward.GetRelativeDirectionTo(root));
            NeuralNetwork.Feed(Actor.Bones[i].Transform.up.GetRelativeDirectionTo(root));
            NeuralNetwork.Feed(Actor.Bones[i].Velocity.GetRelativeDirectionTo(root));
        }

        //Input Ball
        for (int i = 0; i <= TimeSeries.PivotKey; i++)
        {
            int index = TimeSeries.GetKey(i).Index;
            NeuralNetwork.Feed(DribbleSeries.GetControlWeight(index, root.GetPosition()));
            NeuralNetwork.Feed(DribbleSeries.GetWeightedBallPosition(index, root.GetPosition()).GetRelativePositionTo(root));
            NeuralNetwork.Feed(DribbleSeries.GetWeightedBallVelocity(index, root.GetPosition()).GetRelativeDirectionTo(root));
        }

        //Input Contacts
        for (int i = 0; i <= TimeSeries.PivotKey; i++)
        {
            int index = TimeSeries.GetKey(i).Index;
            NeuralNetwork.Feed(ContactSeries.Values[index]);
        }

        //Input Rival
        //Not included in this demo. If you want to use it, you will need to create a second player and pass its reference to the DribbleSeries contructor in the Setup function.
        for (int i = 0; i < TimeSeries.KeyCount; i++)
        {
            NeuralNetwork.Feed(DribbleSeries.GetInteractorWeight(i));
        }
        for (int i = 0; i < TimeSeries.KeyCount; i++)
        {
            NeuralNetwork.FeedXZ(DribbleSeries.GetInteractorGradient(i));
            NeuralNetwork.FeedXZ(DribbleSeries.GetInteractorDirection(i));
            NeuralNetwork.FeedXZ(DribbleSeries.GetInteractorVelocity(i));
        }
        for (int i = 0; i < Actor.Bones.Length; i++)
        {
            NeuralNetwork.Feed(DribbleSeries.GetInteractorBoneDistance(i));
        }

        //Input Gating Features
        NeuralNetwork.Feed(PhaseSeries.GetAlignment());

        //Generative Controller
        if (GenerativeControl)
        {
            for (int i = 0; i < GenerativeModel.GetOutputDimensionality(); i++)
            {
                GenerativeModel.SetInput(i, NeuralNetwork.GetInput(i));
            }
            GenerativeModel.Predict();
            for (int i = 0; i < GenerativeModel.GetOutputDimensionality(); i++)
            {
                NeuralNetwork.SetInput(i, GenerativeModel.GetOutput(i));
            }
        }
    }