points de contacts entre collision et différents plans

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
Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

points de contacts entre collision et différents plans

Message par Kaloverian » 10 Avr 2024 03:21

bonjour,

Je n'arrive pas à corriger ce code qui devrait déterminer 2 points de contact:le 1er entre collision (plan horizontal) et objet[0] et le 2nd entre collision et objets[1]
objets sont des plans verticaux intersectant collision

Code : Tout sélectionner

using System.Collections.Generic;
using UnityEngine;

public class several_adjacents_planes_cut_2 : MonoBehaviour
{
    public GameObject collision;
    public GameObject point;
    public GameObject[] objets;
    List<GameObject> ListPoints = new List<GameObject>();
    private bool collisionDetected = false;
    Vector3 echelle_plan;
    float decalage_mask_x, decalage_mask_z;
    int k = 0;

    void Start()
    {
        echelle_plan = collision.GetComponent<Transform>().localScale;

     }

    void OnCollisionEnter(Collision collision)
    {
        if (!collisionDetected && IsPointOnPlane(objets[k], collision.contacts[0].point, 0.001f))
        {
            ListPoints.Add(Instantiate(point));
            ListPoints[ListPoints.Count - 1].transform.position = collision.contacts[0].point;
            print("collision :" + (ListPoints.Count - 1) + " k :" + k);
            print("point d'intersection n° " + (ListPoints.Count - 1) + " :" + ListPoints[ListPoints.Count - 1].transform.position);

            point.transform.position = ListPoints[ListPoints.Count - 1].transform.position;


            k++;
            collisionDetected = true;
        }
    }

    public bool IsPointOnPlane(GameObject plane, Vector3 point, float tolerance = 0.001f)
    {
        Vector3 normal = plane.transform.up; // Vecteur normal au plan
        float distance = -Vector3.Dot(normal, plane.transform.position); // Distance du plan à l'origine
        float result = Vector3.Dot(normal, point) + distance; // Calcul de la valeur de gauche de l'équation du plan
        return Mathf.Abs(result) < tolerance; // Vérification si la valeur est proche de zéro
    }
}

Pouvez-vous m'aider?


merci de votre aide
Dernière édition par Kaloverian le 10 Avr 2024 19:13, édité 1 fois.

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

Re: points de contacts entre collision et différents plans

Message par boubouk50 » 10 Avr 2024 08:53

Si le plan de collision est horizontal, alors il est défini par sa hauteur Y par rapport à l'origine.
Pour savoir si un point est sur un plan, alors il faut que le Y du point = Y du plan.

Sinon, tu passes collisionDetected à true dans la première collision, donc tu n'en feras pas deux.
Si tu nous expliquais ton code, ce serait plus facile pour nous. Parce que là, c'est brouillon, on ne sait pas trop où tu vas.
"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

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: points de contacts entre collision et différents plans

Message par Kaloverian » 11 Avr 2024 15:29

j'ai corrigé mon script par celui-ci:

Code : Tout sélectionner

using System.Collections.Generic;
using UnityEngine;

public class several_adjacents_planes_cut : MonoBehaviour
{
  
    public GameObject point;
  
    GameObject monObjet;

    List<GameObject> ListPoints = new List<GameObject>();
    Vector3 echelle_plan;
    
   
void Start()
    { //objet auquel ce script est attaché
        monObjet = gameObject;

        echelle_plan = monObjet.GetComponent<Transform>().localScale;

               
    }

    void OnCollisionEnter(Collision col)
    {
        // Vérifiez le tag de l'objet avec lequel cet objet entre en collision
        if (col.gameObject.CompareTag("plan1"))
        {
            // Accédez au premier point de contact avec Objet1 s'il y en a
            if (col.contacts.Length > 0)
            {
                ContactPoint firstContact = col.contacts[0];
                Vector3 contactPoint = firstContact.point;
                GameObject newPoint = Instantiate(point);
                newPoint.transform.position = contactPoint;
                ListPoints.Add(newPoint);
                Debug.Log("Premier point de contact avec plan1 : " + contactPoint);

           
         }
          else
          {
              Debug.Log("Aucun point de contact avec plan1.");
          }
      }
      else if (col.gameObject.CompareTag("plan2"))
      {
          // Accédez au premier point de contact avec Objet2 s'il y en a
          if (col.contacts.Length > 0)
          {
              ContactPoint firstContact = col.contacts[0];
              Vector3 contactPoint = firstContact.point;
              GameObject newPoint = Instantiate(point);
              newPoint.transform.position = contactPoint;
              ListPoints.Add(newPoint);
              Debug.Log("Premier point de contact avec plan2 : " + contactPoint);

       
           }
          else
          {
              Debug.Log("Aucun point de contact avec plan2.");
          }
      }
  }


}
Ce script est attaché au plan horizontal intersecté par 2 plans verticaux.(cf image jointe)
Capture d’écran 2024-04-11 à 15.25.06.png
Capture d’écran 2024-04-11 à 15.25.06.png (342.13 Kio) Consulté 438 fois
La position du 1er point de contact entre le plan horizontal et le 1er plan vertical tagué "plan1" est correcte.
La position du 1er point de contact entre le plan horizontal et le 2nd plan vertical tagué "plan2" est fausse.Pourquoi cela?

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

