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.
ne retourne pas tous les points de contact
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
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
- Kaloverian
- Messages : 345
- Inscription : 10 Août 2016 03:03
Re: ne retourne pas tous les points de contact
pour avoir le nombre total de points de contact,j'ai résolu leproblème avec ce script:
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
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);
}
}
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
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é.
4 cas, selon le nombre de Rigidbody :
Tu as pas mal de tuto officiels sur la physique.
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.");
}
}
- 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.
Tu as pas mal de tuto officiels sur la physique.
- Kaloverian
- Messages : 345
- Inscription : 10 Août 2016 03:03
Re: ne retourne pas tous les points de contact
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?
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
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.
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.