He estado jugando juegos como MW2 recientemente y, como programador, tiendo a preguntarme cómo hacen que el juego sea tan inmersivo. Por ejemplo, cómo simulan la velocidad de la bala.
Cuando un PNJ dispara una bala de su arma, ¿la bala realmente viaja de su arma al objetivo dado o ignoran por completo esta parte y simplemente ponen un agujero de bala en el objetivo?
Si la bala realmente viaja del arma al objetivo, ¿a qué velocidad viaja realmente?
projectile-physics
mahen23
fuente
fuente
Respuestas:
La mayoría de los juegos de FPS utilizan la emisión de rayos para el juego real; las balas viajan instantáneamente y alcanzan el objetivo cuando disparan.
Pero la mayoría de los juegos también emplean el uso de trazadores "falsos". Cada 3 disparos, o algún otro intervalo, se disparará un marcador junto con la bala, el marcador será realmente rápido, pero no instantáneo. Esto se hace solo como un efecto visual, y no afecta el juego directamente, sino que ayuda a dar señales al tirador, al tirador y a los espectadores una referencia direccional a los disparos.
La mayoría de los juegos que usan este tipo de física de bala no son realistas, ya que no hay rebotes, ni fragmentos de bala, y si hay alguna penetración, generalmente es lineal.
Algunos juegos, como ARMA II, STALKER (serie completa) usan una física de bala más realista con tiempo de viaje, rebotes y penetración con ángulos de desviación. Creo que estos sistemas están utilizando la emisión de rayos, pero con un límite que está determinado por la velocidad de la bala. Con estos juegos, la velocidad del hocico puede ser realista como en ARMA II, o parece tan correcta como en STALKER.
Prefiero tener física de balas realista, ya que las armas disparan proyectiles, no láseres.
fuente
Para las balas, generalmente no se molestan en simular la bala que realmente viaja por el aire y simplemente colocan un agujero de bala en el objetivo en el instante en que se dispara. Otras cosas como los cohetes son más lentos * y el juego en realidad los muestra viajando por el aire.
En las distancias cortas, las balas viajarán, junto con el lapso de tiempo entre fotogramas, de todos modos llegarían del tirador al objetivo entre o dentro de 1 fotograma.
* Es decir, más lento que los cohetes en la vida real, para que el jugador los vea volar por el aire.
fuente
Escribí el código de bala para PlanetSide. Teníamos algunos proyectiles 'hitscan', pero en su mayoría simulamos los proyectiles lo mejor que pudimos, dadas las limitaciones de la CPU y la gran cantidad de balas en juego en cualquier momento.
En el caso de hitscan, el impacto se determina en el mismo marco en el que se recibe la entrada, a menudo usando un solo rayo. Esto es apropiado para armas como láseres u otros proyectiles extremadamente rápidos. Hicimos hitscan simplemente girando la velocidad inicial en el proyectil tan alto que cruzaría el tablero de juego en un solo tic.
Las balas sin hitscan se marcan, ya sea al tiempo del cuadro de gráficos o a un paso de tiempo fijo, con cálculos para la aceleración (pensar cohetes), la gravedad, la fricción del aire, la orientación (pensar en proyectiles de búsqueda de calor), etc. El objetivo es generar la posición terminal del proyectil para el paso de tiempo. Una vez que se establecen los puntos de inicio y finalización, se pueden lanzar uno o más rayos para aproximar la ruta de vuelo y detectar cualquier colisión que hubiera ocurrido durante el vuelo.
Tanto en proyectiles hitcan como no hitcan, lo que sucede en una colisión depende de sus propiedades de proyectil y de la superficie que impacta. Por ejemplo, puede golpear una superficie dura, en cuyo caso puede verificar su conteo de rebotes y ajustar la posición y la velocidad por un reflejo, o detonar el proyectil si ha alcanzado su conteo de rebote máximo. En este sistema, un cohete solo tiene un conteo máximo de rebote de 0. Puede golpear una superficie blanda y luego verificar su poder de penetración para determinar si el proyectil debe continuar a través del material, etc.
Fue divertido escribir código. Además, es súper útil escribir una buena visualización de depuración de lo que está sucediendo para que pueda inspeccionar visualmente las rutas de vuelo, eventos, etc.
fuente
Depende del juego y del nivel de precisión / realismo.
Sincronizar los modelos de disparo y daño en la configuración multijugador es bastante difícil, ya que debes determinar con precisión dónde y cuándo se disparó exactamente una bala, si alcanzó un objetivo y si algo más pasó por el camino.
Por lo tanto, sospecho que, cuando sea posible, los diseñadores de juegos simplificarán las cosas al tratar algunos disparos como instantáneos (por lo que solo necesita considerar la ubicación de todos en un solo momento en el tiempo) o restringir el alcance de la bala. Afortunadamente, esto a menudo corresponde a la física de la vida real. Por ejemplo, los rifles de francotirador disparan rondas de alta velocidad.
Muchos juegos pueden simular una ruta de múltiples pasos y múltiples instantáneas de un objeto de movimiento lento (como artillería, bombas, rondas de marcadores, etc.) pero eso es muy costoso y los problemas de sincronización son más comunes, lo que lleva a divertidos videos de YouTube.
Otra preocupación es con los juegos que mantienen "entornos" más pequeños separados (por ejemplo, cada sala se simula por separado) para crear una ilusión de un espacio más grande. En estos casos, las cosas dentro de los límites de una "sala" pueden simularse correctamente para que todos en la sala se actualicen sobre la serie de transiciones en el espacio que realiza la bala, pero otros fuera de ese entorno no.
fuente
Para los proyectiles que viajan más rápido de lo que el ojo puede ver, a menudo se emplea la emisión de rayos: se calcula un rayo desde el hocico con la dirección adecuada y se prueba contra posibles objetos objetivo para determinar qué fue golpeado. Esto puede ser complicado con múltiples rayos y algunos cálculos adicionales si desea simular cosas como la caída de bala y tal. También puede darles velocidad a los proyectos y usarlos para agregar realismo adicional al cálculo (para que las viñetas no sean instantáneas).
fuente
Depende de la implementación, pero sé que el motor de origen no usó balas físicas (objetos de proyectil), solo hizo un lanzamiento de rayos del jugador al objetivo con un círculo aleatorio de "zona de impacto" (los radios más grandes o más pequeños dependían de qué tan rápido disparó el arma y si el jugador mantenía presionado el botón de disparo) cuál era su centro en el punto al que apuntaba el jugador, luego de determinar el rayo real lanzado por el jugador hasta el punto determinado al azar y dependiendo de otros factores (como "peso" de la bala y velocidad del hocico (todos los números internos), golpe de objeto, etc.) el lanzamiento del rayo se lanzó a través de múltiples objetos o hasta que tocó el terreno.
Por otro lado, el motor Torque 3D DID utilizó objetos de proyectiles reales y el diseñador podría afectar sus modificadores individuales de velocidad, masa y gravedad. Todo lo que hizo el motor fue actualizar los valores cada 32 milisegundos.
EDITAR
Además de usar objetos de proyectil, el motor Torque 3D también permitía el uso de rayos como alternativa. (He hecho varios juegos donde el "proyectil" es en realidad un efecto de partículas que no tiene el soporte que los objetos de proyectil tenían, por lo que se requería un lanzamiento de rayos).
fuente
En la wiki de Team Fortress 2 hay una crítica bastante buena sobre el comportamiento de sus armas de proyectiles y hitscan.
http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection
fuente
En realidad, muchos juegos usan un algoritmo de prueba de éxito de representación de gpu. Aquí está la forma básica en que funciona:
1) Fuera de la pantalla, cree una representación de la vista actual donde todo el terreno es negro, y cada personaje es de color no negro 2) Obtenga el color del píxel debajo de la cruz 3) Si no es negro, busque el color- > mapeo de jugadores y aplica un golpe a ese objetivo.
Este método se ha utilizado durante años en juegos principalmente porque es perfecto en píxeles. Si un píxel del sombrero del jugador sobresale detrás de una pared, puedes golpearlo. Es decir, si puedes verlo, puedes golpearlo. Este tipo de precisión es casi imposible con técnicas simples de fundición de rayos. Y en segundo lugar, este tipo de prueba es extremadamente rápido y se puede realizar en la GPU.
fuente
Sin duda, algunos juegos utilizan una física de bala realista, teniendo en cuenta el tiempo de viaje y la caída de la bala, pero supongo que la mayoría de los juegos no lo hacen, al menos para los NPC.
Para un juego que realiza un viaje de bala directo (sin caída) que es instantáneo, el juego traza una línea imaginaria (vector) desde el punto del barril hacia adelante. Luego calcula con qué se cruza esa línea y registra un "golpe" de bala en ese punto. Podría ser un objeto sólido como una pared donde un impacto desencadena un efecto como una calcomanía de bala y una "nube" de humo / escombros. Puede impactar un objeto rompible y provocar que se rompa, o puede impactar un objeto físico y darle una "patada". O, por supuesto, podría golpear al jugador u otro NPC y causar un golpe de salud. Las simulaciones de núcleo duro modelarán la bala que penetra a través de las paredes y desencadenará un efecto de golpe en el lado de salida, probablemente disminuyendo el daño de la bala al salir.
Solo para que los NPC no tengan un objetivo perfecto, muchos juegos agregan algún tipo de aleatorización al vector para modelar la propagación de balas. Esto es lo que verías en la vida real, donde las balas no todas golpean justo donde apuntas, sino en un patrón centrado alrededor del punto de puntería.
Para visualizar la propagación de la bala, imagine un cono saliendo de la pistola en lugar de una línea recta (vector). La dirección real de la bala se aleatoriza para estar en algún lugar dentro de este cono. Si el tirador está realmente cerca del objetivo, la extensión es pequeña y la precisión alta. Si el objetivo está muy lejos, el cono agrega más dispersión, por lo que es menos probable que el tirador golpee el objetivo.
Esta idea del cono de disparo se puede utilizar para modelar la precisión del tirador (habilidad), la precisión del arma y otras condiciones. Por ejemplo, un NPC de bajo nivel podría recibir un cono de disparo de baja precisión, mientras que un NPC altamente calificado tendría una precisión de alto nivel. Un jugador que corre con una ametralladora disparando desde la cadera tendría un cono de tiro ancho, que se reduciría si deja de correr o apuntar. Los rifles de francotirador tendrían conos de tiro más estrechos por naturaleza que una pistola.
fuente
Hablando del código fuente de Nexuiz desde el momento en que eché un vistazo, en realidad no enviaron un objeto 'bala' desde el punto A al punto B. Si recuerdo correctamente, y esto es específico solo para algunas armas, otras armas no son Cuando se disparan armas de impacto instantáneo, el código mira hacia dónde apunta su arma. Si está dirigido a una persona (y es un arma de golpe instantáneo) cuando haces clic en 'disparar', entonces hiciste un golpe.
También es notable cómo Nexuiz tenía la opción del lado del servidor de calcular los hits en el cliente o en el servidor. Si sospecha que los clientes están haciendo trampa, puede cambiar a los cálculos de aciertos del lado del servidor en un intento de ayudar a mitigar eso.
fuente
Otra estrategia es un híbrido de renderizar todo y rastrear todo. No necesariamente tiene que renderizar cada viñeta. Como ejemplo, si su arma dispara 30 disparos / segundo, un ataque puede generar unos cientos de partículas ... puede reducir el renderizado mediante el uso de un "efecto marcador", renderizar cada tercer disparo, rastrear los otros dos. El jugador todavía ve 10 disparos / segundo disparando al enemigo.
Ajusta tu situación específica, rinde más por una menor tasa de armas de fuego, menos por mayor.
fuente
No olvide que la velocidad de fotogramas frente a la velocidad de la bala puede ser un problema, en algunos casos, si no codificó su motor de física lo suficientemente bien, la bala puede atravesar el objeto sin golpearlo. Hay una solución para ese asunto, que no recuerdo muy bien ...
De todos modos, creo que puede ser muy problemático compensar las balas realistas en un entorno multijugador, si no imposible si la latencia comienza a ser más larga que 30 o 50 ms.
Sin embargo, un día, el ISP puede preocuparse un poco más por la latencia y ofrecer diferentes ofertas ... pero sin FTTH, sigue siendo un sueño ...
fuente
En juegos como mala compañía, Battlefeild 3 y acosador, creo que la bala es una entidad individual real disparada como un "cohete". Solo creo que el trazado de rayos es necesario si la bala alcanza instantáneamente el objetivo. Cuando la entidad en sí misma en balas realistas solo estará marcando para ver si golpea a alguien.
fuente
En realidad, si miras las repeticiones de video en Call of Duty, puedes ver débilmente un bípedo naranja volando por el aire hacia el objetivo deseado, y atacar ahobo realmente tiene la respuesta correcta en su mayor parte.
Si quieres un efecto richochet como dijo Hobo, solo ve a jugar a cualquiera de los juegos de Halo. Si disparas a una pared de metal desde una posición más cercana, puedes ver las balas resonando del metal. El francotirador en él deja un rastro hacia donde golpea.
Respuesta reiniciada terminada, puedo volver más tarde para arreglar.
fuente
Las viñetas y toda la física en la serie de juegos de acosadores usa una biblioteca de código abierto llamada "Open Dynamics Engine".
http://en.wikipedia.org/wiki/Open_Dynamics_Engine
Las balas caen con gravedad e incluso rebotan alrededor de las paredes y cosas con mucha precisión si eres lo suficientemente inteligente como para que puedas doblar una bala para dispararle a alguien que no puedes ver pero que conoce su posición. La viñeta es un modelo de objeto real. Esta es la forma más realista que he visto, el método de trazado de rayos no es práctico cuando comienzas a moverte en espacios grandes. Sin embargo, estaría bien disparar una pistola láser.
Otros juegos que lo usan BloodRayne 2, Call of Juarez, World of Goo, X-Moto y OpenSimulator.
Otra buena opción sería la biblioteca de física "Bullet". http://en.wikipedia.org/wiki/Bullet_%28software%29
Fue utilizado en Grand Theft Auto 4, Red Dead Redention y más.
ps arma 2 usa un motor de física interno, su próximo juego arma 3 usará un motor de física physX
fuente