ne retourne pas tous les points de contact

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
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: ne retourne pas tous les points de contact

Message par jmhoubre » 10 Jan 2022 19:47

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.

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

Re: ne retourne pas tous les points de contact

Message par Kaloverian » 11 Jan 2022 00:51

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

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: ne retourne pas tous les points de contact

Message par jmhoubre » 11 Jan 2022 12:55

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.

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

Re: ne retourne pas tous les points de contact

Message par Kaloverian » 11 Jan 2022 16:04

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?

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: ne retourne pas tous les points de contact

Message par jmhoubre » 12 Jan 2022 01:20

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.

Répondre

Revenir vers « (C#) CSharp »