Como as balas são simuladas nos videogames?


86

Eu tenho jogado jogos como MW2 recentemente e, como programador, tenho a tendência de me perguntar como eles tornam o jogo tão imersivo. Por exemplo, como eles simulam a velocidade da bala.

  1. Quando um NPC dispara uma bala de sua arma, a bala realmente viaja da arma para o alvo em questão ou eles ignoram completamente essa parte e apenas colocam um buraco de bala no alvo?

  2. Se a bala está realmente viajando da arma para o alvo, a que velocidade está realmente viajando?


25
Tela sangrenta, tão real!
AttackingHobo

6
dispara : BOOOOORRRIIIING
mahen23

1
Não sei se você pode chamar as balas de Megaman Legend de bala, mas no Megaman, elas usam projéteis lentos para bala. Nestas, você pode ver claramente as fotos se curvando se correr em círculos enquanto fotografa (um efeito coriolis).
Lie Ryan

Respostas:


84

A maioria dos jogos de FPS usa radiodifusão para a jogabilidade real; balas viajam instantaneamente e atingem o alvo quando disparadas.

Mas a maioria dos jogos também emprega o uso de marcadores "falsos". A cada 3 tiros, ou algum outro intervalo, um rastreador será disparado junto com a bala, o rastreador será muito rápido, mas não instantâneo. Isso é feito apenas como um efeito visual e não afeta diretamente o jogo, mas ajuda a fornecer pistas para o atirador, o atirador e fornece aos espectadores uma referência direcional aos tiros.

A maioria dos jogos que usam esse tipo de física de balas é irrealista, pois não há ricochetes, nem fragmentos de bala, e se houver alguma penetração, geralmente é linear.

Alguns jogos, como ARMA II, STALKER (série inteira), usam física de balas mais realista com tempo de viagem, ricochete e penetração com ângulos de deflexão. Eu acredito que esses sistemas estão usando raycasting, mas com um limite que é determinado pela velocidade da bala. Com esses jogos, a velocidade do focinho pode ser realista como no ARMA II, ou parecer certa como no STALKER.

Eu prefiro ter uma física realista de balas, pois armas disparam projéteis, não lasers.


1
Não tendo jogado nenhum dos jogos mencionados, como isso afeta a jogabilidade? Quero dizer, se você emprega física de balas em um jogo como Call of Duty, você realmente vê uma diferença notável? Os ângulos de penetração estão mudando o jogo? Os jogadores perceberiam que seu personagem não está alinhado com o buraco de bala em relação ao atirador? Apenas curioso que benefícios existem para justificar a sobrecarga. Desde já, obrigado.
precisa saber é o seguinte

Acrescenta uma camada de imprevisibilidade e profundidade à mecânica de tiro que considero agradável. Balas não são instantâneas !!! chuckhawks.com/rifle_ballistics_table.htm Uma lesma de 2644 pés por segundo por 600 pés leva 0,22 segundos para atingir o alvo, sem levar em conta lentidão adicional. Um alvo em execução seria perdido se você visasse diretamente a ele. Uma distância adicional permitiria que a lesma fosse mais lenta que a velocidade do som, permitindo que as pessoas pulassem no chão ou outras se ouvissem o tiro.
AttackingHobo

Existem várias declarações imprecisas feitas nesta resposta e devem ser excluídas. Confira minha resposta abaixo.
EddieV223

1
As balas no ArmA 2 são projéteis simulados; eles podem ser modificados (velocidade alterada, mudança direcional) no meio do vôo e colidir com objetos enquanto viajam. Se isso é feito por projeção de raios ou não, é irrelevante, eles agem como objetos físicos reais.
Deceleratedcaviar

então mw2? radiodifusão ou não? Porque eles claramente fazer um grande trabalho de simular buracos de bala e ambientes de ser destruído por ela
mahen23

51

Para balas, elas geralmente não se incomodam em simular a bala que realmente viaja pelo ar e simplesmente colocam um buraco de bala no alvo no instante em que é disparado. Outras coisas, como foguetes, são mais lentos * e o jogo mostra-os viajando pelo ar.

