[CF-AL] Placer des préfabs aléatoirement sur un terrain.

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Manga
Messages : 6
Inscription : 01 Sep 2016 15:11

[CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Manga » 01 Sep 2016 15:41

Bonjour,
Je voulais faire un truc tout bête, mais je ne vois pas trop comment m'y prendre...
J'ai un préfab (de forme cubique pour simplifier) que je souhaite positionner en grande quantité (une cinquantaine) et aléatoirement sur les parties supérieures (parties planes) d'un terrain. Le terrain est construit de façon à ce qu'il ait des parties planes assez larges, précisément à 10m, mais au contour irrégulier. C'est sur ces parties planes que je veux poser mes cubes (car au dessous, il y a de l'eau).
Pour créer les préfabs, j'utilise le code suivant :

Code : Tout sélectionner

for (var i : int = 0; i < 50; i++) {
    var pos : Vector3 = Vector3 (Random.value*500, 10, Random.value*500);
    var rot : Quaternion = Quaternion.Euler (0, Random.value*500, 0);
    myPrefab[i] = Instantiate (Resources.Load ("prefab"), pos, rot);
}
De cette façon, mes cubes sont positionnés et tournés aléatoirement, mais le résultat n'est visuellement pas très bon...
Mais comment compléter ce code pour :
1) positionner mes cubes uniquement sur les parties planes de mon terrain SANS qu'ils dépassent des bords (il ne faut pas qu'un angle sorte du terrain),
2) éviter que mes cubes se chevauchent !
Auriez-vous idée pour faire ces deux choses là ?

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Iwa » 01 Sep 2016 15:46

Il faudrait que tu vérifies une fois ton cube créer que ses Bounds sont contenues dans celle de l'un de tes plans ou dans celle d'un autre cube déjà créer.

Regarde les manipulations de bounds dans la doc :) ça devrait t'aider. Après il y a sûrement d'autres techniques pour faire ça mais c'est la première qui me vient.
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par boubouk50 » 01 Sep 2016 15:51

Avec des tags différents sur ton eau, sur ton terrain et sur tes cubes et un SphereCast. Si le sphereCast ne touche pas d'eau alors le point de collision est entièrement sur le terrain. S'il ne touche pas de cube alors pas de chevauchement.

Tu pourrais également créer un plateau temporaire qui rognerait les bords pour éviter que le cube soit a moitié sur le terrain.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Manga
Messages : 6
Inscription : 01 Sep 2016 15:11

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Manga » 01 Sep 2016 16:23

Oui, de bonnes idées tout ça. Je ne connaissais pas SphereCast... Je vais regarder. Merci bien !

Manga
Messages : 6
Inscription : 01 Sep 2016 15:11

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Manga » 02 Sep 2016 18:09

Alors, j'ai regardé et testé le SphereCast...

Le SphereCast semble être un "gros" RayCast. Il a besoin, pour simplifier, d'un point pour démarrer et d'une direction. Pour tester le contact avec le terrain ou avec l'eau, on doit diriger le rayon (sorte de gros cylindre) vers le bas. Mais, je n'ai pas l'impression que ça résout mon problème car :
1. il faut que le cube avec le SphereCast sorte (complètement) du terrain pour pouvoir identifier l'eau : tant qu'un petit bout du cylindre (représentant le rayon) survole le terrain, le SphereCast montre le terrain. Il peut donc être en dehors => j'aurais des cubes en dehors du terrain. C'est pourquoi, je ne comprends pas ta phrase : "Si le sphereCast ne touche pas d'eau alors le point de collision est entièrement sur le terrain."
2. Si le rayon du SphereCast est dirigé vers le bas, il ne peut pas tester la position des autres cubes. D'autre part, le SphereCast étant directionnel, on ne peut pas le diriger pour qu'il teste tout ce qu'il y a autour de lui. Ou alors, j'ai mal compris comment tu vois les choses.

L'idée d'un "plateau temporaire qui rognerait les bords" me semble une super idée. En fait, je verrais bien une sorte de zone délimitée (plus réduite que les parties planes du terrain) pour placer les cubes dessus. Mais, quel objet utiliser pour ça ? Aurais-tu une idée plus précise ?

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Max » 02 Sep 2016 19:01

Bonsoir,

De ce que j'ai pu lire vite fait, dans ton cas Physics.OverlapSphere semble plus indiqué, ou encore un OverlapBox
;)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Alesk » 02 Sep 2016 19:30

Pourrais-tu envoyer un screenshot de ton terrain, en entourant la zone que tu voudrais couvrir de cubes stp ?

Manga
Messages : 6
Inscription : 01 Sep 2016 15:11

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Manga » 02 Sep 2016 19:59

Voici le terrain. Mais en fait, les cubes doivent être positionnés aléatoirement sur la surface place (toujours à 10m). Si on fait un test sur la hauteur du terrain (on positionne le cube si la hauteur du terrain est >= 9.9), on a toujours des dépassements des coins des cubes (ils sortent du terrain) puisque leur positionnement est par rapport à leur centre.
[img]
image.png
image.png (376.69 Kio) Consulté 4341 fois
[/img]

Je ne connais pas OverlapSphere ni OverlapCube. Je vais regarder aussi. Merci.

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

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Alesk » 02 Sep 2016 22:32

Ok, et tes cubes, tu les veux placés avec un espacement relativement uniforme ?

EDIT :
Bon alors, moi je ferais comme ça :

Une boucle sur chaque axe (X et Z) pour faire un raycast sur tous les points de la map.
Tu pars d'un coin, et tu avances petit à petit, d'une distance un peu inférieure à la taille de ton cube à chaque fois.
à chaque étape, tu vérifies que la position sous le cube correspond à tes critères ( zone plate ) et que ce point se trouve assez loin des cubes précédents pour qu'il n'y ait pas d'impact (il suffit de tester la distance par rapport à la diagonale du cube)
Ensuite tu refais un raycast sous les 4 coins du cube pour vérifier que c'est toujours bien plat et pas dans le vide ... et si tout va bien, tu peux considérer que cette position est valide.

Manga
Messages : 6
Inscription : 01 Sep 2016 15:11

Re: [CF-AL] Placer des préfabs aléatoirement sur un terrain.

Message par Manga » 03 Sep 2016 06:40

Merci. Oui, ça devrait marcher comme ça. J'imaginais une solution plus simple comme une fonction standard permettant d'obtenir le volume produit par l'intersection de deux colliders par exemple, mais avec les fonctions standards de collision, on n'obtient apparemment qu'un point de contact ou un booléen...

Verrouillé

Revenir vers « (Js) Javascript »