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.
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?
Se a bala está realmente viajando da arma para o alvo, a que velocidade está realmente viajando?
projectile-physics
mahen23
fonte
fonte
Respostas:
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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).
fonte
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.)
fonte
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
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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 ...
fonte
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.
fonte
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.
fonte
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
fonte