Sélectionne le point le plus proche , c'est le seul que tu as à traiter.
ça n'a aucun intérêt .- Le nombre de collision
Voila , ça c'est utile- Le point où les collisions se sont effectués

C'est ton point d'origine en clair ? donc oui , tu en as besoin.- Le point antérieur au déplacement qui a causé la collision
Tu n'en as pas besoin pour la réponse ,tu devras calculer la normale du plan de glissement.- la normale du/des triangles ayant subis la collision.
Donc tu as besoin :
-Du point de collision
-La distance de la Sphère au point de collision (pour replacer la sphère)
-L'origine de la sphère
-La vitesse
et rien d'autre.
Et là je recopie ce que j'ai écrit dans le post précédent , parce que je ne vois pas comment le dire autrement. Regarde aussi le code.
Si tu n'as pas de collision , tu te déplaces normalement ,*PositionInitiale c'est la position d'origine de ta sphère si tu préfères.
Code : Tout sélectionner
;Il n'y a pas de collision, on peut se déplacer normalement
If InfosCollision\CollisionDetectee = #False
*PositionFinale\x = *PositionInitiale\x + *Vitesse\x
*PositionFinale\y = *PositionInitiale\y + *Vitesse\y
*PositionFinale\z = *PositionInitiale\z + *Vitesse\z
ProcedureReturn
EndIf
Puisqu'on déplace notre sphère, on calcule son NouveauPointOrigineSinon dans ReponseCollision() dans le cas d'une collision:
- On se place au point de collision trouvé
Code : Tout sélectionner
;Initialise NouveauPointOrigine
NouveauPointOrigine\x = *PositionInitiale\x
NouveauPointOrigine\y = *PositionInitiale\y
NouveauPointOrigine\z = *PositionInitiale\z
;On se replace un peu avant le point de d'intersection calculé dans TestCollision()
If InfosCollision\DistanceLaPlusCourte > DistanceTresFaible
V\x = *Vitesse\x
V\y = *Vitesse\y
V\z = *Vitesse\z
LongueurVecteur(@V, InfosCollision\DistanceLaPlusCourte - DistanceTresFaible)
NouveauPointOrigine\x + V\x
NouveauPointOrigine\y + V\y
NouveauPointOrigine\z + V\z
;Et on déplace aussi le point d'intersection de façon à ne pas être en collision sur le plan de glissement
Normalise(@V)
InfosCollision\PointIntersection\x - DistanceTresFaible * V\x
InfosCollision\PointIntersection\y - DistanceTresFaible * V\y
InfosCollision\PointIntersection\z - DistanceTresFaible * V\z
EndIf
Il y a plusieurs façons de définir un plan (wikipédia)- On calcule le plan de glissement (il est tangent à la sphère au point de collision).
Ici on utilise Un point et un vecteur normal.Un plan est uniquement défini par :
* Trois points distincts et non alignés.
* Une droite et un point n'appartenant pas à cette droite.
* Deux droites non confondues et sécantes.
* Deux droites non confondues et parallèles.
* Un point et un vecteur normal.
- Le point , c'est le point de collision.
- La normale ,c'est le vecteur allant du point de collision au centre de la sphère , comme le rayon de la sphère est 1 , c'est inutile de normer le vecteur, je viens de m'apercevoir que je le faisais, je l'ai viré du code

Code : Tout sélectionner
;Determine le plan de glissement
PlanDeGlissement\Origine\x = InfosCollision\PointIntersection\x
PlanDeGlissement\Origine\y = InfosCollision\PointIntersection\y
PlanDeGlissement\Origine\z = InfosCollision\PointIntersection\z
PlanDeGlissement\Normale\x = NouveauPointOrigine\x - InfosCollision\PointIntersection\x
PlanDeGlissement\Normale\y = NouveauPointOrigine\y - InfosCollision\PointIntersection\y
PlanDeGlissement\Normale\z = NouveauPointOrigine\z - InfosCollision\PointIntersection\z
;Normalise(@PlanDeGlissement\Normale)
PlanDeGlissement\Constante = -(PlanDeGlissement\Normale\x*PlanDeGlissement\Origine\x+PlanDeGlissement\Normale\y*PlanDeGlissement\Origine\y+PlanDeGlissement\Normale\z*PlanDeGlissement\Origine\z)
Calcul du point de destination initiale- On en déduit la nouvelle vitesse en faisant une projection du point de destination initiale sur le plan de glissement.
Code : Tout sélectionner
;Calcul le point de destination ( comme s'il n'y avait pas de collision)
PointDestination\x = *PositionInitiale\x + *Vitesse\x
PointDestination\y = *PositionInitiale\y + *Vitesse\y
PointDestination\z = *PositionInitiale\z + *Vitesse\z
Code : Tout sélectionner
;Nouveau point de destination
Longueur.f=IntersectionRayonPlan(@Pointdestination,@PlanDeGlissement\Normale,@PlanDeGlissement)
NouveauPointDestination\x = PointDestination\x + Longueur * PlanDeGlissement\Normale\x
NouveauPointDestination\y = PointDestination\y + Longueur * PlanDeGlissement\Normale\y
NouveauPointDestination\z = PointDestination\z + Longueur * PlanDeGlissement\Normale\z
Code : Tout sélectionner
;Calcul la nouvelle vitesse (le long du plan de glissement)
NouvelleVitesse\x = NouveauPointDestination\x - InfosCollision\PointIntersection\x
NouvelleVitesse\y = NouveauPointDestination\y - InfosCollision\PointIntersection\y
NouvelleVitesse\z = NouveauPointDestination\z - InfosCollision\PointIntersection\z
- On Reboucle avec les nouveaux paramètres que l'on vient de calculer ,à savoir la nouvelle position et le nouveau vecteur vitesse , jusqu'à ce que la vitesse soit nulle
Code : Tout sélectionner
Test si la vitesse est nulle (ou faible)
;Inutile de reboucler si la nouvelle vitesse est faible
If Longueur(@NouvelleVitesse) <= DistanceTresFaible
*PositionFinale\x = NouveauPointOrigine\x
*PositionFinale\y = NouveauPointOrigine\y
*PositionFinale\z = NouveauPointOrigine\z
ProcedureReturn
EndIf
Code : Tout sélectionner
ReponseCollision(*PositionFinale, @NouveauPointOrigine, @NouvelleVitesse)