Je me demandais comment se produisent les collisions dans certains jeux de course de voitures 3D simples (en particulier dans des jeux comme Outrun 2 / Motoracer).
Dans les jeux de course de voitures classiques avec un environnement complexe (monde ouvert), je suppose que cela se fait avec une boîte de base (pour la voiture) pour une collision d'avion (pour la piste, les bâtiments, etc.). Le tout serait optimisé en utilisant des boîtes englobantes (c'est ainsi que la collision se fait dans de nombreux jeux).
Dans un jeu comme Outrun 2 / Motoracer, le gameplay est si simple que les développeurs n'en ont peut-être pas besoin et tout aurait pu être simplifié beaucoup. Pour ceux qui n'y jouent jamais, voici ce qui est si spécifique:
- La voiture / vélo est toujours collée sur la route.
- La route est toujours de la même taille et a une forme très simple.
- La seule possibilité est de suivre cette route, il n'est pas possible de quitter la route ou d'entrer en collision avec autre chose (sauf les autres voitures / motos mais on s'en fout).
- Lorsque vous entrez en collision avec la route, une collision d'arcade très basique est effectuée (la voiture est simplement repoussée)
Voici comment je pense que la collision aurait pu se produire:
La piste entière pourrait être considérée comme une courbe de Bézier géante en 3D. À partir de cette courbe, les polygones de route pourraient être générés (en utilisant des vecteurs avant, gauche et haut générés à partir de la courbe). D'autres éléments (comme les maisons, les arbres, ...) pourraient également être placés et alignés en utilisant cette méthode.
Ensuite, pour gérer les collisions (et dessiner la voiture):
1) Trouvez la position la plus proche sur la courbe 3D à partir de la position 3D actuelle de la voiture. En d'autres termes, transformez la position de la voiture 3D en position de courbe de Bézier. Chaque position 3D sur la route peut être considérée comme un déplacement le long d'une courbe 3D ( t
) + déplacement latéral ( d
). Vérifiez l'image ci-dessous si elle n'est pas claire (il s'agit d'un exemple 2D mais cela s'applique facilement à la 3D).
lorsque t = 0 voiture est au début de la section de piste, lorsque t = 1 voiture est à la fin. lorsque d = -1 ou 1 voiture est au bord de la voie, lorsque d = 0 voiture est au milieu de la route
2) aligner la voiture sur la route en utilisant t
et d
(très simple: pour toutes les valeurs t
et d
je peux obtenir une position 3D + vecteurs haut / avant / gauche). la voiture est maintenant collée sur la route
3) vérifier le déplacement latéral d
de la voiture. si la valeur est trop grande (d > 1)
ou trop basse, la (d < -1)
voiture est hors de piste. il suffit de l'attacher pour mettre la voiture au bon endroit.
Cela rend également l'abattage 3D très simple, il suffit de dessiner la piste de la t
position actuelle de la voiture à t + some_big_enough_value_to_avoid_visible_clipping
.
Ou peut-être que je me trompe complètement: il aurait été beaucoup plus rapide et plus simple de simplement vérifier la collision de la voiture (un cadre de délimitation) et un ensemble très simplifié de polygones qui représentent la piste (sans les bâtiments et autres). Le monde 3D (et le modèle de colision résultant) aurait simplement été généré auparavant, à l'aide d'un outil tiers (plus de courbe 3D lors de l'exécution du jeu, juste un tas de polygones).
la source
Dans mon coureur OpenGL, j'ai commencé par utiliser deux cercles pour définir les bordures de la piste, mais cela me semblait trop compliqué. J'utilise juste glReadPixel pour lire la couleur des pixels. Si la voiture du joueur dépasse un pixel vert (couleur herbe), le mouvement est encore plus limité. Il y a très peu d'effet sur les performances.
la source