Ahora, vamos a tratar de hacer que nuestras fuerzas sean un poco más fieles a la realidad, al mejorar la gravedad del último ejemplo e introducir una fuerza de fricción.

Gravedad en la Tierra

Puedes haber notado algo terriblemente inexacto sobre este último ejemplo. Mientras más pequeño el círculo, más rápido cae. Hay una lógica para esto; después de todo, solo expresamos (según la segunda ley de Newton) que mientras menor sea la masa, mayor será la aceleración. Pero esto no es lo que sucede en el mundo real. Si subieras a la cima de la torre inclinada de Pisa y dejaras caer dos pelotas de masas diferentes, ¿cuál golpearía el suelo primero? Según la leyenda, Galileo realizó esta misma prueba en 1589, descubriendo que caen con la misma aceleración, golpeando el suelo al mismo tiempo. ¿Por qué sucede esto? Como veremos más adelante en este curso, la fuerza de gravedad se calcula en relación a la masa de un objeto. Mientras más grande sea el objeto, mayor será la fuerza. Así que si la fuerza se escala de acuerdo con la masa, se cancela cuando la aceleración se divide entre la masa. Podemos implementar esto en nuestro esquema con bastante facilidad al multiplicar nuestra fuerza de gravedad inventada por la masa.

for (var i = 0; i < movers.length; i++) {
    var wind = new PVector(0.01, 0);
    var gravity = new PVector(0, 0.1 * movers[i].mass);
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
}
Mientras que los objetos ahora caen a la misma velocidad, porque la intensidad de la fuerza del viento es independiente de la masa, los objetos más pequeños todavía se aceleran hacia la derecha más rápidamente.
Inventar fuerzas en realidad nos llevará bastante lejos. El mundo de ProcessingJS es un mundo simulado de pixeles y tú eres su amo. Así que cualquier cosa que consideres apropiada para ser una fuerza, pues caramba, es la fuerza que debe ser. Sin embargo, puede llegar un momento donde te encuentres preguntándote: “¿pero realmente cómo funciona todo?”
Abre cualquier libro de física de secundaria y encontrarás algunos diagramas y fórmulas que describen muchas fuerzas diferentes: gravedad, electromagnetismo, fricción, tensión, elasticidad y más. O, también, navega por las lecciones de física en Khan Academy. En esta sección, vamos a ver dos de esas fuerzas: fricción y gravedad. El punto que estamos haciendo aquí no es que la fricción y la gravedad sean fuerzas fundamentales que siempre tienes que tener en todos tus programas de ProcessingJS. Más bien, queremos evaluar estas dos fuerzas como estudios de caso para el siguiente proceso:
  • Entender el concepto detrás de una fuerza
  • Descomponer la fórmula de la fuerza en dos partes:
    • ¿Cómo calculamos la dirección de la fuerza?
    • ¿Cómo calculamos magnitud de la fuerza?
  • Traducir esa fórmula en código de ProcessingJS que calcule un PVector que sea enviado a través de la función applyForce() de nuestro Mover.
Si podemos seguir los pasos anteriores con dos fuerzas, entonces con suerte si alguna vez te encuentras googleando “fuerza nuclear débil de núcleos atómicos” a las 3 a.m., tendrás las habilidades para tomar lo que encuentres y adaptarlo para los programas de ProcessingJS.
Lidiar con fórmulas
Bien, en un momento vamos a escribir la fórmula para la fricción. Esta no es la primera vez que vemos esta fórmula; acabamos de terminar nuestra discusión acerca de la segunda ley de Newton, F, with, vector, on top, equals, M, times, A, with, vector, on top​ (o fuerza = masa * aceleración). No pasamos mucho tiempo preocupándonos por esta fórmula porque es linda y sencilla. Sin embargo, el mundo real es más complicado y feo. Solo echa un vistazo a la ecuación de una distribución “normal”, la cual cubrimos (sin ver la fórmula) en la introducción.
f, left parenthesis, x, comma, mu, comma, sigma, right parenthesis, equals, start fraction, 1, divided by, sigma, square root of, 2, pi, end square root, end fraction, e, start superscript, left parenthesis, minus, start fraction, left parenthesis, x, minus, mu, right parenthesis, start superscript, 2, end superscript, divided by, 2, sigma, start superscript, 2, end superscript, end fraction, right parenthesis, end superscript
Lo que estamos viendo aquí es que a las fórmulas les gusta usar muchos símbolos (a menudo letras del alfabeto griego). Echemos un vistazo a la fórmula de la fricción.
Si ha pasado un tiempo desde que miraste una fórmula de matemáticas o física, hay tres puntos clave que son importantes cubrir antes de continuar.
  • Evalúa el lado derecho, asigna del lado izquierdo. ¡Esto es justo como en el código! Lo que estamos haciendo aquí es evaluar el lado derecho de la ecuación y asignárselo al izquierdo. En el caso de arriba, queremos calcular la fuerza de fricción: el lado izquierdo nos dice qué es lo que queremos calcular y el derecho nos dice cómo hacerlo.
  • ¿Estamos hablando de un vector o de un escalar? Es importante darnos cuenta de que en algunos casos estaremos viendo un vector. Podemos ver eso por la flecha que está arriba de la palabra “fricción”. Tiene una magnitud y dirección. El lado derecho de la ecuación también tiene un vector, indicado por el símbolo v^ \hat{v} , que en este caso representa el vector unitario de velocidad.
  • Cuando los símbolos están colocados uno junto al otro, queremos decir que se multiplican. La fórmula de arriba en realidad tiene cuatro elementos: -1, , N y v^ \hat{v} . Queremos multiplicarlos todos y leer la fórmula como:

