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])); }
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())); }
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)); } } }