Comment les balles sont-elles simulées dans les jeux vidéo?

86

Je joue à des jeux comme MW2 récemment et, en tant que programmeur, j'ai tendance à me demander comment ils rendent le jeu si immersif. Par exemple, comment simuler une vitesse de balle?

  1. Lorsqu'un PNJ tire une balle de son arme à feu, la balle voyage-t-elle réellement de son arme à une cible donnée ou est-ce qu'ils ignorent complètement cette partie et viennent de mettre un trou de balle sur la cible?

  2. Si la balle se propage vraiment du pistolet à la cible, à quelle vitesse voyage-t-elle réellement?

mahen23
la source
25
Écran sanglant, si réel!
AttaquerHobo le
6
tire : BOOOOORRRIIIING
mahen23
1
Je ne sais pas si vous pouvez appeler les balles de Megaman Legend une balle, mais à Megaman, ils utilisent des projectiles lents pour la balle. Dans ceux-ci, vous pouvez clairement voir les plans se courber si vous courez en rond tout en tirant (effet de coriolis).
Lie Ryan

Réponses:

84

La plupart des jeux FPS utilisent le raycasting pour le jeu réel; les balles se déplacent instantanément et touchent la cible lorsqu’elles sont tirées.

Mais la plupart des jeux utilisent également l’utilisation de "faux" traceurs. Tous les 3 coups, ou un autre intervalle, un traceur sera tiré avec la balle, le traceur sera très rapide, mais pas instantané. Ceci est fait uniquement comme effet visuel et n'affecte pas directement le jeu, mais aide à donner des indices au tireur, au shootee, et donne aux spectateurs une référence directionnelle aux coups de feu.

La plupart des jeux qui utilisent ce type de physique de balle sont irréalistes, car il n'y a pas de ricochets, pas de fragments de balle, et s'il y a une pénétration, c'est généralement linéaire.

Certains jeux, tels que ARMA II et STALKER (séries entières) utilisent une physique des balles plus réaliste avec un temps de parcours, des ricochets et une pénétration avec des angles de déviation. Je crois que ces systèmes utilisent le raycasting, mais avec une limite qui est déterminée par la vitesse de la balle. Avec ces jeux, la vitesse initiale peut être réaliste comme dans ARMA II, ou bien comme dans STALKER.

Je préfère nettement avoir une physique de balle réaliste, car les armes à feu tirent des projectiles, pas des lasers.

Attaquer
la source
1
N'ayant joué à aucun des jeux mentionnés, comment cela affecte-t-il le gameplay? Je veux dire, si vous utilisez la physique des balles dans un jeu comme Call of Duty, voyez-vous vraiment une différence notable? Les angles de pénétration changent-ils le jeu? Les joueurs réaliseraient-ils même que leur personnage ne s'aligne pas avec le trou de balle par rapport au tireur? Juste curieux de savoir quels avantages il y a à justifier les frais généraux. Merci d'avance.
Dutchie432
Cela ajoute une couche d'imprévisibilité et de profondeur aux mécanismes de tir que je trouve agréables. Les balles ne sont pas instantanées !!! chuckhawks.com/rifle_ballistics_table.htm Une limace atteignant 2644 pieds par seconde pendant 600 pieds prend plus de 0,2 seconde à frapper la cible sans compter pour un ralentissement supplémentaire. Un objectif en cours d'exécution serait manqué si vous visiez directement le but. Une distance supplémentaire permettrait à la limace d’aller plus lentement que la vitesse du son, ce qui permettrait aux gens de sauter au sol ou d’autres moyens s’ils entendaient le coup de feu.
AttaquerHobo le
Cette déclaration contient plusieurs déclarations inexactes et doit être supprimée. Vérifiez ma réponse ci-dessous.
EddieV223
1
Les balles dans ArmA 2 sont des projectiles simulés; ils peuvent être modifiés (vitesse modifiée, changement de direction) en plein vol et entrer en collision avec des objets lors de leur déplacement. Peu importe que cela soit fait par lancer de rayons ou non, ils agissent comme de vrais objets de physique.
décélérécaviar
alors mw2? raycasting ou pas? Parce qu'ils font clairement un excellent travail en simulant des impacts de balles et en détruisant les environnements
mahen23 le
51

Pour les balles, ils ne s’inquiètent généralement pas de simuler la balle qui passe réellement dans les airs, mais simplement de faire un trou de balle sur la cible au moment où elle est tirée. D'autres choses, comme les roquettes, sont plus lentes * et le jeu les montre en train de voyager dans les airs.

