¿Cómo puedo generar un efecto de rayo?


26

¿Existe un algoritmo para generar un rayo?

Me gustaría un algoritmo que genere una lista de objetos de segmento u punto que especifique dónde aterrizará el rayo. El método necesitaría un parámetro de punto de inicio, junto con un punto final. El rayo debe tener ramas aleatorias saliendo de él, y zig-zag a intervalos aleatorios. El resultado será un efecto de rayo aleatorio que se vería así


(fuente: wikimedia.org )

Si alguien conoce un algoritmo para el que esto pueda funcionar, ¡la ayuda sería muy apreciada!


2
Este documento de Nvidia debería ser justo lo que necesita, aunque puede ser demasiado extenso. Revise las diapositivas 7 a 11, tienen algunas imágenes agradables que deberían darle una idea de a qué apuntar. Si sigue el segundo enlace, encontrará el código fuente (C ++, Direct3D). developer.download.nvidia.com/SDK/10/direct3d/Source/Lightning/… developer.download.nvidia.com/SDK/10/direct3d/samples.html
Fallo

Respuestas:


32

Hay un algoritmo bastante sencillo que puede usar para generar pernos de iluminación.

Comience con un segmento de línea entre el origen del perno ( O) y el punto final ( E)

Elija un punto en esa línea (aproximadamente o exactamente en el medio), llamado Sy divida el segmento en dos segmentos de línea ( O->Sy S->E). Desplazarse Slejos del segmento de línea original (a lo largo de la normal del segmento) por una pequeña cantidad aleatoria. Esto le da una sola "curva" de rayos.

Después de calcular la curva, en función de una pequeña posibilidad aleatoria, querrás agregar un tercer segmento de línea (generalmente una extensión del O->Ssegmento). Así es como se producen los "tenedores" en el rayo. Por lo general, querrá realizar un seguimiento de la información sobre la intensidad del tornillo durante este proceso de generación, porque querrá que las horquillas sean más tenues o tengan un desenfoque más sutil:

ingrese la descripción de la imagen aquí

Luego, repita el proceso anterior para todos los nuevos segmentos de línea que tenga; deberás elegir una cantidad de repetición que produzca formas que te gusten:

ingrese la descripción de la imagen aquí

Aquí hay una explicación bastante clara de esta técnica en el blog de mi amigo (es donde robé descaradamente las fotos); entra en profundidad adicional sobre agregar el efecto de brillo también.

Finalmente, también está este documento de NVIDIA que describe el mismo algoritmo básico (también con más detalles).


13

Recomendaría un enfoque alternativo: el árbol aleatorio de exploración rápida (RRT) . Una cosa genial es que puedes hacer que gire en las esquinas o explote en todas las direcciones.

El algoritmo es realmente básico:

// Returns a random tree containing the start and the goal.
// Grows the tree for a maximum number of iterations.
Tree RRT(Node start, Node goal, int maxIters)
{
    // Initialize a tree with a root as the start node.
    Tree t = new Tree();
    t.Root = start;


    bool reachedGoal = false;
    int iter = 0;

    // Keep growing the tree until it contains the goal and we've
    // grown for the required number of iterations.
    while (!reachedGoal || iter < maxIters)
    {
         // Get a random node somewhere near the goal
         Node random = RandomSample(goal);
         // Get the closest node in the tree to the sample.
         Node closest = t.GetClosestNode(random);
         // Create a new node between the closest node and the sample.
         Node extension = ExtendToward(closest, random);
         // If we managed to create a new node, add it to the tree.
         if (extension)
         {
             closest.AddChild(extension);

             // If we haven't yet reached the goal, and the new node
             // is very near the goal, add the goal to the tree.
             if(!reachedGoal && extension.IsNear(goal))
             {
                extension.AddChild(goal);
                reachedGoal = true;
             }
         }
         iter++;
    }
    return t;
}

Al modificar las funciones RandomSampley ExtendToward, puede obtener árboles muy diferentes. Si RandomSamplesolo muestras de manera uniforme en todas partes, el árbol crecerá de manera uniforme en todas las direcciones. Si está sesgado hacia la meta, el árbol tenderá a crecer hacia la meta. Si siempre muestra el objetivo, el árbol será una línea recta desde el principio hasta el objetivo.

ExtendTowardtambién puede permitirte hacer cosas interesantes al árbol. Por un lado, si tiene obstáculos (como paredes), puede hacer que el árbol crezca a su alrededor simplemente rechazando las extensiones que colisionan con las paredes.

Esto es lo que parece cuando no sesgas el muestreo hacia la meta:

img
(fuente: uiuc.edu )

Y así es como se ve con las paredes

Algunas propiedades interesantes del RRT una vez que está terminado:

  • El RRT nunca se cruzará
  • El RRT eventualmente cubrirá todo el espacio con ramas cada vez más pequeñas.
  • El camino desde el comienzo hasta la meta puede ser completamente aleatorio y extraño.

Acabo de usar este algoritmo para generar una animación de rayo. Debo decir que funcionó muy bien! Hay un error tipográfico importante en el código, como que no se incrementa en cada bucle. Aparte de que este está casi listo para su uso como publicado
applejacks01
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.