ENUNCIADO:
Implementar un mapa de alturas para simular distinto tipo de olas.
·Perturbación radial
·Ola oceánica
·Ola de Gerstner
Nos ayudaremos de este capítulo del libro GPU Gems y de este libro de Jerry Tessenford.
Contamos con tres clases:
Mar: Programa principal. Creamos un objeto HeighMap, y las olas en función de la tecla que pulsemos. Definimos el tamaños de las celdas y del lado de estas.
HighMap: Mapa de alturas. Creamos, en el constructor, la malla [ y * tamaño_lado, x * tamaño_lado, 0 ], en componentes 'x' e 'y' solamente, ya que la componente 'z' la calculamos en el 'update'; esto es, dependiendo del tipo (parámetro que le pasamos al crear la ola), llamaremos a un método y otro de la clase Wave. Por último, dibujaremos la malla con las partículas y su vecinos.
Wave: En el constructor tenemos los siguientes parámetros: velocidad, amplitud, frecuencia, longitud, periodo, tipo, origen. En esta clase es donde vamos a calcular la componente 'z' de las olas.
- Onda Radial: aplicamos la fórmula h(s) = a * cos (wP * s * tiempo), donde wP = 2 * PI / l, y 's' es la distancia entre el origen y la perturbación en la malla.
- Onda Simple: aplicamos la fórmula h(s) = a * cos(wP * s * tiempo) perteneciente a este tipo de ondas.
- Onda Gerstner: siguiendo el libro anteriormente citado, calculamos el punto en la malla donde no hay perturbación, resultado de multiplicar los coeficientes 'i' y 'j' (de vert[i][j] de la clase HeighMap) por el tamaño de la celda. En vez de devolver sólo la componente 'z' del vector de la malla, devolveremos el vector entero. Las componentes 'x' e 'y' se obtienen de la fórmula ' x = x0 − (k/k)A sin(k · x0 − ωt) ' , y el escalar de la 'z' de ' y1 = a * cos ( (k_dir.dot(x0)) - (w * tiempo)) '. Así, este método devuelve (x1.x, x1.y, y1).
(Abrir vídeo en YouTube para visualizar mejor, con texturas y luces)
No hay comentarios:
Publicar un comentario