Sur les courtes distances, les balles se déplaceront, ainsi que le laps de temps entre les images, elles iraient du tireur à la cible entre ou dans un délai de 1 image.

* C’est-à-dire plus lent que les fusées dans la vie réelle, afin que le joueur puisse les voir voler dans les airs.

jhocking
la source
44

J'ai écrit le code de balle pour PlanetSide. Nous avions quelques projectiles "hitscan", mais nous les avons simulés du mieux que nous pouvions, compte tenu des contraintes de la CPU et du nombre énorme de balles en jeu à tout moment.

Dans le cas de hitscan, l'impact est déterminé dans le même cadre que l'entrée est reçue, souvent en utilisant un seul raycast. Ceci est approprié pour des armes telles que les lasers ou autres projectiles extrêmement rapides. Nous avons réussi notre frappe en augmentant la vitesse initiale du projectile à une vitesse telle qu’elle traverserait le plateau de jeu en un seul clic.

Les balles non touchées sont cochées, soit en fonction du temps du cadre graphique, soit selon un pas fixe, et des calculs sont effectués pour l’accélération (pensez aux fusées), la gravité, la friction de l’air, le guidage (pensez aux projectiles à recherche de chaleur), etc. L'objectif étant de générer la position terminale du projectile pour le pas de temps. Une fois que les points de départ et d'arrivée sont établis, un ou plusieurs rayons peuvent être lancés pour se rapprocher de la trajectoire de vol et détecter toute collision qui aurait eu lieu pendant le vol.

Dans les projectiles HitScan et non HitScan, ce qui se passe lors d'une collision dépend des propriétés de vos projectiles et de la surface que vous impactez. Par exemple, vous pouvez toucher une surface dure, auquel cas vous pouvez vérifier votre compte de rebond et ajuster la position et la vélocité par réflexion, ou faire exploser le projectile si vous avez atteint votre compte de rebond maximum. Dans ce système, une fusée a un nombre maximal de rebonds de 0. Vous pouvez toucher une surface molle, puis vérifier votre pouvoir de pénétration pour déterminer si le projectile doit continuer à traverser la matière, etc.

C'était un code amusant à écrire. En outre, il est extrêmement utile d’écrire une bonne visualisation de débogage de ce qui se passe pour pouvoir inspecter visuellement les trajectoires de vol, les événements, etc.

Don Neufeld
la source
2
J'ai déjà joué à Planetside avant de commencer à programmer des jeux sympas, et cela semble amusant de coder.
Anthony
18

Cela dépend du jeu et du niveau de précision / réalisme.

Il est assez difficile de synchroniser les modèles de tir et de dégâts en mode multijoueur, car vous devez déterminer avec précision où et quand une balle a été tirée, si elle a touché une cible et si autre chose a traversé le chemin.

Par conséquent, je soupçonne que, lorsque cela est possible, les concepteurs de jeux simplifient les choses en traitant certaines prises de vue comme instantanées (de sorte que vous ne devez tenir compte que de la position de chacun à un moment donné) ou en limitant la portée de la balle. Heureusement, cela correspond souvent à la physique réelle. Par exemple, les fusils de sniper tirent des cartouches à grande vitesse.

De nombreux jeux peuvent simuler le trajet d’un objet lent (comme l’artillerie, les bombes, les cartouches, etc.) sur plusieurs étapes, mais c’est très coûteux et les problèmes de synchronisation sont plus fréquents, ce qui conduit à de drôles vidéos youtube.

Une autre préoccupation concerne les jeux qui maintiennent des "environnements" distincts plus petits (par exemple, chaque pièce est simulée séparément) pour créer l’illusion d’un espace plus grand. Dans ces cas, les éléments situés à l'intérieur des limites d'une "pièce" peuvent être simulés correctement, de sorte que tout le monde dans la pièce soit informé des séries de transitions dans l'espace effectuées par la balle, mais pas celles qui se trouvent en dehors de cet environnement.


la source
14

Pour les projectiles qui voyagent plus rapidement que l'œil ne peut voir, on utilise souvent le raycasting - un rayon du museau est calculé avec la direction appropriée et est testé sur des objets cibles potentiels pour déterminer ce qui a été touché. Cela peut être compliqué avec plusieurs rayons et des calculs supplémentaires si vous voulez simuler des choses comme une chute de balle, etc. Vous pouvez également accélérer les projets et les utiliser pour ajouter un réalisme supplémentaire au calcul (les puces ne sont donc pas instantanées).

