J'essaie de créer un jeu 3D simple et j'ai besoin de contraindre le joueur dans les limites du monde du jeu. Lorsque le joueur touche les côtés du monde, je veux que le vaisseau du joueur rebondisse légèrement.
En effet j'essaie de piéger le joueur dans une boîte, et de l'empêcher de s'échapper par les côtés ...
J'ai réussi à définir les limites du monde du jeu comme une collection d'avions, avec des normales et des distances depuis l'origine. Le joueur a une sphère englobante sphérique et en suivant ce site Web http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php, j'ai réussi à détecter les collisions.
Je ne peux maintenant pas vraiment savoir quoi faire lorsqu'une collision est détectée. Le mieux que je puisse gérer est que le joueur reste coincé dans l'avion, le traverse directement ou rebondisse à plusieurs reprises à un rythme très rapide.
Le bon sens me dit que je dois calculer l'angle réfléchi par rapport à l'avion, en utilisant sa normale et l'appliquer à la vitesse du joueur, mais je pense que je dois d'abord voir si le joueur a traversé l'avion, ce qui est le bit que je ne peux pas faire des exercices.
distance = speed * time
, généralement avec une distance supplémentaire minuscule pour éviter les erreurs), puis mettre à jour sa vitesse en fonction du résultat de la collision.F = ma, ou a = F / m. Calculez le point de collision entre la sphère et le plan. Il s'agit généralement du centre Sphère - rayon normal *. Si vous voulez plus de précision, calculez jusqu'où la sphère a pénétré le plan et ajustez votre calcul. Bien sûr, cela est largement facultatif, sauf si vous voulez une physique vraiment précise. Maintenant, calculez la vitesse relative le long de la normale. Pour un plan statique, c'est: Vball Dot N. Puis multipliez VballDotN par -1, et multipliez par masse. En physique, à ce stade, vous multiplieriez également cela par le coefficient de restitution (facteur de rebond). Multipliez ce scalaire par N et vous avez votre force.
Lorsque vous ajustez Vball, divisez à nouveau la force en masse et vous avez l'accélération finale, il suffit donc d'ajouter cela à la vitesse et vous avez votre vitesse finale post-collision.
Cette méthode est précise pour les formules de réponse aux collisions. Si vous voulez encore plus de précision, vous devrez tenir compte du frottement, ce qui fera tourner la balle, mais je ne sais pas si vous le souhaitez dans votre jeu. Dans le cas contraire, voici comment vous calculez la force tangentielle:
Assurez-vous de calculer Ft avant d'appliquer des effets linéaires, sinon le frottement ne sera pas précis.
la source
vec3 F = -CollisionNormal * (1.0f+Ball.getRestitution())*vDotN;
:?Je suggérerais de vous calculer d'abord la distance de l'avion; puis lorsque la distance <= au rayon effectue la réaction de collision.
Vous pouvez ensuite modifier cela pour calculer la distance et si la distance est inférieure à ce rayon (ce qui signifie que l'objet se chevauche), déplacez la position des billes puis effectuez la réaction de collision.
la source