jueves, 5 de junio de 2014

Práctica 4: Simulación de objetos deformables - Waves simulation

ENUNCIADO:
Implementar un mapa de alturas para simular distinto tipo de olas.
·Perturbación radial
·Ola oceánica
·Ola de Gerstner

La deformación de objetos se obtiene al conectar las partículas mediante una red de muelles, es decir, una malla de partículas con estructura basada en muelles, que puede ser Structured, Shear o, entre otras, Bend. En esta práctica implementaremos la clase Ola, el mapa de alturas, y calibraremos los modelos que empleemos para obtener un comportamiento físico realista del mar.
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