Josh
la source
11

Cela dépend de l’implémentation, mais je sais que le moteur Source n’a pas du tout utilisé de cibles physiques (objets projectiles). Il a simplement lancé un rayon de joueur à cible avec un cercle aléatoire de "zones touchées" à quelle vitesse l'arme a tiré et si le joueur tenait le bouton de tir enfoncé) dont le centre était le point que le joueur visait, puis après avoir déterminé le lancer du rayon réel du joueur au point déterminé aléatoirement et en fonction d'autres facteurs (comme balle "poids" et la vitesse initiale (tous les nombres internes), objet touché, etc.) le rayon lancé a été lancé à travers plusieurs objets ou jusqu’à atteindre le terrain.

D'un autre côté, Torque 3D Engine utilise des objets projectiles réels et le concepteur peut affecter leurs modificateurs de vitesse, de masse et de gravité. Le moteur n'a fait que mettre à jour les valeurs toutes les 32 millisecondes.

MODIFIER

En plus d'utiliser des objets projectiles, le moteur 3D de couple permettait également l'utilisation de lanceurs de rayons. (J'ai créé plusieurs jeux dans lesquels le "projectile" est en fait un effet de particule qui ne possède pas le support que les objets de projectiles ont fourni. Un lancer de rayon était donc nécessaire.)

Casey
la source
histoire géniale bro. Cependant, je suis sûr que le moteur Torque 3D avait besoin de plus de puissance de calcul pour calculer toutes ces données physiques.
Mahen23
@ mahen23 Vous seriez surpris. Il avait MOINS de calculs physiques que le moteur source, en partie parce qu'il ne gérait pas du tout les collisions à corps mou, mais uniquement les boîtes de liaison et de collision simples.
Casey
10

Le wiki de Team Fortress 2 contient un article plutôt cool sur le comportement de leurs armes à projectiles et à frappe.

http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection

lunixbochs
la source
2
Ce wiki est une bonne lecture.
mgiuca
Bien que cette section soit courte, elle explique à la fois hitscan et non-hitscan et ce que sont les hitbox et leur utilisation.
Jhocking
souvenez-vous de lire les sous-articles "Projection" et "Hitscan" juste sous le titre de cette section
lunixbochs
6

En fait, de nombreux jeux utilisent un algorithme de test de rendu de rendu gpu. Voici comment cela fonctionne:

1) Hors écran, créez un rendu de la vue actuelle où tout le terrain est en noir et où chaque caractère est d'une couleur non noire. 2) Obtenez la couleur du pixel sous le réticule. 3) Si la couleur n'est pas noire, > mappage du joueur et appliquer un coup à cette cible.

Cette méthode est utilisée depuis des années dans les jeux principalement parce qu'elle est parfaite au pixel. Si un seul pixel du chapeau du joueur dépasse de derrière un mur, vous pouvez le frapper. IE si vous pouvez le voir, vous pouvez le frapper. Ce type de précision est quasiment impossible avec des techniques simples de projection de rayons. Et deuxièmement, ce type de test est extrêmement rapide et peut être effectué sur le GPU.

Timothy Baldridge
la source
La recherche de couleur de joueur semble douloureuse? Si vous le présentiez, ne serait-ce pas la même efficacité?
deceleratedcaviar
En fait, c'est extrêmement rapide. La majorité du temps consacré au rendu provient de l'ombrage des polygones réels. Dans le cas du rendu du hit-test, seuls les polygones de couleur unie sont utilisés. En outre, ce test est parfaitement réalisable dans le processeur graphique, et il est parfait au pixel près. Rien ne marque plus un joueur que de frapper parfaitement une cible et ensuite, le test de frappe lui indique qu'il s'agit d'un raté.
Timothy Baldridge
Mais comment convertir un espace de pixels en espace mondial en un objet correspondant?
deceleratedcaviar
@ Daniel: Comme le dit la réponse, la cible touchée est identifiée par sa couleur. Chaque caractère est rendu avec une couleur différente (solide), vous pouvez donc vérifier la couleur et le noir = rien, tout le reste = rechercher qui a été rendu dans cette couleur, car ils ont été touchés.
Dave Sherohman
Sherohman @ Dave, je mal lu a dû d' abord, après avoir lu votre explication , il semblait si clair ce qu'il voulait dire ... hourras
deceleratedcaviar
4