Fricción

Comencemos con la fricción y sigamos nuestros pasos.
La fricción es una fuerza disipativa. Una fuerza disipativa es aquella en la cual la energía total de un sistema disminuye cuando un objeto está en movimiento. Digamos que estás conduciendo un coche. Cuando pisas el pedal de freno, los frenos del coche usan fricción para frenar el movimiento de las llantas. La energía cinética (movimiento) es convertida en energía térmica (calor). Siempre que dos superficies entran en contacto, experimentan fricción. Un modelo completo de la fricción incluiría casos separados para fricción estática (un cuerpo en reposo sobre una superficie) y fricción cinética (un cuerpo en movimiento contra una superficie), pero para nuestros propósitos, solo vamos a ver el caso cinético.
Aquí está la fórmula para la fricción, junto con una ilustración: 
An illustration of someone sledding, alongside the formula for friction, Friction =−1µN*v
Ahora nos corresponde a nosotros separar esta fórmula en dos componentes que determinen la dirección de la fricción, así como la magnitud. Con base en el diagrama de arriba, podemos ver que la fricción apunta en la dirección opuesta a la velocidad. De hecho, esa es la parte de la fórmula que dice 1v^ -1 * \hat{v} , o -1 veces el vector unitario de velocidad. En ProcessingJS, esto significaría tomar el vector de velocidad, normalizarlo y multiplicarlo por -1.
var friction = velocity.get();
friction.normalize();
// Vamos a averiguar la dirección de la fuerza de fricción
//  (un vector unitario en la dirección opuesta de la velocidad).
friction.mult(-1);
Ten en cuenta los dos pasos adicionales aquí. Primero, es importante hacer una copia del vector de velocidad, ya que no queremos invertir la dirección del objeto por accidente. Segundo, normalizamos el vector. Esto es porque la magnitud de la fricción no está asociada con qué tan rápido se está moviendo, y queremos empezar con un vector de fricción de magnitud 1 para que se pueda escalar fácilmente.
Según la fórmula, la magnitud es mu, times, N. μ, la letra griega m (pronunciada “miu”), se utiliza aquí para describir el coeficiente de fricción. El coeficiente de fricción establece la intensidad de una fuerza de fricción para una superficie en particular. Mientras más grande es, más fuerte es la fricción; mientras más pequeña, más débil. Un bloque de hielo, por ejemplo, tendrá un coeficiente de fricción mucho menor que, digamos, papel de lija. Como estamos en un mundo simulado de ProcessingJS, podemos fijar arbitrariamente el coeficiente con base en cuánta fricción queremos simular.
var c = 0.01;
Ahora para la segunda parte: N. N se refiere a la fuerza normal, la fuerza perpendicular al movimiento del objeto a lo largo de una superficie. Piensa en un vehículo que circula por un camino. El vehículo empuja hacia abajo contra el camino con la gravedad, y la tercera ley de Newton nos dice que el camino a su vez empuja contra el vehículo. Esa es la fuerza normal. Mientras mayor sea la fuerza gravitacional, mayor será la fuerza normal. Como veremos en la siguiente sección, la gravedad está asociada con la masa, así que un auto deportivo ligero experimentaría menos fricción que un camión de remolque masivo. Con el diagrama de arriba, sin embargo, donde el objeto se mueve a lo largo de una superficie en un ángulo, calcular la fuerza normal es un poco más complicado porque no apunta en la misma dirección que la gravedad. Necesitaremos saber algo sobre ángulos y trigonometría.
Todos estos detalles son importantes; sin embargo, en ProcessingJS, una simulación “suficientemente buena” puede lograrse sin ellos. Podemos, por ejemplo, hacer que la fricción funcione con la suposición de que la fuerza normal siempre tendrá una magnitud de 1. Cuando nos metamos con trigonometría en la siguiente sección, nos acordaremos de regresar a esta cuestión y hacer nuestro ejemplo de fricción un poco más sofisticado. Por lo tanto:
var normal = 1;
Ahora que tenemos tanto la magnitud como la dirección de la fricción, podemos ponerlo todo junto…
var c = 0.01;
var normal = 1;
var frictionMag = c * normal;
var friction = movers[i].velocity.get();
friction.mult(-1);
friction.normalize();
friction.mult(frictionMag);
…y agregarlo a nuestro ejemplo de “fuerzas”, donde muchos objetos experimentan viento, gravedad y ahora fricción:
Si miras al programa funcionar durante un rato, te darás cuenta de que los círculos se mueven cada vez menos y tienden a quedarse alrededor de una zona. Como la fricción empuja continuamente contra el objeto en la dirección opuesta de su movimiento, el objeto se frena continuamente. Esto puede ser una técnica útil o un problema, dependiendo de los objetivos de tu visualización.

Este curso de "Simulaciones Naturales" es un derivado de "La Naturaleza del Código" por Daniel Shiffman, usado bajo una Licencia Creative Commons Reconocimiento-NoComercial 3.0 Unported.