Publié : mer. 30/nov./2005 21:21
Comme je te l'ai dit dans le post précédent , la procédure TestCollision() retourne le point de collision et la distance la plus courte , donc déjà commence par faire ça ! inutile de traiter plusieurs collisions.
Sélectionne le point le plus proche , c'est le seul que tu as à traiter.
, mais seulement le plus proche.
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.
- 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
Pour la projection du point de destination
Et finalement la nouvelle vitesse s'obtient ainsi :
On reboucle avec les nouveaux paramètres
Et ensuite tu as juste à placer ton Entity à la positionFinale.
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)