Certains jeux utilisent sans aucun doute une physique de balles réaliste, prenant en compte le temps de déplacement des balles, mais je suppose que la plupart des jeux ne le font pas, du moins pour les PNJ.

Pour un jeu qui effectue un déplacement de balle direct (sans largage) instantané, le jeu trace une ligne imaginaire (vecteur) à partir de la pointe du canon. Il calcule ensuite ce que cette ligne intersecte avec et enregistre un "hit" de balle à ce point. Il peut s’agir d’un objet solide, comme un mur, où un impact déclenche un effet tel qu’un décalque de balle et une "bouffée" de fumée / débris. Cela pourrait avoir un impact sur un objet cassable, ou sur un objet physique et lui donner un "coup de pied". Ou bien sûr, cela pourrait toucher le joueur ou un autre PNJ et causer des dégâts de santé. Les simulations à noyau dur modéliseront la balle pénétrant à travers les murs et déclencheront un effet de frappe du côté de la sortie, diminuant probablement les dégâts de la balle à la sortie.

Pour que les NPC n’aient pas un objectif parfait, de nombreux jeux ajoutent une sorte de randomisation au vecteur pour modéliser la propagation de la balle. C’est ce que vous verrez dans la vie réelle, où les balles ne frappent pas toutes exactement où vous visez, mais selon un schéma centré autour du point de visée.

Pour visualiser la propagation de la balle, imaginez un cône sortant du pistolet au lieu d’une ligne droite (vecteur). La direction de la balle réelle est randomisée pour être quelque part à l'intérieur de ce cône. Si le tireur est vraiment proche de la cible, l'écart est faible et la précision élevée. Si la cible est éloignée, le cône ajoute plus de dispersion afin que le tireur ait moins de chances de toucher la cible.

Cette idée du cône de tir peut être utilisée pour modéliser la précision (compétence) du tireur, la précision de l'arme et d'autres conditions. Par exemple, un cône de tir de faible précision peut être attribué à un PNJ de bas niveau, alors qu'un PNJ hautement qualifié aurait un degré de précision élevé. Un joueur en train de courir avec une mitraillette tirant de la hanche aurait un cône de tir large, ce qui diminuerait s’il arrêtait de courir ou de viser. Les fusils de tireur d’élite auraient par nature des cônes de tir plus étroits que ceux d’un pistolet.

Tim Holt
la source
+1 bonne information. Mais je pense que cela pourrait être plus agréable visuellement si l’intelligence artificielle est réellement mauvaise à viser le joueur, plutôt qu’un cône plus grand. Ou si vous voulez agrandir le cône, faites-le de taille variable en fonction du recul et donnez aux ennemis de niveau inférieur un taux d'augmentation de taille plus rapide, de sorte qu'ils semblent tout simplement inexpérimentés.
AttaquerHobo le
1

En parlant du code source de Nexuiz depuis que j’ai jeté un coup d’œil, ils n’ont pas envoyé d’objet «balle» du point A au point B. Si je me souviens bien, cela ne concerne que certaines armes, d’autres armes non. t les armes à frappe instantanée lorsqu’elles sont tirées, le code indique la direction que prend votre arme. Si elle vise une personne (et constitue une arme à frappe instantanée) lorsque vous cliquez sur "feu", vous frappez.

Il convient également de noter comment Nexuiz avait l'option côté serveur permettant de calculer les hits sur le client ou sur le serveur. Si vous soupçonnez que les clients trichent, vous pouvez passer aux calculs de réussite du côté serveur afin d’atténuer ce risque.

Jeff Welling
la source
1

Une autre stratégie est un hybride consistant à tout restituer et à tout localiser. Vous n'avez pas nécessairement à rendre chaque balle. Par exemple, si votre arme tire 30 coups / seconde, un strafe peut générer quelques centaines de particules ... vous pouvez réduire le rendu en utilisant un "effet de traçage", effectuez le rendu tous les 3 coups, les deux autres. Le joueur voit toujours 10 tours / seconde tirer sur l'ennemi.

Tweak pour votre situation spécifique, rendre plus pour moins d'armes à feu, moins pour plus élevé.

