Page 1 sur 1

points de contact et normale d'une collision

Publié : 05 Déc 2021 02:24
par Kaloverian
bonjour,

J'essaie d'écrire un petit script simple qui me donne les points de contact et la normale au premier point de contact d'une collision entre un objet A à l'intérieur d'un objet B plus grand.C'est l'objet A qui se déplace à l'aide des touches grâce à un autre script.
Ce script ne retourne rien dans la console.au moment de la collision.
Pourquoi?Qu'ai-je oublié?

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class essai : MonoBehaviour
{
    public GameObject objB;
    public Collision objA;
   

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
      
    }

    void OnCollisionEnter(Collision objA)
    
    {
        ContactPoint[] contacts = new ContactPoint[10];

      
        print("nombre de points de contact: " + objA.contacts.Length);
        print("First normal of the point that collide: " + objA.contacts[0].normal);

    }

    

}


Re: points de contact et normale d'une collision

Publié : 05 Déc 2021 09:34
par jmhoubre
1) Quel objet a le rigidbody ?
2) ObjA est déclaré au début, mais c'est également le nom du paramètre de OnCollisionEnter. Du coup je ne sais pas trop quel objet est pris en compte dans objA.contacts.Length.

Re: points de contact et normale d'une collision

Publié : 05 Déc 2021 22:37
par jmhoubre
Test rapide chez moi, cela fonctionne : j'ai 1 point de contact et sa normale.

Re: points de contact et normale d'une collision

Publié : 06 Déc 2021 00:22
par Kaloverian
non je vois rien d'affiché dans la console.
Dans chaque Rigidbody,faut-il cocher is Kinemtic?
Dans chaque Box Collider,faut-il cocher Is Trigger?

Une capture d'écran de ce qui est affiché dans votre console à l'impact?

Re: points de contact et normale d'une collision

Publié : 14 Déc 2021 23:23
par Kaloverian
j'ai compris d'où vient le problème
code corrigé

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class essai : MonoBehaviour
{
    public GameObject objB;
    public Collision objA;
   

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
      
    }

    void OnCollisionEnter(Collision objA)
    
    {
        ContactPoint[] contacts = new ContactPoint[10];

      
        Debug.Log("nombre de points de contact: " + objA.contacts.Length);
        Debug.Log("First normal of the point that collide: " + objA.contacts[0].normal);

    }

    

}

objet A et objet B ont un Rigidbody et un Box Collider(dont is Trigger décoché)

mais il réside un nouveau problème:
mon objet A est à l'intérieur de l'objet B.
Donc au début, il y a une collision (ce que je ne souhaite pas !)
Je veux qu'il y ait une collision lorsque l'objet A ne heurte que la surface de l'objet B
Comment puis-je ajouter une boîte de collision de l'objet B qui n'enveloppe que la surface de l'objet B ?

Re: points de contact et normale d'une collision

Publié : 15 Déc 2021 00:03
par jmhoubre
Dans ton code objA est une collision. Que sont objet A et objet B ? Ne le sachant pas, j'ai du mal à imaginer pourquoi il y a une collision au début.
Tu as touché quelque chose dans les rigidbody ? Les coordonnées sur Oy des objets bougent en mode Play ?

Re: points de contact et normale d'une collision

Publié : 15 Déc 2021 02:36
par Kaloverian
code encore modifié

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class normale_au_point_contact : MonoBehaviour
{
    
 
     public Collider thisCollider,otherCollider;
   


   

    Vector3 vect;

    int i;
   

    // Start is called before the first frame update
    void Start()
    {
     
    }

    // Update is called once per frame
    void Update()
    {
      
    }

    void OnCollisionEnter(Collision otherCollider)
    
    {
        ContactPoint[] contacts = new ContactPoint[10];
        

         
         
      

     //donne le nombre de points de contact 
    Debug.Log("nombre de points de contact: " + otherCollider.contacts.Length);
    
    //donne le vecteur normal au premier point de contact
    Debug.Log("First normal of the point that collide: " + otherCollider.contacts[0].normal);
    
    //donne le tag de thisCollider
    Debug.Log("le collisionneur est :"+thisCollider.gameObject.tag);
    
    //donne le tag de otherCollider
    Debug.Log("l'autre collisionneur est :"+otherCollider.gameObject.tag);
    
    //donne les coordonnées de chaque point de contact
    for(int i=0;i<otherCollider.contacts.Length;i++)
    {
        Debug.Log("point de contact "+i+" : "+contacts[i]);
        Debug.Log("vcoordonnées du point de contact "+i+" : ("+otherCollider.contacts[i].point.x+","+otherCollider.contacts[i].point.y+","+otherCollider.contacts[i].point.z+")");
         Debug.Log("---------------------------------------------");
    }

    }

    

}

objet A est thisCollider
objet B est otherCollider
j'attache ce script à objet A

Et là c'est plus clair ?
Si oui,je repose ma question précédente

Re: points de contact et normale d'une collision

Publié : 15 Déc 2021 17:15
par jmhoubre
Bonjour,

merci de répondre à mes questions.
De plus, quand tu publies du code, prends soin de faciliter la tâche des lecteurs en vérifiant l'indentation, et en supprimant les lignes inutiles (non seulement les séries de lignes vides, mais également les fonctions vides).

Re: points de contact et normale d'une collision

Publié : 15 Déc 2021 22:11
par Kaloverian
je pense avoir trouvé la solution à mon problème avec OnCollisionExit en s'inspirant de cette question non résolue:
https://answers.unity.com/questions/914 ... nexit.html