From 244f1d34216e3e90cd77ec1d5c6110a6cf1bed7f Mon Sep 17 00:00:00 2001 From: nollet <nollet> Date: Wed, 18 May 2022 17:41:40 +0200 Subject: [PATCH] =?UTF-8?q?fin=20J3=20(gestion=20Bord=20+=20Reynolds=20OK?= =?UTF-8?q?=20avec=20Comportement=20Composite)=20(mais=20comptes=20rendus?= =?UTF-8?q?=20encore=20=C3=A0=20r=C3=A9diger...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Scripts/Agent.cs | 11 ++--- src/Scripts/Comportement/Aleatoire.cs | 3 +- src/Scripts/Comportement/Bord.cs | 40 ++++++++++++++++ src/Scripts/Comportement/Comportement.cs | 8 +--- src/Scripts/Comportement/CompositeSeq.cs | 33 ++++++++++++++ src/Scripts/Comportement/Paper.cs | 13 ++++++ src/Scripts/Comportement/Player.cs | 12 +++++ src/Scripts/Comportement/Predator.cs | 13 ++++++ src/Scripts/Comportement/Prey.cs | 13 ++++++ src/Scripts/Comportement/Reynolds.cs | 10 ++-- src/Scripts/Environnement/Cube.cs | 53 ++++++++++++++++++++++ src/Scripts/Environnement/Environnement.cs | 46 +++++-------------- src/Scripts/Environnement/Topologie.cs | 16 +++++++ src/Scripts/Perception/Perception.cs | 11 ----- src/Scripts/Perception/Perception180.cs | 8 ++++ src/Scripts/Perception/Perception360.cs | 11 ----- src/Scripts/Perception/Perception90.cs | 8 ++++ src/Scripts/SMA.cs | 7 +-- src/Scripts/Utils.cs | 22 --------- 19 files changed, 233 insertions(+), 105 deletions(-) create mode 100755 src/Scripts/Comportement/Bord.cs create mode 100755 src/Scripts/Comportement/CompositeSeq.cs create mode 100755 src/Scripts/Comportement/Paper.cs create mode 100755 src/Scripts/Comportement/Player.cs create mode 100755 src/Scripts/Comportement/Predator.cs create mode 100755 src/Scripts/Comportement/Prey.cs create mode 100755 src/Scripts/Environnement/Cube.cs create mode 100755 src/Scripts/Environnement/Topologie.cs create mode 100755 src/Scripts/Perception/Perception180.cs create mode 100755 src/Scripts/Perception/Perception90.cs diff --git a/src/Scripts/Agent.cs b/src/Scripts/Agent.cs index f77a515..241c4b5 100755 --- a/src/Scripts/Agent.cs +++ b/src/Scripts/Agent.cs @@ -20,14 +20,13 @@ public class Agent : MonoBehaviour, Visible void Start() { system = GameObject.Find("SMA").GetComponent<SMA>(); - comportement = new Reynolds(this); - perception = new Perception360(this, 15); - //perception = new Perception(this,20.0f,180.0f); - direction = Utils.randomDirection(); - //speed = UnityEngine.Random.Range(0.8f,1.2f); + //comportement = new Reynolds(this); + List<Comportement> c = new List<Comportement> { new Reynolds(this), new Bord(this)}; + comportement = new CompositeSeq(this,c); + perception = new Perception180(this,20.0f); + direction = Vector3.zero; speed = 0.7f; oldDirections = new List<Vector3>(); - oldDirections.Add(direction); } // Update is called once per frame diff --git a/src/Scripts/Comportement/Aleatoire.cs b/src/Scripts/Comportement/Aleatoire.cs index aa34982..782a799 100755 --- a/src/Scripts/Comportement/Aleatoire.cs +++ b/src/Scripts/Comportement/Aleatoire.cs @@ -8,8 +8,7 @@ public class Aleatoire : Comportement public Aleatoire(Agent proprietaire) : base(proprietaire) {} public override Vector3 reagir(List<Observation> observation) { - //int bruit = UnityEngine.Random.Range(1,5); - return proprietaire.oldDirections[0].normalized; + return Utils.randomDirection(); } } diff --git a/src/Scripts/Comportement/Bord.cs b/src/Scripts/Comportement/Bord.cs new file mode 100755 index 0000000..211ab3b --- /dev/null +++ b/src/Scripts/Comportement/Bord.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Bord : Comportement +{ + static public float Urgent = 3.0f; + static public float Preoccuppant = 5.0f; + static public float Intrigant = 8.0f; + + public Bord(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + List<Vector3> vectors = new List<Vector3>(); + vectors.Add(proprietaire.direction); + foreach(Observation o in observation) { + if (!o.objet.isAlive()) { + if(grandDanger(o)) for(int i=0;i<3;i++) vectors.Add(fuir(o.distance)); + else if(moyenDanger(o)) for(int i=0;i<2;i++) vectors.Add(fuir(o.distance)); + else if(petitDanger(o)) vectors.Add(fuir(o.distance)); + } + } + Vector3 res = Utils.meanVector(vectors); + return Utils.noiseVector(res,nbBruit,bruit); + } + + private bool grandDanger(Observation o) { + return (Utils.normVector(o.distance) < Urgent); + } + + private bool moyenDanger(Observation o) { + return (Utils.normVector(o.distance) < Preoccuppant); + } + + private bool petitDanger(Observation o) { + return (Utils.normVector(o.distance) < Intrigant); + } + + private Vector3 fuir(Vector3 d) { return -d.normalized; } +} diff --git a/src/Scripts/Comportement/Comportement.cs b/src/Scripts/Comportement/Comportement.cs index c1728d8..580374a 100755 --- a/src/Scripts/Comportement/Comportement.cs +++ b/src/Scripts/Comportement/Comportement.cs @@ -7,17 +7,13 @@ public abstract class Comportement protected Agent proprietaire; - protected int nbBruit = 5; - protected float bruit = 0.01f; + protected int nbBruit = 8; + protected float bruit = 0.05f; public Comportement(Agent a) { proprietaire = a; } public abstract Vector3 reagir(List<Observation> observation) ; - /*{ - return Utils.noiseVector(proprietaire.direction,nbBruit,bruit); - //return Vector3.zero; - }*/ } diff --git a/src/Scripts/Comportement/CompositeSeq.cs b/src/Scripts/Comportement/CompositeSeq.cs new file mode 100755 index 0000000..4138ade --- /dev/null +++ b/src/Scripts/Comportement/CompositeSeq.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class CompositeSeq : Comportement +{ + + protected List<Comportement> comportements; + + public CompositeSeq(Agent proprietaire,List<Comportement> c) : base(proprietaire) { + comportements = c; + } + + public CompositeSeq(Agent proprietaire) : base(proprietaire) { + comportements = new List<Comportement>(); + } + + public void removeComportement(int i) { comportements.RemoveAt(i); } + + public void AddComportement(Comportement c) { comportements.Add(c); } + + public override Vector3 reagir(List<Observation> observation) { + List<Vector3> vectors = new List<Vector3>(); + vectors.Add(proprietaire.direction); + Vector3 add; + for(int i=0;i<comportements.Count;i++) { + add = comportements[i].reagir(observation); + vectors.Add(add); + } + return Utils.meanVector(vectors); + } + +} diff --git a/src/Scripts/Comportement/Paper.cs b/src/Scripts/Comportement/Paper.cs new file mode 100755 index 0000000..93a675b --- /dev/null +++ b/src/Scripts/Comportement/Paper.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Paper : Comportement +{ + public Paper(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } + +} diff --git a/src/Scripts/Comportement/Player.cs b/src/Scripts/Comportement/Player.cs new file mode 100755 index 0000000..6e16e35 --- /dev/null +++ b/src/Scripts/Comportement/Player.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Player : Comportement +{ + public Player(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } +} diff --git a/src/Scripts/Comportement/Predator.cs b/src/Scripts/Comportement/Predator.cs new file mode 100755 index 0000000..600118f --- /dev/null +++ b/src/Scripts/Comportement/Predator.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Predator : Comportement +{ + public Predator(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } + +} diff --git a/src/Scripts/Comportement/Prey.cs b/src/Scripts/Comportement/Prey.cs new file mode 100755 index 0000000..e2eee65 --- /dev/null +++ b/src/Scripts/Comportement/Prey.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Prey : Comportement +{ + public Prey(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } + +} diff --git a/src/Scripts/Comportement/Reynolds.cs b/src/Scripts/Comportement/Reynolds.cs index f5fac29..ddb7a7b 100755 --- a/src/Scripts/Comportement/Reynolds.cs +++ b/src/Scripts/Comportement/Reynolds.cs @@ -20,12 +20,8 @@ public class Reynolds : Comportement else if(normal(o)) vectors.Add(suivre(o.objet)); else if(isolement(o)) vectors.Add(rapprocher(o.distance)); } - else { - if(danger(o)) for(int i=0;i<5;i++) vectors.Add(fuir(o.distance)); - } } Vector3 res = Utils.meanVector(vectors); - //return proprietaire.direction; return Utils.noiseVector(res,nbBruit,bruit); } @@ -33,7 +29,7 @@ public class Reynolds : Comportement return (Utils.normVector(o.distance) < Escape); } - private Vector3 fuir(Vector3 d) { return -d; } + private Vector3 fuir(Vector3 d) { return -d.normalized; } private bool normal(Observation o) { return Utils.normVector(o.distance) < Together; @@ -41,13 +37,13 @@ public class Reynolds : Comportement private Vector3 suivre(Visible a) { Agent agent = (Agent) a; - return agent.direction; + return agent.direction.normalized; } private bool isolement(Observation o) { return Utils.normVector(o.distance) <= Follow; } - private Vector3 rapprocher(Vector3 d) { return d; } + private Vector3 rapprocher(Vector3 d) { return d.normalized; } } diff --git a/src/Scripts/Environnement/Cube.cs b/src/Scripts/Environnement/Cube.cs new file mode 100755 index 0000000..20916b1 --- /dev/null +++ b/src/Scripts/Environnement/Cube.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Cube : Topologie +{ + + public float minX; + public float maxX; + public float minY; + public float maxY; + public float minZ; + public float maxZ; + public GameObject cube; + + + public Cube(GameObject c) : base() { + cube = c; + float scaleX = cube.transform.localScale.x; + float scaleY = cube.transform.localScale.y; + float scaleZ = cube.transform.localScale.z; + minX = -scaleX/2.0f;maxX = scaleX/2.0f; + minY = -scaleY/2.0f;maxY = scaleY/2.0f; + minZ = -scaleZ/2.0f;maxZ = scaleZ/2.0f; + } + + public override GameObject getGameObject() { return cube;} + + public override Observation detectEnv(Agent current) { + Vector3 pos = current.transform.position; + List<Vector3> p = new List<Vector3> + { + new Vector3(minX,pos.y,pos.z), new Vector3(maxX,pos.y,pos.z), + new Vector3(pos.x,minY,pos.z), new Vector3(pos.x,maxY,pos.z), + new Vector3(pos.x,pos.y,minZ), new Vector3(pos.x,pos.y,maxZ), + }; + float dist = Utils.normVector(p[0] - pos); + float d; Vector3 res = p[0]; + for(int i=1;i<p.Count;i++) { + d = Utils.normVector(p[i] - pos); + if(d<dist) { + dist = d; + res = p[i]; + } + } + return new Observation(new Obstacle(res),res-pos); + } + + public override Vector3 validPosition() { + return Utils.randomVector(minX, maxX, minY, maxY, minZ, maxZ); + } + +} diff --git a/src/Scripts/Environnement/Environnement.cs b/src/Scripts/Environnement/Environnement.cs index e024985..36ac2cd 100755 --- a/src/Scripts/Environnement/Environnement.cs +++ b/src/Scripts/Environnement/Environnement.cs @@ -6,45 +6,17 @@ public class Environnement : MonoBehaviour { private SMA system; - public GameObject topologie; - public float minX; - public float maxX; - public float minY; - public float maxY; - public float minZ; - public float maxZ; + private Topologie topologie; + public GameObject cube; + private List<Obstacle> obstacles; // Start is called before the first frame update void Start() { system = GameObject.Find("SMA").GetComponent<SMA>(); - Instantiate(topologie, Vector3.zero, Quaternion.identity,transform); - float scaleX = topologie.transform.localScale.x; - float scaleY = topologie.transform.localScale.y; - float scaleZ = topologie.transform.localScale.z; - minX = -scaleX/2.0f;maxX = scaleX/2.0f; - minY = -scaleY/2.0f;maxY = scaleY/2.0f; - minZ = -scaleZ/2.0f;maxZ = scaleZ/2.0f; - } - - public Observation detectEnv(Agent current) { - Vector3 pos = current.transform.position; - List<Vector3> p = new List<Vector3> - { - new Vector3(minX,pos.y,pos.z), new Vector3(maxX,pos.y,pos.z), - new Vector3(pos.x,minY,pos.z), new Vector3(pos.x,maxY,pos.z), - new Vector3(pos.x,pos.y,minZ), new Vector3(pos.x,pos.y,maxZ), - }; - float dist = Utils.normVector(p[0] - pos); - float d; Vector3 res = p[0]; - for(int i=1;i<p.Count;i++) { - d = Utils.normVector(p[i] - pos); - if(d<dist) { - dist = d; - res = p[i]; - } - } - return new Observation(new Obstacle(res),res-pos); + obstacles = new List<Obstacle>(); + topologie = new Cube(cube); + Instantiate(topologie.getGameObject(), Vector3.zero, Quaternion.identity,transform); } public List<Observation> voisinage(Agent current, float rayon, float angle) { @@ -56,12 +28,16 @@ public class Environnement : MonoBehaviour a = Vector3.Angle(current.direction,dist); if (system.agents[i] != current && l <= rayon && a <= angle/2.0f) res.Add(new Observation(system.agents[i],dist)); } - Observation bord = detectEnv(current); + Observation bord = topologie.detectEnv(current); l = Utils.normVector(bord.distance); a = Vector3.Angle(current.direction,bord.distance); if(l <= rayon && a <= angle/2.0f) res.Add(bord); return res; } + public Vector3 validPosition() { + return topologie.validPosition(); + } + // Update is called once per frame void Update() { diff --git a/src/Scripts/Environnement/Topologie.cs b/src/Scripts/Environnement/Topologie.cs new file mode 100755 index 0000000..7ad7de2 --- /dev/null +++ b/src/Scripts/Environnement/Topologie.cs @@ -0,0 +1,16 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public abstract class Topologie +{ + + public Topologie() {} + + public abstract GameObject getGameObject(); + + public abstract Observation detectEnv(Agent current); + + public abstract Vector3 validPosition(); + +} diff --git a/src/Scripts/Perception/Perception.cs b/src/Scripts/Perception/Perception.cs index 0cf080e..ce872e4 100755 --- a/src/Scripts/Perception/Perception.cs +++ b/src/Scripts/Perception/Perception.cs @@ -19,15 +19,4 @@ public class Perception return proprietaire.system.environnement.voisinage(proprietaire, rayon, angle); } - // Start is called before the first frame update - void Start() - { - - } - - // Update is called once per frame - void Update() - { - - } } diff --git a/src/Scripts/Perception/Perception180.cs b/src/Scripts/Perception/Perception180.cs new file mode 100755 index 0000000..8d77ca2 --- /dev/null +++ b/src/Scripts/Perception/Perception180.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Perception180 : Perception +{ + public Perception180(Agent agent, float r) : base(agent, r, 180.0f) {} +} diff --git a/src/Scripts/Perception/Perception360.cs b/src/Scripts/Perception/Perception360.cs index d650015..0c4878f 100755 --- a/src/Scripts/Perception/Perception360.cs +++ b/src/Scripts/Perception/Perception360.cs @@ -7,15 +7,4 @@ public class Perception360 : Perception public Perception360(Agent agent, float r) : base(agent, r, 360.0f) {} - // Start is called before the first frame update - void Start() - { - - } - - // Update is called once per frame - void Update() - { - - } } diff --git a/src/Scripts/Perception/Perception90.cs b/src/Scripts/Perception/Perception90.cs new file mode 100755 index 0000000..237e5ab --- /dev/null +++ b/src/Scripts/Perception/Perception90.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Perception90 : Perception +{ + public Perception90(Agent agent, float r) : base(agent, r, 90.0f) {} +} diff --git a/src/Scripts/SMA.cs b/src/Scripts/SMA.cs index 98d32db..810ea05 100755 --- a/src/Scripts/SMA.cs +++ b/src/Scripts/SMA.cs @@ -6,7 +6,7 @@ public class SMA : MonoBehaviour { public List<Agent> agents; public Environnement environnement; - public int population = 50; + public int population = 80; public GameObject boid; @@ -32,10 +32,7 @@ public class SMA : MonoBehaviour void createAgents() { GameObject a; for(int i=0; i<population; i++) { - a = Instantiate(boid, - Utils.randomVector(environnement.minX, environnement.maxX, - environnement.minY, environnement.maxY, - environnement.minZ, environnement.maxZ), Quaternion.identity,environnement.transform) as GameObject; + a = Instantiate(boid, environnement.validPosition(), Quaternion.identity,environnement.transform) as GameObject; agents.Add(a.GetComponent<Agent>()); } diff --git a/src/Scripts/Utils.cs b/src/Scripts/Utils.cs index 3efaabd..461669f 100755 --- a/src/Scripts/Utils.cs +++ b/src/Scripts/Utils.cs @@ -80,26 +80,4 @@ public class Utils return normalizedVector(x,y,z); } - /* List<Component> neighbourhood() { - List<Component> neighbours = new List<Component>(); - float dist; - Vector3 link; - Agent bird; - for(int i=0; i<birds.Length; i++) { - bird = (Agent) birds[i]; - link = bird.transform.position - transform.position; - dist = (float) Math.Sqrt(Math.Pow(link.x,2) + Math.Pow(link.y,2) + Math.Pow(link.z,2)); - if(bird != this && dist < system.RaynoldFollowTresh) neighbours.Add(birds[i]); - } - return neighbours; - } - - void SMA() { - Vector3 res = Vector3.zero; - res += direction; - if(transform.position.x < system.minX || transform.position.x > system.maxX) res.x = -direction.x; - if(transform.position.y < system.minY || transform.position.y > system.maxY) res.y = -direction.y; - if(transform.position.z < system.minZ || transform.position.z > system.maxZ) res.z = -direction.z; - nextDirections.Add(res); - }*/ } -- GitLab