Skip to content
Snippets Groups Projects
Commit 0ce3d825 authored by nollet's avatar nollet
Browse files

fin J2 (compte rendu à faire)

parent 16d75ba6
No related branches found
No related tags found
No related merge requests found
Showing
with 269 additions and 547 deletions
# Journal de Bord - Jour 12
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 31/05/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Semaine 3
[↩️ Retour au Journal de Bord](../menu.md)
La Semaine 3 a eu lieu du 30/05/2022 au 03/06/2022
Vous pouvez ici accéder aux comptes rendus de chaque jour.
* [Lundi 30 Mai 2022](lundi.md)
* [Mardi 31 Mai 2022](mardi.md)
* [Mercredi 01 Juin 2022](mercredi.md)
* [Jeudi 02 Juin 2022](jeudi.md)
* [Vendredi 03 Juin 2022](vendredi.md)
# Journal de Bord - Jour 13
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 01/06/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Jour 15
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 03/06/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Jour 19
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 09/05/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Jour 16
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 06/06/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Jour 17
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 07/06/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Semaine 4
[↩️ Retour au Journal de Bord](../menu.md)
La Semaine 1 a eu lieu du 06/06/2022 au 10/06/2022
Vous pouvez ici accéder aux comptes rendus de chaque jour.
* [Lundi 06 Juin 2022](lundi.md)
* [Mardi 07 Juin 2022](mardi.md)
* [Mercredi 08 Juin 2022](mercredi.md)
* [Jeudi 09 Juin 2022](jeudi.md)
* [Vendredi 10 Juin 2022](vendredi.md)
# Journal de Bord - Jour 18
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 08/06/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
# Journal de Bord - Jour 20
[↩️ Retour au Journal de Bord de la Semaine](./menu.md)
Voici ici le descriptif du travail effectué lors de la journée du 10/06/2022.
## De 8h30 à 10h
## de 10h à 12h
## de 14h à 16h
## de 16h à 18h
\ No newline at end of file
Citation :
2010 Leadership in Flocking
[Vicenç Quera, Francesc S. Beltran, Ruth Dolado ]
Lien :
http://diposit.ub.edu/dspace/bitstream/2445/34511/1/577311.pdf
Mots clés :
- Flocking Behaviour
- Hierarchical Leadership
- Agent-Based Simulation
- Social Dynamics
Structure :
1. Abstract
Étude de l'émergence de meneur comme résultat d'interactions inter-agents
Il est supposé que les meneurs seraient une conséquence d'interactions entre agents basées sur des règles dyadic.
Utilisation du comportement de nuée, exemple de comportement de groupe, dont les propriétés observés peuvent expliquer quelques unes
des dynamiques et organisations humaines
Generation de nué, on récolte les indices des agents pour interpreter le mouvement du groupe et interpréter s'il y a un leader actuel
Plusieurs tests, afin de tester le model, et voir comment la définition de l'agent et les conditions du monde
influent sur les fluctuations des indices.
Identification des agents, propriété monde, paramètre de modèle, qui rende stable la nuée et qui
rende possible l'analyse des propriétés d'environnements qui prédictent la probabilité d'emergence de meneur.
2. Introduction
- Sociologie, sciences po, management, psycologie
- le but est d'étudier l'émergence de leader comme conséquence d'interactions entre agents, qui
ont les mêmes propriétés (aucun est prédominant)
Seuls les interactions entre agents mènent à la nuée et au meneur
- Explication du comportement de nuée, Reynold cité
- Nuée est comportement de group auto-organisé, provoqué par règles simple entre agent
Parallèle avec certains comportements de groupes humains (basées sur observation et analyse, non sur anticipation et croyance)
- implementation de nuée, différent de Reynold, résulte de dyadic interactions rules.
2 types indices, nuée globale et nuée menée
Tests du comportement du modèle, des propriétés agents et environnement + model param qui favorise floacking
Description de l'emergence de meneur et tentative de lien avec les prop d'environnement et la situation du meneur (position)
Description probabilité de l'agent de devenir meneur
3. Modelling Flock Emergence
- mouvement de coordonnées, Utilisation de P-Flock 2.0 (C et Delphi) et dyadic rule
a. World and Agents
world : 2D discret, cases capacité 1 agent
agent : a des coordonnées de position et un vecteur direction
l'agent a un champ de perception centré par sa direction.
ses mouvements sont contraints par son voisinages
(Moor et Von Neumann à plusieurs diametre possibles)
b. Ideal Distances and Dissatisfaction
définission de la distance idéal entre les agents qui peut changer selon le contexte,
l'agent voudra se déplacer avec son voisinage
l'agent pourra quantifier son mécontentement dans une situation selon un voisinage donnée,
il voudra faire le mouvement qui minimisera son mécontentement futur
Les agents qui n'ont pas de cases spécifique pour réduire leur mécontentement, bougeront aléatoirement après que ceux
qui avaient l'occasion de faire baisser leur mécontentement aient bougé
c. Flock Synthesis Rules
Distance idéale varie selon les interactions entre agents, interactions basées sur des règles, les régles de synthèse de nuée
les règles :
- se déplacement intialement de manière aléatoire
- quand un agent croise un autre et que leurs distances est inférieur ou égale à une certaine valeur,
alors il détermine une distance idéale qui les rapproche de manière aléatoire
- 2 manières de déterminer le futur déplacement :
- douce : s'adapter au déplacement de l'autre, il se déplacera selon son voisinage pour minimiser son mécontentement
et considéra le déplacement qui le rapprochera de la distance idéal avec l'autre, en considérant qu'il ne bougera pas
L'agent s'eloignera donc ou s'approchera, selon la distance réelle et la distance idéal determinée.
Si après mouvement on a un mécontentement supérieure à celui prévu, on parle de sous-adaptage. S'il est inférieur à celui prévu, sur-adaptage. Si égale, parfaitement adapté
2 cas : a. approcher et sousadapté, b. éloigner et suradapté
a. augmenter la distance idéal est pénalité
b. augmenter la distance idéal est récompense
En gros, si overadapted le mouvement est cool et on continue, sinon pas cool on continue pas
- brut : si trop de stagnation ou trop d'isolation
Des paramètres
les agents intéragissent avec d'autre si dans le champ de perception, l'autre agent n'interagit pas forcément si ne voit pas le premier agent
si l'agent considère plusieurs agents, alors il déterminera la distance idéale de manière indépendante pour chaque agent
Démo sur le site, on peut pause, play, slow down... On enregistre les positions, les directions, les distances idéales etles indices de nuée et de menage
4. Quantifying Floacking
- indice nué : analyse des positions dans le temps
- nué grande si headings en communs et distances assez proches, sinon petite
- on observe le tout et determine l'indice globale de nué selon les nuées observés
5. An Index of Hierarchical Flock Leadership
- lorsqu'il y a nué, on observe souvent un leader. Leader qui donne sa direction aux autres
(il ne voit pas les autres mais les autres le voit et le suit)
- matrice sociale : un graph où les agents sont des noeuds et avec arêtes orientés selon les autres agents perçues
- leader vu et suivi par certains qui eux sont suivi par certains qui eux ... Le leader n'a pas forcément le plus haut degré
Avoir un degré nul ne suffit pas pour être leader, il faut être suivi...
- rang de prestige : notre prestige augmente si on est suivi par d'autre plus ou moins prestige
- si boucle, utiliser des substitue de valeurs
- le poids est le dyadic indice de nuée, ainsi l'indice de menage correspond au degré de mouvement coordonné de la nué. Si nué compact avec même heading,
l'indice de menage sera haut. Quand désordonné, pas beaucoup de nué, alors pas beaucoup de menage.
- différence avec effective leadership (effective explique le mouvement, le Hierarchical est une observation extérieur)
Avoir un meneur n'explique pas le mouvement, c'est les règles des agents qui le définisse
a. An Example
- 8 agents positionnés, on voit leur direction et qui ils perçoivent
- analyse des indices de nué (matrice avec des 1 si même direction entre 2 agents)
- on constate le leader
6. Method
- Les tests. 2 series de simulations :
- identifier conditions environnements (taille), conditions agent (champ de vision) et
paramètre des interactions qui font émerger le mouvement de nué.
- analyse des leaders et essaie de déterminer la probabilité selon position initiale de devenir leader
a. Flock Emergence
- diverses tailles de mondes, 20 agents, perception entre 3pi/2 et 60 et utilisation
du voisinage de Moore de diametre 3. Dispersé équitablement dans l'espace et même direction,
Simulation fait 20000 itérations. On répéte 4 fois la simulation selon la taille
- Résultats : grand monde, pas de nué. trop petit monde, trop d'interactions, nué pas stable.
Une taille relativement petite (150x120) est vu comme optimal pour 20 agents.
- On change la perception, on garde le reste, on fait tourner tout pareil qu'avant, (60, 6π/4) and (80, 5π/4) sont les meilleurs perceptions.
En relançant les simulations avec ces perceptions et le reste des critères sauf qu'on affecte aléatoirement les positions et les directions, la nuée est stable
- Simulations pour obtenir les paramètres des interactions
- Avec les résultats obtenue, on effectue 100 simulations qui tourne 20000 étapes avec affectation aléatoire des positions et directions, 72% de chance d'obtenir la nuée.
- lorsque nué stable, pas de patron général de comportement de la nuée stable
b. Flock Leadership
- le leader sera celui avec l'indice le plus grand, même s'il y a plusieurs nuées.
Un seul leader stable à la fois.
- deux ensembles de simulations, les stables (72%) et pas stables (28%)
On observe les affectations de meneur et lorsque la nué est stable, le leader l'est aussi. Sinon, le leader change beaucoup de fois
c. Centrality and Leadership
- hypothèse de la centralité qui cause le meneur
- centralité : à partir d'un agent, somme des vecteurs menants aux autres, si somme nulle, agent centré
- après tests avec 292 leaders observés, la position n'influe pas le leader
7. Discussion and Conclusions
- Le modèle crée une nuée comme celui de Reynold sans utiliser le même principe. Ici, adaptation aux agents rencontrés, pénalité et récompense,
minimisation du mécontentement produisent le mouvement de nuée. Les règles des agents ne le prévoient pas, c'est une conséquence de celles ci.
- Lorsque le mouvement de nué est produit, on constate des leaders stables. Les règles des agents ne le prévoient pas non plus, c'est également un phénomène emergeant.
- Indices de nuée et de meneur avec utilisation de graphes sociaux.
- Beaucoup de variations de paramètres possibles, l'objectif était de trouver lesquels favorisaient l'émergence de nué. 3 conclusions :
- monde grand, quand nuée, la nuée est stable
- les nuées les plus compactes et stables sont apparus lorsque grande vision et petit objectif,
- avec les paramètres optimaux trouvé, 72% de chance d'avoir une nuée
- lorsque nuée stable, le leader le sera aussi. la position de l'agent leader n'a pas d'incidence apparente dans le fait de devenir leader.
- Possibilité de suite en 3D, possibilité de suite dans l'analyse d'émergeance de leaders
Commentaires :
Intéressant comme phénomène !
\ No newline at end of file
File added
File added
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &437517194170826549
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3255089734447956989}
- component: {fileID: 1274723212690861014}
- component: {fileID: 6428507427308703938}
- component: {fileID: 2073586004525875113}
m_Layer: 0
m_Name: Cylinder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3255089734447956989
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 437517194170826549}
m_LocalRotation: {x: -0.5192311, y: 0.4799991, z: 0.5192311, w: 0.4799991}
m_LocalPosition: {x: 0.02, y: -0.11, z: -0.03}
m_LocalScale: {x: 0.44719383, y: 1.7489846, z: 0.4350196}
m_Children: []
m_Father: {fileID: 8965968834670266038}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: -94.496994, y: 89.99999, z: 0}
--- !u!33 &1274723212690861014
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 437517194170826549}
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &6428507427308703938
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 437517194170826549}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!136 &2073586004525875113
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 437517194170826549}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
m_Radius: 0.50000036
m_Height: 2
m_Direction: 1
m_Center: {x: 0.000000029802326, y: 0, z: -0.00000005960467}
--- !u!1 &6503597824548460142
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7021844916232508048}
- component: {fileID: 3037028539180812241}
- component: {fileID: 7478878501271007588}
- component: {fileID: 5023922831713910363}
m_Layer: 0
m_Name: Capsule
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7021844916232508048
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6503597824548460142}
m_LocalRotation: {x: 0.49605432, y: 0.50391483, z: 0.49605432, w: 0.50391483}
m_LocalPosition: {x: -0.07, y: -0.01, z: 0.418}
m_LocalScale: {x: 0.09107, y: 0.33664638, z: 0.5}
m_Children: []
m_Father: {fileID: 8965968834670266038}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 90.00001, z: 89.09901}
--- !u!33 &3037028539180812241
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6503597824548460142}
m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &7478878501271007588
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6503597824548460142}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!136 &5023922831713910363
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6503597824548460142}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
m_Radius: 0.50000024
m_Height: 2
m_Direction: 1
m_Center: {x: -0.000000029802347, y: 0, z: 0.00000002980234}
--- !u!1 &8965968834670266037
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8965968834670266038}
- component: {fileID: 8965968834670266033}
- component: {fileID: 8965968834670266032}
- component: {fileID: 8965968834670266039}
- component: {fileID: 8965968834670266034}
m_Layer: 0
m_Name: Boid
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8965968834670266038
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8965968834670266037}
m_LocalRotation: {x: 0, y: -0.7071068, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0.21321096, y: 1, z: -0.17667253}
m_LocalScale: {x: 0.5, y: 0.5, z: 1.2}
m_Children:
- {fileID: 3255089734447956989}
- {fileID: 7021844916232508048}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: -90, z: 0}
--- !u!33 &8965968834670266033
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8965968834670266037}
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &8965968834670266032
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8965968834670266037}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!135 &8965968834670266039
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8965968834670266037}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Radius: 0.5
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &8965968834670266034
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8965968834670266037}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 569ca68f350b4a14f8619ace3abb92bc, type: 3}
m_Name:
m_EditorClassIdentifier:
direction: {x: 0, y: 0, z: 0}
speed: 0
fileFormatVersion: 2
guid: ecfb92997fb6674468149566eb767e2c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Environnement : MonoBehaviour
{
public int minX;
public int minY;
public int minZ;
public int maxX;
public int maxY;
public int maxZ;
public bool _3D;
public bool globalSpeed;
public float speed;
public bool RaynoldEscape;
public int RaynoldEscapeTresh;
public bool RaynoldTogether;
public int RaynoldTogetherTresh;
public bool RaynoldFollow;
public int RaynoldFollowTresh;
// Start is called before the first frame update
void Start()
{
_3D = true;
globalSpeed = true;
speed = 1.2f;
minX = -30;
minY = 0;
minZ = -15;
maxX = 30;
maxY = 50;
maxZ = 15;
RaynoldEscape = false ;
RaynoldEscapeTresh = 1;
RaynoldTogether = false ;
RaynoldTogetherTresh = 3;
RaynoldFollow = false ;
RaynoldFollowTresh = 5;
}
// Update is called once per frame
void Update()
{
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: e6b1cf67504415c4686b3faeea17770e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Flocking : MonoBehaviour
{
private Environnement env;
public Vector3 direction;
public float speed;
private bool _3D;
public Component[] birds;
private List<Vector3> nextDirections = new List<Vector3>();
// Start is called before the first frame update
void Start()
{
env = GameObject.Find("SMA").GetComponent<Environnement>();
direction = randomDirection();
speed = 1.2f;
_3D = env._3D;
birds = env.GetComponentsInChildren<Flocking>();
}
// Update is called once per frame
void Update()
{
if(env._3D != _3D) {
_3D = env._3D;
direction = randomDirection();
}
setDirection();
move();
}
Vector3 randomDirection() {
float x = 0.0f;
float y = 0.0f;
float z = 0.0f;
int r;
if(env._3D) {
for(int i = 0; i<10; i++) {
r = UnityEngine.Random.Range(0,3);
if (r == 0) x += 1.0f;
else if (r == 1) y += 1.0f;
else z += 1.0f;
}
}
else {
for(int i = 0; i<10; i++) {
r = UnityEngine.Random.Range(0,2);
if (r == 0) x += 1.0f;
else y += 1.0f;
}
}
if(UnityEngine.Random.Range(1,3) > 1) x = -x;
if(UnityEngine.Random.Range(1,3) > 1) y = -y;
if(UnityEngine.Random.Range(1,3) > 1) z = -z;
return normalizedVector(x,y,z);
}
Vector3 normalizedVector(float x, float y, float z) {
return (new Vector3(x,y,z)).normalized;
}
Vector3 meanVector(List<Vector3> vectors) {
Vector3 res = Vector3.zero;
for(int i = 0; i<vectors.Count; i++) {
res += vectors[i];
}
res = res/vectors.Count;
return res.normalized;
}
void setDirection() {
nextDirections.Clear();
environnement();
List<Component> neighbours = neighbourhood();
if(env.RaynoldEscape) raynoldEscape(neighbours);
if(env.RaynoldFollow) raynoldFollow(neighbours);
if(env.RaynoldTogether) raynoldTogether(neighbours);
direction = meanVector(nextDirections);
}
List<Component> neighbourhood() {
List<Component> neighbours = new List<Component>();
float dist;
Vector3 link;
Flocking bird;
for(int i=0; i<birds.Length; i++) {
bird = (Flocking) 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 < env.RaynoldFollowTresh) neighbours.Add(birds[i]);
}
return neighbours;
}
void raynoldEscape(List<Component> neighbours) {
Vector3 res = Vector3.zero;
float dist;
Vector3 link;
Flocking bird;
for(int i=0; i<neighbours.Count; i++) {
bird = (Flocking) neighbours[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 < env.RaynoldEscapeTresh) res -= link;
}
nextDirections.Add(normalizedVector(res.x,res.y,res.z));
}
void raynoldFollow(List<Component> neighbours) {
Vector3 res = Vector3.zero;
float dist;
Vector3 link;
Flocking bird;
for(int i=0; i<neighbours.Count; i++) {
bird = (Flocking) neighbours[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 < env.RaynoldFollowTresh && dist >= env.RaynoldTogetherTresh) res += link;
}
nextDirections.Add(normalizedVector(res.x,res.y,res.z));
}
void raynoldTogether(List<Component> neighbours) {
Vector3 res = Vector3.zero;
float dist;
Vector3 link;
Flocking bird;
for(int i=0; i<neighbours.Count; i++) {
bird = (Flocking) neighbours[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 < env.RaynoldTogetherTresh && dist >= env.RaynoldEscapeTresh) res += bird.direction;
}
nextDirections.Add(normalizedVector(res.x,res.y,res.z));
}
void environnement() {
Vector3 res = Vector3.zero;
res += direction;
if(transform.position.x < env.minX || transform.position.x > env.maxX) res.x = -direction.x;
if(transform.position.y < env.minY || transform.position.y > env.maxY) res.y = -direction.y;
if(transform.position.z < env.minZ || transform.position.z > env.maxZ) res.z = -direction.z;
nextDirections.Add(res);
}
void move() {
float s;
if(env.globalSpeed) s = env.speed; else s = speed;
transform.position += s*direction;
transform.LookAt(transform.position + s*direction);
}
}
fileFormatVersion: 2
guid: 569ca68f350b4a14f8619ace3abb92bc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: fb44d5370e6065d42932be2ab49c851d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment