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?
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?
Si la balle se propage vraiment du pistolet à la cible, à quelle vitesse voyage-t-elle réellement?
projectile-physics
mahen23
la source
la source
Réponses:
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.
la source
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.
la source
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.
la source
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
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).
la source
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.)
la source
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
la source
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.
la source
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.
la source
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.
la source
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é.
la source
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 ...
la source
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.
la source
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.
la source
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
la source