Nas curtas distâncias que as balas percorrerão, junto com o intervalo de tempo entre os quadros, eles iriam do atirador ao alvo entre ou dentro de um quadro de qualquer maneira.

* Ou seja, mais devagar que os foguetes na vida real, para que o jogador os veja voando pelo ar.


44

Eu escrevi o código de marcador para o PlanetSide. Tínhamos alguns projéteis 'hitscan', mas na maioria das vezes simulávamos os projéteis da melhor maneira possível, considerando as restrições de CPU e o grande número de marcadores em execução a qualquer momento.

No caso do hitscan, o impacto é determinado no mesmo quadro em que a entrada é recebida, geralmente usando um único raycast. Isso é apropriado para armas como lasers ou outros projéteis extremamente rápidos. Fizemos hitscan apenas acionando a velocidade inicial no projétil tão alto que cruzaria o tabuleiro do jogo em um único tique.

Marcadores não hitscan são marcados, seja para o tempo do quadro gráfico ou para um passo fixo de tempo, com cálculos de aceleração (think rockets), gravidade, atrito do ar, orientação (think heat buscando projéteis) etc. aplicados. O objetivo é gerar a posição terminal do projétil para o timestep. Uma vez estabelecidos os pontos inicial e final, um ou mais raios podem ser lançados para aproximar a trajetória de vôo e detectar colisões que teriam ocorrido durante o vôo.

Nos projéteis do hitscan e não do hitscan, o que acontece em uma colisão depende das propriedades do projétil e da superfície que você afeta. Por exemplo, você pode atingir uma superfície dura, nesse caso, pode verificar sua contagem de rejeições e ajustar a posição e a velocidade por uma reflexão ou detonar o projétil se atingir sua contagem máxima de rejeições. Neste sistema, um foguete tem apenas uma contagem máxima de saltos de 0. Você pode atingir uma superfície macia e verificar seu poder de penetração para determinar se o projétil deve continuar através do material, etc.

Foi um código divertido de escrever. Além disso, é super útil escrever uma boa visualização de depuração do que está acontecendo, para que você possa inspecionar rotas de vôo, eventos etc. visualmente.


2
Joguei Planetside antes de começar a programar um bom jogo, e isso parece divertido de codificar.
Anthony

18

Depende do jogo e do nível de precisão / realismo.

A sincronização de modelos de tiro e dano nas configurações de vários jogadores é bastante difícil, pois você precisa determinar com precisão onde e quando exatamente um tiro foi disparado, se atingiu um alvo e se alguma outra coisa passou pelo caminho.

Portanto, suspeito que, sempre que possível, os designers de jogos simplificam as coisas tratando algumas cenas como instantâneas (para que você só considere a localização de todos em um único momento) ou restringindo o alcance da bala. Felizmente, isso geralmente corresponde à física da vida real. Por exemplo, rifles de precisão disparam tiros de alta velocidade.

Muitos jogos podem simular um caminho de várias fotos de vários objetos em movimento lento (como artilharia, bombas, marcadores, etc.), mas isso é muito caro e os problemas de sincronização são mais comuns, levando a vídeos engraçados do youtube.

Outra preocupação é com jogos que mantêm "ambientes" menores separados (por exemplo, cada sala é simulada separadamente) para criar a ilusão de um espaço maior. Nesses casos, as coisas dentro dos limites de uma "sala" podem ser simuladas corretamente para que todos na sala sejam atualizados sobre as séries de transições no espaço que a bala faz, mas outras fora desse ambiente não.


14

Para projéteis que viajam mais rápido do que os olhos podem ver, a emissão de raios é frequentemente empregada - um raio do focinho é calculado com a direção apropriada e testado contra possíveis objetos-alvo para determinar o que foi atingido. Isso pode ser complicado com vários raios e algum cálculo extra, se você quiser simular coisas como queda de bala e outras coisas. Você também pode dar aos projetos uma velocidade e usá-los para adicionar mais realismo ao cálculo (para que os marcadores não sejam instantâneos).


11

Depende da implementação, mas eu sei que o Source Engine não usou marcadores físicos (objetos de projétil), eles apenas fizeram um raio lançado do jogador para o alvo com um círculo aleatório de "zona de impacto" (raios maiores ou menores dependiam de quão rápido a arma disparou e se o jogador estava segurando o botão de disparo) qual era o ponto em que o jogador estava mirando? Depois de determinar o raio real lançado do jogador para o ponto determinado aleatoriamente e dependendo de outros fatores (como marcador "peso" e velocidade do focinho (todos os números internos), acerto de objetos, etc.) o raio lançado foi lançado através de vários objetos ou até atingir o terreno.

Por outro lado, o Torque 3D Engine usou objetos reais de projéteis e o designer pode afetar seus modificadores individuais de velocidade, massa e gravidade. Tudo o que o mecanismo fez foi atualizar os valores a cada 32 milissegundos.

EDITAR

Além de usar objetos de projéteis, o Torque 3D Engine também permitia o uso de raios moldados como alternativa. (Eu fiz vários jogos em que o "projétil" é na verdade um efeito de partícula que não tem o apoio que os objetos de projétil fizeram, então foi necessária uma projeção de raios.)


história impressionante mano. no entanto, tenho certeza de que o mecanismo Torque 3D exigiu mais poder de processamento para calcular toda essa física.
mahen23

@ mahen23 Você ficaria surpreso. Tinha menos cálculos físicos do que o Source Engine, em parte porque não lidava com colisões de Softbody, apenas caixas delimitadoras e de colisão simples.
Casey

10

Há uma descrição bem legal no wiki do Team Fortress 2 sobre o comportamento de suas armas de projétil e hitcan.

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


2
Essa wiki é uma boa leitura.
mgiuca

Embora essa seção seja curta, ela explica tanto o hitscan quanto o não-hitscan e explica o que são as caixas de ocorrências e como são usadas.
perfil completo de Jhocking

lembre-se de ler os sub-artigos "Projeção" e "Hitscan" logo abaixo do título da seção
lunixbochs

6

Na verdade, muitos jogos usam um algoritmo de teste de desempenho de renderização gpu. Aqui está a maneira básica de como funciona:

1) Fora da tela, crie uma renderização da exibição atual, onde todo o terreno é preto e todos os caracteres são de uma cor não preta. 2) Pegue a cor do pixel sob a mira. > mapeamento do jogador e aplique um acerto nesse alvo.

Esse método é usado há anos em jogos, principalmente porque é perfeito em pixels. Se um único pixel do chapéu do jogador estiver saindo de trás de uma parede, você poderá atingi-lo. Ou seja, se você pode vê-lo, pode atingi-lo. Esse tipo de precisão é quase impossível com técnicas simples de fundição de raios. E segundo, esse tipo de teste é extremamente rápido e pode ser realizado na GPU.


A pesquisa color-> player parece dolorosa? Se você o lançou, não seria a mesma eficiência?
Deceleratedcaviar

Na verdade, é extremamente rápido. A maior parte do tempo gasto na renderização é do sombreamento dos polígonos reais. No caso de renderização do teste de acerto, apenas polígonos de cores sólidas são usados. Além disso, esse teste de acerto pode ser feito completamente na GPU e é perfeito em pixels. Nada irrita mais o jogador do que acertar um alvo e fazer com que o teste de impacto diga que foi uma falta.
Timothy Baldridge #

Mas como você converte o espaço de pixel em espaço do mundo no objeto correspondente que você acerta.
Deceleratedcaviar #

@ Daniel: Como a resposta diz, o alvo atingido é identificado pela cor. Cada caractere é renderizado como uma cor (sólida) diferente, para que você possa verificar a cor e preto = falta, qualquer outra coisa = procurar quem foi renderizado nessa cor, porque foi atingido.
Dave Sherohman

@ Dave Sherohman, eu devo ter lido errado originalmente, depois de ler sua explicação parecia tão claro que ele queria dizer ... Felicidades
deceleratedcaviar

4

Alguns jogos, sem dúvida, usam física realista de balas, levando em consideração o tempo de viagem e a queda de balas, mas acho que a maioria dos jogos não, pelo menos para os NPCs.

Para um jogo que faz o deslocamento direto da bala (sem queda) instantâneo, o jogo traça uma linha imaginária (vetor) do ponto do barril para a frente. Em seguida, calcula com o que essa linha se cruza e registra um marcador "atingido" nesse ponto. Pode ser um objeto sólido, como uma parede, onde um impacto provoca um efeito, como um decalque de bala e um "sopro" de fumaça / detritos. Isso pode impactar um objeto quebrável causando sua quebra, ou pode impactar um objeto de física e dar um "chute". Ou, é claro, pode atingir o jogador ou outro NPC e causar um dano à saúde. As simulações de núcleo duro modelam a bala que penetra nas paredes e provocam um efeito de golpe no lado da saída, provavelmente diminuindo o dano da bala na saída.

Para que os NPCs não tenham uma mira perfeita, muitos jogos adicionam algum tipo de randomização ao vetor para modelar a propagação de balas. Isso é o que você veria na vida real, onde as balas não atingem exatamente onde você mira, mas em um padrão centrado em torno do local da mira.

Para visualizar a bala espalhada, imagine um cone saindo da pistola em vez de uma linha reta (vetor). A direção real da bala é aleatória para estar em algum lugar dentro deste cone. Se o atirador estiver realmente próximo do alvo, o spread é pequeno e a precisão alta. Se o alvo estiver longe, o cone adiciona mais espaço e, portanto, é menos provável que o atirador atinja o alvo.

Essa idéia do cone do tiro pode ser usada para modelar a precisão (habilidade) do atirador, a precisão da arma e outras condições. Por exemplo, um NPC de baixo nível pode receber um cone de tiro de baixa precisão, enquanto um NPC altamente qualificado terá uma precisão de alto nível. Um jogador correndo com uma metralhadora atirando do quadril teria um cone largo, o que reduziria se parassem de correr ou apontassem. Os rifles de precisão teriam cones de tiro mais apertados por natureza do que uma pistola.


+1 boa informação. Mas acho que pode ser visualmente mais agradável se a IA for realmente ruim em apontar para o jogador, em vez de um cone maior. Ou se você quiser aumentar o cone, faça com que o tamanho seja variável com base no recuo e dê aos inimigos de nível inferior uma taxa de aumento de tamanho mais rápida, para que pareçam inexperientes.
AttackingHobo

1

Falando do código fonte Nexuiz desde o momento em que dei uma olhada, eles não enviaram um objeto 'bala' do ponto A ao ponto B. Se bem me lembro, isso é específico para apenas algumas armas - outras armas não são ”. t armas atingidas instantaneamente quando são disparadas, o código analisa para onde sua arma está apontando. Se ele é apontado para uma pessoa (e é uma arma de ataque instantâneo) quando você clica em 'fogo', então você faz um golpe.

Também é notável como o Nexuiz teve a opção do lado do servidor de calcular hits no cliente ou no servidor. Se você suspeitar que os clientes estão trapaceando, poderá mudar para os cálculos de ocorrências no servidor, na tentativa de ajudar a atenuar isso.


1

Outra estratégia é um híbrido de renderizar tudo e rastrear tudo. Você não precisa necessariamente renderizar todas as balas. Por exemplo, se sua arma disparar 30 tiros / segundo, um canhão pode gerar algumas centenas de partículas ... você pode reduzir a renderização usando um "efeito marcador", renderizar a cada 3º tiro, traçar raios os outros dois. O jogador ainda vê 10 rodadas / segundo atirando no inimigo.

Tweak para sua situação específica, render mais para menor taxa de armas de fogo, menos para maior.


1
Você deve incluir algumas informações sobre por que cada 3ª tacada teria o marcador. Não é um desenvolvimento para desenvolvedores de jogos. Foram os militares. Balas rastreadoras com fósforo incorporado na parte traseira da lesma. Quando a rodada é disparada, a pólvora inflama o fósforo, criando uma trilha brilhante atrás da bala. As balas de rastreamento são mais caras que as balas comuns, portanto, são usadas apenas sempre X ou mais para economizar dinheiro, enquanto ainda têm o efeito pretendido de poder mirar com mais facilidade.
AttackingHobo

Além disso, você não deseja dividi-lo na renderização e atualização como você diz. Você deseja que toda a física dos marcadores seja totalmente feita com o método de atualização. Você quer que cada tiro X também gere um efeito marcador muito mais lento que a bala para mostrar movimento e direção.
AttackingHobo

@AttackingHobo Eu não estava pensando especificamente em rodadas de fósforo, mas em alguma sugestão visual de que as balas estão voando. A idéia era usar a compressão seletiva ... removendo um nível de detalhe que o jogador nunca registraria como "ausente", mas isso facilita a carga no sistema. O bit "cada terceiro marcador" é arbitrário ... você teria que experimentar para ver o que funcionou bem. Na sua resposta, você disse "rastreadores falsos", o que também faz muito sentido.
Stephen

1

Não esqueça que a taxa de quadros versus a velocidade da bala pode ser um problema; em alguns casos, se você não codificou seu mecanismo de física o suficiente, a bala pode simplesmente passar pelo objeto sem atingi-lo. Existe uma solução para esse assunto, da qual não me lembro muito bem ...

De qualquer forma, acho que pode ser muito problemático compensar balas realistas em um ambiente multiplayer, se não impossível, se a latência começar a ser maior que 30 ou 50ms.

Um dia, porém, o ISP pode se importar um pouco mais com a latência e oferecer diferentes ofertas ... mas sem o FTTH, ainda é um sonho ...


1

Em jogos como má companhia, battlefeild 3 e stalker, acredito que a bala é uma entidade individual real disparada como um "foguete". Eu só acho que o traçado de raios é necessário se a bala atingir instantaneamente o alvo. Quando a entidade em si mesma, em balas realistas, estará apenas correndo para ver se atinge alguém.


0

Na verdade, se você observar os replays de vídeo no Call of Duty, poderá ver um bípede laranja voando pelo ar até o alvo pretendido, e o attackinghobo na verdade tem a resposta certa em sua maior parte.

Se você quer um efeito richochet como o Hobo declarou, basta jogar qualquer um dos jogos Halo. Se você atirar em uma parede de metal de uma posição mais próxima, poderá ver as balas ricocheteando no metal. O franco-atirador nele deixa um rastro para onde ele atinge.

Resposta reiniciada concluída, posso voltar mais tarde para corrigir.


-5

As balas e toda a física da série de jogos stalker usam uma biblioteca de código aberto chamada "Open Dynamics Engine".

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

As balas caem com a gravidade e até ricocheteiam nas paredes e coisas com muita precisão, se você for esperto o suficiente, você pode até curvar uma bala de algo para atirar em alguém que você não pode ver, mas conhece sua posição. O marcador é um modelo de objeto real. Esta é a maneira mais realista que eu já vi, o método de traçado de raios não é prático quando você começa a se mover em grandes espaços. Seria bom disparar uma arma laser.

Outros jogos que o utilizam BloodRayne 2, Call of Juarez, World of Goo, X-Moto e OpenSimulator.

Outra boa opção seria a biblioteca de física "Bullet". http://en.wikipedia.org/wiki/Bullet_%28software%29

Foi usado no Grand Theft Auto 4, Red Dead Redemption e mais.

ps arma 2 usa um mecanismo de física interno, o próximo jogo arma 3 usará o mecanismo de física physX


3
É enganoso listar jogos que usavam ODE para fins que não têm nada a ver com marcadores.
jhocking

4
Também é enganoso dizer que o stalker usa ODE para as balas, quando na verdade o jogo usa seus próprios testes de colisão, mas apenas o solucionador de ODE.
AttackingHobo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.