[WIP] Simu Course réaliste + Map + Volant

Modérateur : Administrateurs Suppléants

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par djulio74 » 05 Oct 2018 12:05

Bon j'ai fait un petit test de création de quadtree. enfin pas forcément dans les règles de l'art, mais ça fonctionne plutôt bien.
pour 10 " étages de pyramide" donc 9 subdivision de l'espace, la recherche de la zone finale correspondante pour 1 million de point prend seulement 0.6 sec, et sans multiThread.. la resolution final etant de 512x512 bloc. soit 78mx78m..

je laisse le bout de code au cas ou :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Zone : MonoBehaviour {
	
	
	// nombre etage pyramide Quadtree //
	[Range(2,10)] public int deph = 0;
	
	public int zoneCount;	
	private int Rayon = 20000;
	
	private Rect[] R;	
	private Vector2 point;
	private int ActiveZone;
	
	
	void Start () {
		CreateZone();
		
		point = Random.insideUnitCircle*Rayon;
		findZone(0);	
		
	
	}
	

	void Update () {
		
		// touche "c" du clavier
		// actualise le quadtree si l'on change le "deph" de l''inspecteur
		if( Input.GetKeyDown("c") ){
			float TP = Time.realtimeSinceStartup;
			CreateZone();
			findZone(0);	
			print ( Time.realtimeSinceStartup - TP);
		}
		
		// debug de toute les zone, de tous les etage du quadtree		
		for ( int i = 0 ; i < R.Length/4 ; i++){
			Vector3 A = new Vector3(R[i].xMin, 0, R[i].yMin);
			Vector3 B = new Vector3(R[i].xMin, 0, R[i].yMax);
			Vector3 C = new Vector3(R[i].xMax, 0, R[i].yMin);
			Vector3 D = new Vector3(R[i].xMax, 0, R[i].yMax);
			
			Debug.DrawLine(A,B, new Color(1.0f,1.0f,1.0f,0.2f));
			Debug.DrawLine(B,D, new Color(1.0f,1.0f,1.0f,0.2f));
			Debug.DrawLine(C,D, new Color(1.0f,1.0f,1.0f,0.2f));
			Debug.DrawLine(A,C, new Color(1.0f,1.0f,1.0f,0.2f));						
		}
		
		Debug.DrawRay( new Vector3( point.x , 0 , point.y), Vector3.up * 10000, Color.red);		
		
		// touche "r" clavier : 
		// lance la recherche de la zone pour 1M de points, choisis au hasard dans la map
		if( Input.GetKeyDown("r") ){
			
			float TP = Time.realtimeSinceStartup;			
			for ( int i = 0 ; i < 1000000 ; i++){				
				point = Random.insideUnitCircle*Rayon;
				findZone(0);				
			}			
			print ( Time.realtimeSinceStartup - TP);

		}
		
		//affichae en rouge de la zone ou l'on se trouve//
		Vector3 a = new Vector3(R[ActiveZone].xMin, 0, R[ActiveZone].yMin);
		Vector3 b = new Vector3(R[ActiveZone].xMin, 0, R[ActiveZone].yMax);
		Vector3 c = new Vector3(R[ActiveZone].xMax, 0, R[ActiveZone].yMin);
		Vector3 d = new Vector3(R[ActiveZone].xMax, 0, R[ActiveZone].yMax);
			
		Debug.DrawLine(a,b, new Color(1.0f,0.0f,0.0f,1.0f));
		Debug.DrawLine(b,d, new Color(1.0f,0.0f,0.0f,1.0f));
		Debug.DrawLine(c,d, new Color(1.0f,0.0f,0.0f,1.0f));
		Debug.DrawLine(a,c, new Color(1.0f,0.0f,0.0f,1.0f));		
	
	}
	
	void CreateZone(){
		
		int count = 0;
		for ( int i = 0 ; i < deph ; i++){
			count += Mathf.RoundToInt(Mathf.Pow(4,i));
		}
		R = new Rect[count];
		R[0] = new Rect(-Rayon , -Rayon ,  Rayon*2 ,Rayon*2);	
		
		for ( int i = 0 ; i < (R.Length/4) ; i++){			
			Rect r = R[i];
			float size =  r.width/2;			
			R[i*4+1] = new Rect(r.xMin, r.center.y , size , size);			
			R[i*4+2] = new Rect(r.xMin, r.yMin , size , size);
			R[i*4+3] = new Rect(r.center.x, r.center.y , size , size);
			R[i*4+4] = new Rect(r.center.x, r.yMin , size , size);
		}
		zoneCount = R.Length;

	} 
	
	void findZone(int z){
		
		ActiveZone = z*4+4;
		
		if( R[z*4+1].Contains(point)){		
			ActiveZone = z*4+1;
		}
		else if( R[z*4+2].Contains(point)){			
			ActiveZone = z*4+2;
		}
		else if( R[z*4+3].Contains(point)){			
			ActiveZone = z*4+3;
		}
		
		if( (ActiveZone*4+4)< zoneCount){
			findZone(ActiveZone);
			
		}
		
		
	}
}
forcément un peu brouillon, mais pas mécontent, le principe est là. ;-)
reste a savoir comment m'en servir pour cette histoire de collider. :hehe: :hehe:

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Alesk
Messages : 1928
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par Alesk » 05 Oct 2018 13:02

