Me preguntaba cómo se hacen las colisiones en algunos juegos simples de carreras de autos en 3D (especialmente en juegos como Outrun 2 / Motoracer).
En los juegos de carreras de autos clásicos con un entorno complejo (mundo abierto), supongo que esto se hace con una caja básica (para el automóvil) para colisionar en un avión (para pista, edificios y otras cosas). Todo se optimizaría utilizando algunos cuadros delimitadores (esta es la forma en que se realiza la colisión en muchos juegos).
En un juego como Outrun 2 / Motoracer, el juego es tan simple que los desarrolladores tal vez no lo necesiten y todo podría haberse simplificado mucho. Para aquellos que nunca lo juegan, esto es lo que es tan específico:
- El automóvil / bicicleta siempre está pegado en la carretera.
- El camino es siempre del mismo tamaño y tiene una forma muy simple.
- Las únicas posibilidades son seguir ese camino, no es posible salir del camino o chocar con otra cosa (excepto otros automóviles / bicicletas, pero no nos importa).
- Cuando chocas con la carretera, se realiza una colisión arcade muy básica (el automóvil simplemente se aleja de ella)
Así es como creo que se pudo haber hecho la colisión:
Toda la pista podría considerarse como una curva bezier 3d gigante. A partir de esa curva, se podrían generar los polígonos de la carretera (utilizando vectores frontales, izquierdos y superiores generados a partir de la curva). Otros elementos (como casas, árboles, ...) también se pueden colocar y alinear utilizando este método.
Luego, para manejar las colisiones (y dibujar el auto):
1) Encuentre la posición más cercana en la curva 3d desde la posición 3d actual del automóvil. En otras palabras, transforme la posición del automóvil 3d en una posición de curva bezier. Cada posición 3d en la carretera podría considerarse como un desplazamiento a lo largo de la curva 3d ( t
) + desplazamiento lateral ( d
). Verifique la imagen a continuación si no está clara (este es un ejemplo 2d, pero esto se aplica fácilmente a 3d).
cuando t = 0 auto está al comienzo de la sección de la pista, cuando t = 1 auto está al final. cuando d = -1 o 1 automóvil está en el borde de la vía, cuando d = 0 el automóvil está en el medio de la carretera
2) alinee el automóvil con la carretera usando t
y d
(muy simple: para cualquiera t
y d
valores puedo obtener una posición 3d + vectores arriba / adelante / izquierda). el auto ahora está pegado en la carretera
3) verifique el desplazamiento lateral d
del automóvil. si el valor es demasiado grande (d > 1)
o el (d < -1)
auto bajo está fuera de pista. simplemente sujételo para colocar el auto en el lugar correcto.
Esto también hace que el sacrificio en 3D sea muy simple, solo dibuja la pista desde la t
posición actual del automóvil hasta t + some_big_enough_value_to_avoid_visible_clipping
.
O tal vez estoy completamente equivocado: hubiera sido mucho más rápido y sencillo verificar la colisión del automóvil (un cuadro delimitador) y un conjunto muy simplificado de polígonos que representan la pista (sin los edificios y demás). El mundo 3D (y el modelo de colisión resultante) simplemente se habría generado antes, utilizando alguna herramienta de terceros (no más curva 3D al ejecutar el juego, solo un montón de polígonos).
fuente
En mi OpenGL racer, originalmente comencé usando dos círculos para definir los bordes de la pista, pero parecía demasiado complicado. Solo uso glReadPixel para leer el color del píxel. Si el auto del jugador está sobre un píxel verde (color hierba), entonces el movimiento está más limitado. Hay muy poco efecto en el rendimiento.
fuente