Page 1 sur 2

points de contacts entre collision et différents plans

Publié : 10 Avr 2024 03:21
par Kaloverian
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

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

Publié : 10 Avr 2024 08:53
par boubouk50
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.

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

Publié : 11 Avr 2024 15:29
par Kaloverian
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é 1419 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?

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

Publié : 11 Avr 2024 15:53
par boubouk50
Ç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.

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

Publié : 11 Avr 2024 17:00
par Kaloverian
"Ç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é 1403 fois
Le point de contact(une sphère de faible scale) sur lequel le repère orthonormé est attaché est faux en position

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

Publié : 11 Avr 2024 17:25
par boubouk50
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 ?

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

Publié : 11 Avr 2024 18:12
par Kaloverian
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é 1381 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é 1381 fois
J'attends ce résultat:
résultat attendu.png
résultat attendu.png (375.53 Kio) Consulté 1315 fois
les points de contacts attendus sont encadrés en noir

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

Publié : 16 Avr 2024 04:24
par Kaloverian
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

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

Publié : 16 Avr 2024 09:31
par boubouk50
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

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

Publié : 16 Avr 2024 18:32
par Kaloverian
Dois-je acheter ceci:
https://assetstore.unity.com/packages/t ... per-103033

pour que ça fonctionne?