Bien !

Une fois que tu as identifié le secteur, tu peux alors générer/mettre à jour le mesh collider correspondant.

Un truc à tenter en premier : si tu références directement tes gameObjects de parcelles dans le quadtree, tu peux tenter d'assigner le sharedMesh du gameObject à celui du meshcollider, comme ça t'as rien à générer en plus.

Si ça fonctionne comme ça, tu aurais donc un gameObject avec le collider que tu repositionnes au même endroit que le gameObject qui affiche le mesh de la parcelle et à qui tu assignes le sharedMesh de la parcelle.

Et pour les raccord entre parcelles, il t'en faudrait au pire 3 de plus, pour gérer les collisions avec parcelles adjacentes si jamais ton véhicule est à cheval sur deux parcelles.

Comme tu ne changes pas de parcelles sans arrêts, la mise à jour des colliders ne se ferait que lorsque tu changes de parcelle.

Sinon... bah il va falloir taper directement sur les triangles pour générer un collider à la main.
Là je pense que tu n'as besoin que de référencer dans le quadtree que les données des triangles et du mesh qui les contient.
Comme tu peux accéder aux données du mesh directement, pas besoin de tout stocker, juste l'index du premier index de vertex de chaque triangle suffit (donc dans le tableau mesh.triangles) puisque les deux autres sont toujours les deux suivants dans le tableau.

ainsi dans chaque subdivision finale du quadtree, tu aurais une liste de structs (mais le plus souvent un seul dans la liste, au max 4 si tes parcelles sont des carrés) :
mesh -> ref vers le mesh concerné
triangles -> [ index du premier vertex du premier triangle dans mesh.triangles , index du premier vertex du second triangle dans mesh.triangles , index du premier vertex du troisième triangle dans mesh.triangles ... ]

... ces triangles étant bien entendu ceux présents dans cette subdivision du quadtree.

à partir de là, tu as moyen de retrouver tous les vertices et triangles concernés.

Note : parfois, pour accélérer l'accès aux données du mesh, il vaut mieux créer des variables locales plutôt que d'accéder directement au tableau de la classe mesh.

Code : Tout sélectionner

Vector3[] vertices = mesh.vertices;
float x = vertices[0].x;
plutôt que :

Code : Tout sélectionner

float x = mesh.vertices[0].x;
faut faire un bench pour vérifier ça, mais si mes souvenirs sont exacts, c'est bien ça.

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par djulio74 » 05 Oct 2018 17:58

Bon.. alors.. lol
j'ai ressui a incorporer mon petit test de quadtree dans ma map, j'arrive donc à générer un très grand nombre de mini-parcelle(65 536) donc autant de gameObject, dans le même temps que mes 64 de base. si j'ajoute les mesh collider a chacun, je reste dans les 10-12sec de génération.
Mais l'idée de base d'avoir juste le collider sous la voiture, c'est moyen finalement : Si j'ai d'autre RigidBody dans la scene ( genre un poteau que j'aurai fait tomber) si je m'en éloigne, il se retrouve dans le vide et tombe à travers la map..
De plus, 65k parcelles, c'est d'autant plus de drawCall..

l'idée serait de faire :
- quadtree jusqu'à avoir 64 parcelles ( pour rester sous les 65k tri chacune avec marge), donc 64 parcelles pour l'affichage/mesh
- je continue mon quadtree pour "subdiviser" les parcelles en petit meshCollider( miniParcelle), j'ajoute à chaque parcelle tout les mesh Collider qui lui appartienne. ( éventuellement en cours de jeux, au début pour réduire le temps de chargement)
- me retrouve avec toute la map contenant les collider, ça sera pour tout le reste autre que la voiture.
- InGame tout les n Update, je check ma position pour retrouver la miniParcelle sur laquelle je suis, ses voisine direct ( fonction de la dircetion de la voiture) et je fais un mesh collider avec toute ( 3 maximum) . ça sera LE collider pour la voiture.
- Du coup je pourrais "Smoother" mon collider pour la voiture

qu'en pense tu?

