¿Cuáles son las matemáticas detrás del láser púrpura 'Raiden 2'?

15

La ruta del láser se ve afectada por la entrada del usuario y los enemigos presentes en la pantalla. Aquí hay un video, a las 5:00 minutos se muestra el láser en cuestión: Raiden II (PS) - 1 Loop Clear - Parte 2

ACTUALIZAR

Aquí hay una prueba con Inkscape, el barco está en el fondo, los primeros 4 enemigos son atacados por el plasma. Parece que hay una especie de patrón. Primero moví la nave, luego el mango para formar un ángulo de 45 °, luego, mientras intentaba ajustar la curva, encontré un patrón de mangos paralelos y continué hasta llegar al último enemigo. ingrese la descripción de la imagen aquí

Actualización, 26/05/2012 : comencé un proyecto XNA usando beziers, todavía hay algo de trabajo necesario, actualizaré la pregunta la próxima semana. Manténganse al tanto !

ingrese la descripción de la imagen aquí

Actualización: 30/05/2012 : Realmente parece que están usando curvas Bézier, creo que podré replicar / imitar un plasma de tal grado. Descubrí dos temas nuevos desde la última vez: la longitud del arco , el fenómeno de Runge , el primero debería ayudar a tener un movimiento lineal posible sobre una curva de Bézier, el segundo debería ayudar a optimizar el número de vértices. La próxima vez pondré un video para que pueda ver el progreso 8-)

Aybe
fuente
2
Bueno, es una spline de algún tipo. Posiblemente la curva de Bézier . No estoy seguro de si esta pregunta es respondida por alguien que no sean los desarrolladores originales. Si está intentando recrear este efecto, debe mostrarnos lo que tiene y decirnos qué no está funcionando.
MichaelHouse
2
No tengo idea, pero tiene una buena cantidad de radical.
Hackworth
1
Después de haber jugado una cantidad poco saludable de Raiden, tengo mis dudas de que la pasta de dientes sea algún tipo de curva cerrada. Siempre parecía mantener una buena cantidad de memoria. Sospecho que está haciendo algún tipo de ruta con un radio de giro obligatorio.
@ Byte56: los desarrolladores / fans de Shmup están dedicados, me sorprendería si esto no está documentado / ingeniería inversa en algún lugar por ahora.
3
Parece que coloca segmentos uno a la vez que salen del barco, con una curva máxima, y ​​cada segmento gira hacia los enemigos si hay alguno cerca o en la dirección del movimiento del barco.
Kevin Reid

Respuestas:

6

Acabo de crear algo que puede ayudarte. Fue en respuesta para ayudar a alguien en los foros GLBasic.

Aquí está el enlace del foro con mi sugerencia: Rolling Hills con textura aleatoria

Esto está escrito en GLBasic, pero traté de que fuera fácil de leer, por lo que debería convertirse fácilmente a cualquier idioma.

Para usarlo según sus necesidades, necesitaría generar sus datos / puntos spline. Reemplace los puntos de 'colina' en mi ejemplo con sus puntos de spline. Solo necesitaría agregar un efecto de animación / parpadeo de alguna manera. Tal vez un cambio de textura al azar.

La verdadera 'magia' ocurre en mi función 'AddPoint':

FUNCTION AddPoint: h AS THillPoint
    DIMPUSH self.points[], h

    // Is this the very first data point?
    IF LEN(self.points[]) = 1
        self.points[0].pu.Set(0, self.points[0].pm.y - self.texture_ht_up)
        self.points[0].pd.Set(0, self.points[0].pm.y + self.texture_ht_dn)
        RETURN
    ENDIF

    ALIAS h0 AS self.points[-2]  // Reference to the 2nd last point
    ALIAS h1 AS self.points[-1]  // Reference to the last point
    LOCAL angle#
    LOCAL v1 AS TVector
    LOCAL v0 AS TVector

    // Calculate 'p2' of HillPoint - form rectangle with previous point
    angle = ATAN(h1.pm.y - h0.pm.y, h1.pm.x - h0.pm.x)  -90// Angle of the two points

    v1.x = COS(angle) * self.texture_ht_up + h1.pm.x
    v1.y = SIN(angle) * self.texture_ht_up + h1.pm.y
    v0.x = COS(angle) * self.texture_ht_up + h0.pm.x
    v0.y = SIN(angle) * self.texture_ht_up + h0.pm.y
    h0.pu = h0.pu.AverageWith(v0)
    h1.pu.Copy(v1)

    v1.x = COS(angle) * -self.texture_ht_dn + h1.pm.x
    v1.y = SIN(angle) * -self.texture_ht_dn + h1.pm.y
    v0.x = COS(angle) * -self.texture_ht_dn + h0.pm.x
    v0.y = SIN(angle) * -self.texture_ht_dn + h0.pm.y
    h0.pd = h0.pd.AverageWith(v0)
    h1.pd.Copy(v1)
ENDFUNCTION

Aquí es donde calculo los quads / polígonos finales que trazan el sprite a lo largo de la línea.

Aquí están los resultados finales: ingrese la descripción de la imagen aquí

Y con la estructura metálica de los polígonos activada: ingrese la descripción de la imagen aquí

Doug.McFarlane
fuente
1
Genial, lo miraré. Por cierto, el enlace que diste está roto.
Aybe
3
El enlace no parece estar roto para mí ...
doppelgreener
Acabo de comprobar el enlace de Rolling Hills con textura aleatoria en este momento, me trae un error 404.
Aybe
1
Extraño. Aún funciona para mí. Pero aquí está el enlace subyacente: glbasic.com/forum/index.php?topic=8118
Doug.McFarlane
Roto por mí, probé la página de inicio, que muestra '¡Funciona!' y eso es todo ... raro.
Aybe