Vous pourriez penser que, puisque vos murs sont alignés avec les axes de coordonnées, il est logique d'écrire un code spécial (pour un mur vertical, annulez la coordonnée x de la vitesse ; pour un mur horizontal, annulez la coordonnée y de la vitesse). Cependant, une fois que vous avez réussi à faire fonctionner le jeu avec des murs verticaux et horizontaux, la prochaine chose à laquelle vous penserez probablement est "qu'en est-il des murs à angles arbitraires ?". Il vaut donc la peine de penser au cas général dès le début.
Dans le cas général, supposez que votre missile a une vitesse v et frappe un mur dont la normale à la surface est n .
Split v en composants u perpendiculaire à la paroi et w parallèle à celle-ci.
Où :
u \= ( v - n / n - n ) n
w \= v u
Ici, v - n est le produit scalaire des vecteurs v y n . Voir le lien pour une explication sur la façon de le calculer. Le produit scalaire n - n est évalué au carré de la longueur du vecteur normal ; si vous gardez toujours vos normales sous la forme de vecteurs unitaires puis n - n \= 1 et vous pouvez omettre la division.
Après le rebond, la composante du mouvement parallèle au mur est affectée par la friction. f et la composante perpendiculaire à la paroi est affectée par l'élasticité, qui peut être donnée sous la forme de a coefficient de restitution r .
Donc la vitesse après la collision est de v \= f w r u . Dans une collision parfaitement élastique et sans frottement, v \= w u c'est-à-dire que le mouvement est réfléchi autour de la normale au point de collision, comme dans le schéma donné dans la réponse de Bill.
Cette approche fonctionne de la même manière en trois dimensions.
(Il s'agit évidemment d'une notion très simplifiée du rebondissement ; elle ne tient pas compte du moment angulaire ou de la déformation. Mais pour de nombreux types de jeux vidéo, ce type de simplification est parfaitement adéquat).
2 votes
Il s'agit d'un problème dont la solution deviendrait probablement immédiatement évidente si vous alliez faire une partie de billard.