Pour l'acces au mesh, oui j'avais lu aussi. De toute façon je suis déja dans le cas de manipuler de Array ou list ( vu que multiThread) et seulement a la fin je prend ces list/array pour faire les mesh.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Alesk
Messages : 1928
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par Alesk » 05 Oct 2018 18:14

Heuuu... alors...

Moi je tenterais ça :
- Faire des gameobjects avec les meshes de la manière la plus optimale, sans se soucier des colliders.
- Garder le quadtree pour mémoriser les triangles uniquement pour générer les colliders.
- Générer un collider pour chaque point d'impact potentiel que ça soit pour le véhicule ou des éléments du décors avec la méthode que j'ai décrite plus haut (celle où on pioche les triangles pour mettre à jour le mesh du collider)

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par djulio74 » 05 Oct 2018 18:42

Je viens de tout comprendre enfin! :hehe:
oui j'avais pas vu ça que chacun gère son collider en fait. Et le collider de chacun n'aurait qu’une poignée de triangles... ookkk! ^^

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Twiixy
Messages : 177
Inscription : 04 Déc 2016 09:38

Re: [WIP] Simu Course réaliste + Map + Volant

Message par Twiixy » 11 Nov 2018 11:47

Salut Djulio, très intéressant comme post, je suis justement en train de finir la création d'un véhicule que je compte bien pouvoir conduire dans Unity, le réalisme au niveau des pneus et de la conduite m'attire beaucoup. Peux être verras t'on un WIP de ma part aussi :-D .
En tout cas ton proto me plait bien et j'espère que tu le mèneras à terme, si tu a besoin d'un véhicule complet avec l'intérieur de modélisé pour une immersion total au volant n'hésite pas à demander.

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par djulio74 » 11 Nov 2018 16:22

Salut Twiixy !
Merci pour ton commentaire.
Pour avoir pas mal étudié le domaine de la recherche de réalisme des pneu / conduite, et testé beaucoup de possibilités, je te déconseille d'ors et déja d'utiliser les whell collider d'unity. Ils ne sont pas du tout adapté.

Par contre je te conseil vivement de te pencher du côté des magic formula de Hans Pacejka. Il y a eu pas mal de versions au fil des années. Même les première peut servir de bonnes bases pour bien comprendre et la mettre en place dans unity (pacejka 95 ou 98), avec utilisation de raycast hit simple. Après tu peux passer sur les dernière (pacejka 2002), qui sont beaucoup plus pointue niveau réalisme, mais du coup bien plus compliqué à configurer pour obtenir les bonnes forces.
Je pourrais épiloguer toute la journée tellement j'en ai lu sur le sujet ::d :hehe:, vais donc m'arrêter là, et quand tu t'y mettra, avec plaisir je pourrais te conseiller. :super:

Merci pour ta proposition de modélisation, je garde sous le coude même si j'aime beaucoup aussi modéliser :)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Twiixy
Messages : 177
Inscription : 04 Déc 2016 09:38

Re: [WIP] Simu Course réaliste + Map + Volant

Message par Twiixy » 12 Nov 2018 07:29

C'est intéressant mais niveau performance ça donne quoi ? Je pourrait bien faire tout ça dans les Jobs mais si c'est trop complexe sa risque de ne pas suffire pour gérer 20/30 véhicule en même temps :? .
Sinon ayant déjà fait quelques recherche sur le sujet, j'ai aussi cru comprendre que les wheel collider n'était vraiment pas réaliste et que beaucoup regrettait celle de Unity 4. Peux être qu'ont peux arriver à mieux en utilisant une version perso faite de raycast et de collider.

djulio74
Messages : 432
Inscription : 19 Déc 2009 22:55
Contact :

Re: [WIP] Simu Course réaliste + Map + Volant

Message par djulio74 » 12 Nov 2018 07:51

Comme je te l'ai dit, commencer par des raycast, juste un par roue vers le bas. ( pas mon usine a gaz du premier post ici :hehe: )
Si tu regarde du coté de pacejka, tu verra qu'il te faut juste quelques donnée en temps réel en input, qui peuvent être récupérée via les raycast, ou en découler avec quelques ligne de code. Et ça te permettra déjà de gérer amortisseurs, barre anti-roulis et pneu évidemment.

Donc niveau perf, bah c'est juste l'équivalent de 4 raycast par voiture ;-) :super:

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Twiixy
Messages : 177
Inscription : 04 Déc 2016 09:38

Re: [WIP] Simu Course réaliste + Map + Volant

Message par Twiixy » 12 Nov 2018 08:02

C'est décidé, je finit mon véhicule et je m'y met ! Au vue de ta description ça devrait être assez rapide niveau calcul en utilisant les jobs, merci pour la piste, tu ma surement évité de foncer droit dans le mur :lol:

Répondre

Revenir vers « Vos créations, jeux, démos... »