Re: points de contacts entre collision et différents plans

Message par boubouk50 » 11 Avr 2024 15:53

Ça veut dire quoi "fausse" ?
Tu as bien un calcul de fait ? Tu as un Debug qui te donne le contactPoint ? Quelle est la valeur ? Où est situé ce point ?

Un plan qui collisionne avec un plan est une droite, donc une infinité de positions, pas un point unique. Donc déjà ton intention de départ n'est pas bonne. Ici, ce sont des plans bordés, donc, ce sera un segment, mais ça reste tout de même une infinité de positions.

From inside OnCollisionStay or OnCollisionEnter you can always be sure that contacts has at least one element.
col.contacts.Length devrait donc toujours être supérieur à 0. Si ce n'est pas le cas, cela veut dire que tu as une collision sans contact, ce qui contredit la documentation.

Je passe toujours plus de temps à te soutirer les infos importantes qu'à te répondre, ça te dirait de faire un petit effort au bout de toutes ces années d'aide stp ? Je compte plus le nombre de fois que je te le demande, ça commence à devenir réellement pénible, malgré ma patience plutôt grande.
"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

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: points de contacts entre collision et différents plans

Message par Kaloverian » 11 Avr 2024 17:00

"Ça veut dire quoi "fausse" ?"
cf image on play:
Capture d’écran 2024-04-11 à 16.57.44.png
Capture d’écran 2024-04-11 à 16.57.44.png (295.09 Kio) Consulté 422 fois
Le point de contact(une sphère de faible scale) sur lequel le repère orthonormé est attaché est faux en position

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

Re: points de contacts entre collision et différents plans

Message par boubouk50 » 11 Avr 2024 17:25

Est-ce que le collider sur le plan est bien positionné ? Est-il plan lui aussi ?
As-tu un scale différent de 1 sur le plan ou sur les colliders ?
Est-ce que la sphère est enfant d'un objet ? Si oui, est-ce que ses parents ont un scale différent de 1 ?
"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

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: points de contacts entre collision et différents plans

Message par Kaloverian » 11 Avr 2024 18:12

Le collider utilisé sur chaque plan est un BoxCollider
cf image:
Capture d’écran 2024-04-11 à 18.06.44.png
Capture d’écran 2024-04-11 à 18.06.44.png (67.29 Kio) Consulté 400 fois
Le scale y de chaque plan est 0.1f. Les autres scales(scale_x et scale_z sont à 1)
Sphère a un SphereCollider
Tous les objets sont pourvus d'un Rigidbody avec contraintes cochées et UseGravity décochée

Le résultat obtenu après un play est encore + désastreux:
Capture d’écran 2024-04-11 à 18.05.59.png
Capture d’écran 2024-04-11 à 18.05.59.png (394.05 Kio) Consulté 400 fois
J'attends ce résultat:
résultat attendu.png
résultat attendu.png (375.53 Kio) Consulté 334 fois
les points de contacts attendus sont encadrés en noir

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: points de contacts entre collision et différents plans

Message par Kaloverian » 16 Avr 2024 04:24

je n'arrive pas à introduire cette classe:
https://docs.unity3d.com/Packages/com.u ... elper.html
afin d'utiliser les fonctions de IntersectionHelper:
https://respawnpoint.net/intersectionhe ... 7aadad94b3

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

Re: points de contacts entre collision et différents plans

Message par boubouk50 » 16 Avr 2024 09:31

Le package est expérimental, tu ne peux donc pas y accéder tant qu'il ne passe pas en pre-released (si jamais il y passe).
Il te faudra alors autoriser l'installation des packages en développement :
Project Settings > Package Manager > Advanced Settings > Enable Pre-released Packages
"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

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: points de contacts entre collision et différents plans

Message par Kaloverian » 16 Avr 2024 18:32

Dois-je acheter ceci:
https://assetstore.unity.com/packages/t ... per-103033

pour que ça fonctionne?

Répondre

Revenir vers « (C#) CSharp »