Page 2 sur 2

Re: ne retourne pas tous les points de contact

Publié : 10 Jan 2022 19:47
par jmhoubre
La notion de simultanéité est toute relative : l'humain perçoit 2 événements comme simultanés alors qu'un ordinateur cadencé en GHz les différencie bien.
Dans ton projet, chaque sphère a un collider et un script avec une méthode gérant OnColliderEnter : le système de collision d'Unity détecte une collision, mais envoie l'événement aux 2 objets. Je pense qu'en ajoutant le nom de l'objet dans le Debug.Log tu constateras qu'il y a bien 2 appels de OnCollisionEnter.

Re: ne retourne pas tous les points de contact

Publié : 11 Jan 2022 00:51
par Kaloverian
pour avoir le nombre total de points de contact,j'ai résolu leproblème avec ce script:

Code : Tout sélectionner

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

/

public class total_number_contact_points : MonoBehaviour
{
    public SphereCollider thisSphereCollider,otherSphereCollider;
 
    int a;
    
    Vector3 vect;

   float time;

    int i;

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

    }

    // Update is called once per frame
   void Update()
    {
    
        time=Time.time;
     
    
         
   }

 
    void OnCollisionEnter(Collision otherSphereCollider)
    
    {
        ContactPoint[] contacts = new ContactPoint[100];
    
         
         
      
     
    
      Debug.Log("nombre de points de contact: " + otherSphereCollider.contacts.Length);
      Debug.Log("First normal of the point that collide: " + otherSphereCollider.contacts[0].normal);
        
      
    

    for(int i=0;i<otherSphereCollider.contacts.Length;i++)
    {
       Debug.Log("point de contact "+i+" : "+contacts[i]);
   
       
        

   
         Debug.Log("vcoordonnées du point de contact "+i+" : ("+otherSphereCollider.contacts[i].point.x+","+otherSphereCollider.contacts[i].point.y+","+otherSphereCollider.contacts[i].point.z+")");
      

        
    }

     Debug.Log("collision du SphereCollider au temps :"+time);
      Debug.Log("le collisionneur est :"+thisSphereCollider.gameObject.tag);//pose toujours problème même avec thisCollider à la place de thisObject
      Debug.Log("le déclencheur est :"+otherSphereCollider.gameObject.tag);
      Debug.Log("---------------------------------------------");

   
     a+= otherSphereCollider.contacts.Length;
     Debug.Log("nombre total de points de contact :"+a);
     
    }
    
    
 
 }
Mais une autre question survient:
Quand par exemple une sphère1 rentre dans une sphère 2,ce script ne retournepas tous les points de contact.On se rend bien compte que lorsque sphere 1 rentre dans sphère 2,tous les points de contact se situent sur une latitude de la sphère 2 qui se déplace au fur et à mesure qu'elle rentre dans sphère 1.On voit bien que le nombre de points de contact est infini alors que mon script n'en retourne que 2!
Je pense alors à la fonction OnCollisionStay mais je n'arrive à bien l'mplémenter

Re: ne retourne pas tous les points de contact

Publié : 11 Jan 2022 12:55
par jmhoubre
Bonjour,

j'ai fini par faire un petit projet pour reproduire ton souci.
- une sphère fixe avec collider et le script et isMobile décoché.
- une sphère mobile, disjointe, avec le script et isMobile coché.

Code : Tout sélectionner

using UnityEngine;

public class SphereController : MonoBehaviour
{
 	[SerializeField] private bool isMobile = false;
	[SerializeField] private float speed = 1f;

	private void Update ()
	{
		if (isMobile)
		{
			transform.Translate (Vector3.forward * speed * Time.deltaTime);
		}
	}

	private void OnCollisionEnter (Collision collision)
	{
		Debug.Log ($"{name} touche {collision.gameObject.name} en {collision.contactCount} points.");
	}

	private void OnCollisionStay (Collision collision)
	{
		Debug.Log ($"Stay : {name} touche {collision.gameObject.name} en {collision.contactCount} points.");
	}
}
4 cas, selon le nombre de Rigidbody :
  • aucun rigidbody : pas de collision.
  • un rigidBody sur chaque sphère : 1 seule collision par frame, signalée par 2 lignes de Debug.Log pour OnCollisionEnter et 2 lignes par frame pour OnCollisionStay. La sphère mobile pousse la sphère fixe.
  • un seul rigidbody sur la sphère fixe : pas de collision. La sphère mobile n'a pas de rigidbody, elle est considérée comme fixe par le système physique et est exclue des calculs de collisions (du moins je l'interprète comme cela).
  • un seul rigidbody sur la sphère mobile : 1 seule collision par frame, signalée par 2 lignes de Debug.Log pour OnCollisionEnter et 2 lignes par frame pour OnCollisionStay. La sphère mobile est bloquée.
Je ne vois pas quel est ton souci. Quand 2 sphères avec rigidbody vont l'une vers l'autre, il y a collision (1 fois) en un seul point, puis le système physique entre en action pour éviter qu'il y ait pénétration.

Tu as pas mal de tuto officiels sur la physique.

Re: ne retourne pas tous les points de contact

Publié : 11 Jan 2022 16:04
par Kaloverian
En fait,ce n'est plus les points de colllsion que je cherche mais les points d'intersection des surfaces de 2 objets.
Avec quelle fonction de l'API peut-on obtenir les points d'intersection des surfaces entre chaque objet?

Re: ne retourne pas tous les points de contact

Publié : 12 Jan 2022 01:20
par jmhoubre
S'il y en a, je ne les connais pas. C'est des maths. Genre:

Equation de la sphère A : (X - Xa)^2 + (Y - Ya)^2 + (Z - Za)^2 = Ra^2
Equation de la sphère B : (X - Xb)^2 + (Y - Yb)^2 + (Z - Zb)^2 = Rb^2

Avec Xi, Yi, Zi coordonnées du centre de la sphère i et Ri son rayon. Bon courage.