Stephen
la source
1
Vous devriez inclure des informations sur les raisons pour lesquelles chaque 3ème coup aurait le traceur. Ce n'est pas un développement de développeur de jeux. C'était l'armée. Des balles traceurs contenant du phosphore à l’arrière de la limace. Lorsque la balle est tirée, la poudre à canon enflamme le phosphore, créant une traînée lumineuse derrière la balle. Les balles de traçage sont plus coûteuses que les balles ordinaires. Elles ne sont donc utilisées que lors de coups X ou plus pour économiser de l’argent, tout en ayant l’effet escompté de pouvoir viser plus facilement.
AttaquerHobo le
En outre, vous ne souhaitez pas que le rendu et la mise à jour se divisent comme vous le dites. Vous voulez que toute la physique de balle soit entièrement faite avec la méthode de mise à jour. Vous voulez que chaque coup X génère un effet traceur beaucoup plus lent que la balle pour indiquer le mouvement et la direction.
AttaquerHobo le
@ AttackingHobo Je ne pensais pas spécifiquement aux rondes au phosphore, mais plutôt à un indice visuel indiquant que les balles volaient. L'idée était d'utiliser la compression sélective ... en supprimant un niveau de détail que le joueur n'enregistrerait jamais comme "manquant", mais cela allégerait la charge du système. Le bit "chaque 3ème balle" est arbitraire ... vous devez expérimenter pour voir ce qui a bien fonctionné. Dans votre réponse, vous avez parlé de "faux traceurs", ce qui a également beaucoup de sens.
Stephen
1

N'oubliez pas que le débit d'images par rapport à la vitesse de la balle peut être un problème. Dans certains cas, si vous n'avez pas suffisamment codé votre moteur physique, la balle peut simplement traverser un objet sans la toucher. Il existe une solution à cet égard, dont je ne me souviens pas très bien ...

Quoi qu'il en soit, je pense qu'il peut être très problématique de compenser des balles réalistes dans un environnement multijoueur, voire impossible si le temps de latence commence à dépasser 30 ou 50 ms.

Un jour cependant, les fournisseurs de services Internet se soucient peut-être un peu plus de la latence et proposent différentes offres ... mais sans FTTH, cela reste un rêve ...

jokoon
la source
1

Dans des jeux tels que mauvaise compagnie, battlefeild 3 et stalker, je pense que la balle est une entité individuelle réelle tirée comme une "roquette". Je pense seulement que le lancer de rayon est nécessaire si la balle atteint instantanément la cible. Lorsque l’entité se présente elle-même en balles réalistes, elle se contente de voir si elle frappe quelqu'un.

JAMOY
la source
0

En réalité, si vous regardez des rediffusions vidéo dans Call of Duty, vous pouvez voir faiblement un bipède orangé voler dans les airs jusqu'à la cible voulue.

Si vous voulez un effet richochet comme Hobo l'a dit, allez jouer à l'un des jeux de Halo. Si vous tirez sur un mur en métal depuis une position plus proche, vous pouvez voir les balles se superposer au métal. Le tireur d’élite à l’intérieur de celui-ci laisse une trace de son passage.

Réponse relancée terminée, je pourrais revenir plus tard pour réparer.

Jack soit agile
la source
-5

Les puces et toute la physique de la série de jeux Stalker utilisent une bibliothèque open source appelée "Open Dynamics Engine".

http://en.wikipedia.org/wiki/Open_Dynamics_Engine

Les balles tombent avec la gravité et même rebondissent sur les murs et trucs très précisément si vous êtes assez intelligent, vous pouvez même tordre une balle pour tirer sur quelqu'un que vous ne pouvez pas voir mais qui connaissent sa position. La puce est un modèle d'objet réel. C’est la manière la plus réaliste que j’ai vue de faire. La méthode du tracé de rayons n’est pas pratique lorsque vous commencez à vous déplacer dans de grands espaces. Ce serait bien pour tirer avec un pistolet laser cependant.

Autres jeux qui l'utilisent: BloodRayne 2, Call of Juarez, World of Goo, X-Moto et OpenSimulator.

Un autre bon choix serait la bibliothèque de physique "Bullet". http://en.wikipedia.org/wiki/Bullet_%28software%29

Il a été utilisé dans Grand Theft Auto 4, Red Dead Redemption et plus encore.

ps arma 2 utilise un moteur physique interne, leur prochain jeu arma 3 utilisera le moteur physique physX

EddieV223
la source
3
Il est trompeur de lister les jeux qui ont utilisé ODE à des fins qui n'ont rien à voir avec des balles.
Jhocking
4
Il est également trompeur de dire que stalker utilise l’EDO pour les puces, alors que le jeu utilise ses propres tests de collision propriétaires, mais n’utilise que le solutionneur d’EDA.
AttaquerHobo le