[MY-AL] Ray2D bounce (Vector2.reflect)

Pour les scripts écrits en C#
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
pcpunch
Messages : 21
Inscription : 22 Fév 2018 12:21

[MY-AL] Ray2D bounce (Vector2.reflect)

Message par pcpunch » 04 Juil 2020 20:26

Bonjour

J' essaye de réaliser une prédiction de trajectoire en 2D pour un jeu style Billard, mais j'ai des soucis avec la prédiction de la seconde ligne :diable: , elle n'est pas très loin de la vérité mais ce n'est pas ça ! J'utilise la physique : Addforce pour lancer la balle.

Par moment la seconde ligne disparaît selon la rotation mais je pense que cela vient du même soucis au niveau Vector2.Reflect ?

Voici mon code :

Code : Tout sélectionner

 private void FixedUpdate()
    {        
        //First line
        hit = Physics2D.Raycast(transform.position, transform.right);
        Debug.DrawLine(transform.position, hit.point);

        //Second line       
        Vector2 direction = Vector2.Reflect(hit.point.normalized, hit.normal);
        hit2 = Physics2D.Raycast(hit.point, direction);
        Debug.DrawLine(hit.point, hit2.point);
    }
Image

Merci pour votre aide, car je m'arrache les cheveux !

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7914
Inscription : 30 Juil 2011 13:57

Re: [MY-AL] Ray2D bounce (Vector2.reflect)

Message par Max » 05 Juil 2020 17:28

BOnjour,

je pense que le point de départ de ton second Raycast (hit.point) doit se situer pile sur le Boxcollider, il en résulte la plupart du temps une détection ... au point de départ. D'ailleurs tu peux regarder ton Hit2.distance, je suis presque sûr qu'il est à 0 dans ce cas.
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

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

Re: [MY-AL] Ray2D bounce (Vector2.reflect)

Message par djulio74 » 05 Juil 2020 17:45

Je dirai la même chose que max, en ajoutant que pour résoudre le soucis, il faudrait ajouter un offset au point de départ de ton raycast.
En gros pour tes ray qui partent d'un point A dans une direction B, il faut ajouter à A une partie de B.
Donc au lieu de raycast( point À, direction B), avoir plutôt un raycast (point À + 0,01 *direction B, direction B), avec le multiplicateur 0,01 à ajuster en fonction de l'échelle de ton billard.
Ça permettra donc d'avoir le point de départ légèrement décalé pour éviter que la détection se fasse des le départ du rayon, si comme du max le point de départ est déjà dans le collider.

De plus je rajouterai aussi que ton utilisation du vector2.reflect n'est pas bonne.
Tu fais le reflet d'une position au lieu de faire le reflet d'une direction. Tu as de la chance, dans ton cas cela fonctionne car ton point de départ du premier raycast est à l'origine ( vector2 0,0), et donc le premier hit point correspond à la direction aussi.
Donc ça fonctionne au premier lancé mais si tu continue tu verra vite le soucis si tu relance la bille depuis un autre point.

Pour avoir la direction de la deuxième trajectoire, il te faut plutôt faire

Code : Tout sélectionner

Vector2 direction2 = Vector2.Reflect(- direction1.normalized, hit.normal);

Avec direction1 la direction du premier raycast, a savoir transform.right dans ton cas.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

pcpunch
Messages : 21
Inscription : 22 Fév 2018 12:21

Re: [MY-AL] Ray2D bounce (Vector2.reflect)

Message par pcpunch » 06 Juil 2020 13:12

Merci pour votre retour, j'ai essayé d'appliquer vos recommandations , je pense être bon pour la première ligne ?

Code : Tout sélectionner

 //First line
        Vector2 direction1 = transform.right;
        Vector2 point1 = (Vector2) transform.position +1f * direction1;       
        hit1 = Physics2D.Raycast(point1, direction1);
        Debug.DrawLine(point1, hit1.point);
Image

Mais pour la seconde je sèche :

Code : Tout sélectionner

////Second line  
        Vector2 direction2 = Vector2.Reflect(-direction1.normalized, hit1.normal);
        Vector2 point2 = hit1.point + 1f * direction2;
        hit2 = Physics2D.Raycast(point2, direction2);
        Debug.DrawLine(point2, hit2.point);
Image

Merci pour vos retours.
Cordialement

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

Re: [MY-AL] Ray2D bounce (Vector2.reflect)

Message par djulio74 » 06 Juil 2020 13:31

Alors l'erreur viens peut-être de mon conseil, essaye en enlevant le moins dans le reflect de la direction2.
Appartements la direction 2 est dans la mauvaise direction, donc le décalage porte ton départ du raycast 2 hors du billard et donc avec la mauvaise direction, rien n'est détecté dans ton raycast 2, alors le hit2 est le veto 2 null, soit le l'origine de ta scène.

Pour être sur tu peux aussi tracer un débug. Drawray en plus du drawline.
Le drawline trace une ligne entre deux point, alors que Drawray trace une ligne depuis un point dans une direction donnée.
Ça devrait ressembler à :
Débug.DrawRay(hit1.point, direction 2)
A vérifier la syntaxe.
Tu verra de suite si le raycast part bien dans la bonne direction

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « (C#) CSharp »