Simulación de olas mediante mapas de altura

Simulación de distintas olas mediante el empleo de mapas de altura.

MAPA DE ALTURAS: Sistema para simular olas de mar mediante ondas periódicas, formado por una matriz de puntos, la altura de los cuales será el mapa de alturas del sistema. Dichos puntos serán la amplitud de la onda en cada instante.
Se calcula un vector de dirección distinto en cada caso, y se actualiza los vértices de la malla dependiendo del tipo de onda escogido. En el caso de las ondas radiales y sinusoidales tan solo modificamos la componente z de los vértices, mientras que en el modelo de Gerstner se modifican las componentes x, y, z ya que en este caso se devuelve un punto. Para simular el comportamiento de los tres tipos de ondas juntas crearemos
un vector sumatorio de ondas, y se devolverá un punto al igual que en Gerstner salvo que en este caso la componente z estará compuesta también por la suma entre el cálculo de la onda radial más la sinusoidal.

A = amplitud de la onda
k = número de onda = 2·pi/longitud de onda
w = frecuencia angular = 2·pi/periodo
t = tiempo
s = distancia al centro e la perturbación
D = dirección de propagación
Q = Constante de encrespamiento de la ola.

Direccional (Sinusoidal): Ondas en un sentido. Estas ondas simulan olas oceánicas. La simulación del sistema no conlleva desplazamiento de materia, por lo que su objetivo es más visual que empírico. Desde un punto arbitrario fuera de la malla, las perturbaciones van siendo generadas con amplitud, velocidad, dirección y longitud de onda constantes.
A medida que avanzamos en cada diferencial de tiempo, los frentes de las ondas van recorriendo la malla en función de la dirección unitaria preestablecida, que será la misma para todos los puntos de la malla.

z = A·cos(D·(x, y)·k + wt) 

Radial: Ondas circulares a partir de un centro. Al tratarse de la simulación de la
perturbación física superficial producida sobre un fluido, vamos a trabajar con un mapa de alturas, lo que no conlleva desplazamiento de materia, por lo que tiene claramente un objetivo más visual que empírico. Desde un punto de origen, la perturbación nace con una amplitud inicial, velocidad inicial y una longitud de onda predefinidas. A medida que avanzamos en cada diferencial de tiempo, la perturbación va afectando a los puntos
de la malla que distan del origen según la relación tiempo transcurrido y velocidad de propagación de la onda, y a su vez va viéndose afectada en una atenuación de su amplitud.

z = A·cos(k·s – w·t) 

Gerstner: Aquí se modifica la altura del vértice y la posición en el plano XY, pues están pensadas para simular mar de fondo, donde hay un sumatorio de ondas longitudinales, cada una de ellas con una dirección diferente y incluyendo diferentes parámetros de caracterización. Este tipo de ola supone transporte de materia por lo que se deben modificar las tres coordenadas del punto en cada iteración. Las olas se cruzan entre sí, generando puntos cercanos con alturas que cambian. Para este caso de mares más picados, debemos conseguir que las crestas de las olas se muevan y rompan sobre la superficie según la energía que transporten. Mediante Q, generamos la rotación de la ola con la que rompe sobre la superficie, en función inversamente proporcional a la frecuencia y a la amplitud.

x = x0 + Sumatorio(Q·A·Dx·cos(D·(x, y)·k + wt))
y = y0 + Sumatorio(Q·A·Dy·cos(D·(x, y)·k + wt))
z = Sumatorio(Q·A·Dy·cos(D·(x, y)·k + wt))

 

A continuación, se muestra un fragmento de código que muestra cómo se han parametrizado cada uno de los tipos de olas:

switch(mode){
case RADIAL:
res.z = A * sin(k * src_dir.dist(punto) – phi * t);
break;
case DIRECCIONAL:
src_dir.normalize();
res.z = A * sin(k * PVector.dot(src_dir,punto) + phi * t);
break;
case GERSTNER:
src_dir.normalize();
res.x = Q * A * src_dir.x * cos(k * PVector.dot(src_dir,punto) + phi * t);
res.y = Q * A * src_dir.y * cos(k * PVector.dot(src_dir,punto) + phi * t);
res.z = A * sin(k * PVector.dot(src_dir,punto) + phi * t);
break;

}

Una respuesta a «Simulación de olas mediante mapas de altura»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


¡IMPORTANTE! Responde a la pregunta: ¿Cuál es el valor de 8 7 ?