Unidad 1
Introducción
La aleatoriedad es un concepto fundamental en la simulación de sistemas interactivos, ya que permite modelar comportamientos impredecibles y variabilidad en los sistemas. En esta unidad, explorarás cómo generar y utilizar números aleatorios en tus simulaciones, comprendiendo su importancia y aplicaciones. A través de ejemplos como los paseos aleatorios, aprenderás a implementar movimientos y comportamientos que emulan la aleatoriedad presente en la naturaleza. Este conocimiento te proporcionará las herramientas necesarias para desarrollar simulaciones más realistas y dinámicas.
¿Qué aprenderás en esta unidad?
Vas a explorar la aleatoriedad como una herramienta fundamental en la simulación de sistemas interactivos. Esta herramienta te permitirá producir comportamientos impredecibles y variabilidad.
Actividad 01
Arte generativo
Enunciado: vas a observar con detenimiento los siguientes videos y vas a reflexionar la relación que esto podría tener con tu perfil profesional:
- Generative Art Exploration Chapter I Tracing the Roots: The History of Generative Art
- Generative Art Exploration Chapter V: The Life and Work of Vera Molnár
- How To Draw With Code | Casey Reas
- Artist Spotlight | Who is Refik Anadol?
Entrega: escribe un texto corto donde expliques qué potencial crees que pueda tener el arte generativo y algorítmico en tu perfil profesional.
🚀 Tu solución:
Arte Generativo enfocado en la animación digital
Me parece que hay dos formas principales en las cuales podría utilizar el arte generativo en mi perfil profesional, una de ellas siendo plenamente creativa y la otra siendo algo prácticamente técnico.
En cuanto al lado creativo podría utilizar el arte del que se habla y se muestra en estos videos para poder inspirar mi estilo artístico, para crear mi estilo propio, utilizando como base ciertos algoritmos específicos, ciertas reglas de código para generar arte similar, de esta manera podría conseguir un estilo artístico sinérgico, que me represente y que muestre mis ideas, de una manera muy interesante y úmica.
Respecto a la parte técnica, ya podríamos hablar más detalladamente de en qué contextos se podría utilizar este tipo de arte o para qué propósitos, uno de ellos podrían ser experiencias interactivas con el usuario, tal y como lo hace Refik Anadol, otra manera sería generando terrenos, ruidos, y detalles de relleno para animaciones principalmente enfocadas en el 2d, pues es un hecho que según se ve, de esta manera podríamos tener mejores resultados, más pulidos, más acordes a lo necesario y con los que podríamos buscar cosas más específicas en general.
Actividad 02
Diseño generativo
Enunciado: vas a observar con detenimiento el siguiente video que habla acerca del diseño generativo
Recursos:
Entrega: escribe un texto corto donde reflexiones acerca de esta pregunta ¿Cómo se conecta lo anterior como mis intereses? O tal vez ¿Esto abre la puerta a la exploración de otras posibilidades?
🚀 Tu solución:
¿Conexión con mis intereses? ¿Nuevas posibilidades?
Me gustaría responder a ambas preguntas en conjunto, y no una por una, y es que me parece que la respuesta es positiva y se complementa, es decir, al ver el video, sobre todo la parte en la que habla de Brute, de como se ve el diseño del sistema de partículas, cuando muestra los renders y las demás cosas que se pueden hacer, modificar, etc, me parece algo impresionante y que si se puede replicar, de una manera un poco personalizada a los productos en los que me gustaría trabajar, podría dar unos resultados sumamente interesantes, es una forma visualmente muy atractiva de mostrar productos, y podría ser muy útil para traer a la vida promoción de productos de manera que visualmente se vea todo de una calidad superior.
En general de todo lo que habla y todo lo que muestra son cosas que tienen un potencial creativo enorme, no sólo para promoción de productos, también podrían utilizarase para entrar de una manera un poco diferente en la industria, como ya mencioné, la conexión principal con mis intereses va por el camino de promoción de productos, tal y como hizo con brute, pero me parece que si se le dedica tiempo, se puede explotar mucho en otros campos, pero me parece que ese es el principal.
Respecto a la exploración de nuevas posibilidades, creo que se podría ir por el tema de diferentes tipos de simulación, sin embargo, debido a mi desconocimiento no se me ocurre una forma específica de enrutarse, pero sé que es muy posible.
Investigación
Vas a indagar y a experimentar con los conceptos fundamentales de la unidad 0 del texto guía.
Actividad 03
Caminatas aleatorias
Enunciado: analiza el código del ejemplo Example 0.1: A Traditional Random Walk
Vas a realizar un experimento con el código:
- Comprende el código, entiende lo que pasa y cómo se está aplicando el concepto.
- Luego harás una modificación al código. Te harás esta pregunta ¿Qué pasaría si?
- Trata de lanzar una hipótesis de lo que crees que ocurrirá.
- Realiza la modificación.
Vas a documentar
- Describe el experimento que vas a realizar.
- ¿Qué pregunta quieres responder con este experimento?
- ¿Qué resultados esperas obtener?
- ¿Qué resultados obtuviste?
- ¿Qué aprendiste de este experimento?
Entrega: los asuntos que te pido documentar en el enunciado, el código con las modificaciones y una captura de pantalla que muestre el resultado del experimento.
🚀 Tu solución:
Comprendiendo el código de las caminatas aleatorias
Realmente no hice una sóla pregunta, traté de entender bien las partes del código, a qué se refería cada una, y ya de ahí experimenté brevemente pero con varias cosas, es decir, empecé por ver qué pasaría si cambiaba el color del rgb del fondo por un gris, obvio también en rgb, porque pues no me sentía cómodo con todo blanco, también agrandé un poco el cuadro ya que tampoco me sentía cómodo con un espacio de trabajo por la otra pregunta que tenía y era que si en lugar de dejar la opción de ir hacia arriba, la quitaba, y luego ponía nuevamente la de ir hacia abajo, al haber el doble de probabilidades la raya por así decirlo se dibujaría el doble de rápido hacia abajo, era lógica pura, y así fue.
En resumen, mis preguntas fueron ¿Qué pasaría si hago más grande este número el cual parece ser el tamaño del cuadro del canvas? ¿Qué pasaría si cambio este rgb por algo un poco más cómodo de ver? ¿Qué pasaría si quito la opción de ir hacia arriba y en su lugar pongo otra de ir hacia abajo?
Claramente las dos primeras eran bastante obvias, el cuadro se iba a agrandar y a hacer gris ya que de ese color había puesto el rgb, y la otra mi hipótesis fue correcta, que se movería hacia abajo el doble de rápido debido a que tenía el doble de posibilidad, en este caso primero quité la opción de ir hacia arriba, sin reemplazar, luego efectivamente puse dos veces la opción de ir hacia abajo y así fue, empezó a moverse hacia abajo más rápidamente c:
- Ahora, las preguntas que quería responder con este experimento:
- ¿Entiendo correctamente la naturaleza del código? ¿Entiendo correctamente qué hace cada parte por sencillo que sea? ¿No estoy confundiendo conceptos básicos de lo que se me acaba de explicar en la lectura?
- Esperaba que el cuadro se ampliara, se pusiera gris y la línea nunca subiera, sino que bajara y de hecho bajara el doble de rápido
- Los obtuve todos jaja
- Aprendí que realmente es un código bastante simple y predecible de modificar, quizá fue por lo que escogí
- Ahora, la imagen del código funcionando:
- Ahora, el código modificado:
let walker;
function setup() { createCanvas(640, 640); //Esta fue la modificación de tamaño walker = new Walker(); background(128,128,128); //Esta fue la modificación de color}
function draw() { walker.step(); walker.show();}
class Walker { constructor() { this.x = width / 2; this.y = height / 2; }
show() { stroke(0); point(this.x, this.y); }
step() { const choice = floor(random(4)); if (choice == 0) { this.x++; } else if (choice == 1) { this.x--; } else if (choice == 2) { this.y++; } else { //Aquí fue donde puse la otra opción hacia abajo this.y++; //} else {// //Y aquí quedó en comentarios la anterior, la que iba hacia arriba // this.y--;// } }}
Actividad 04
Distribuciones de probabilidad
Enunciado: analiza detenidamente este ejemplo.
En tus palabras cuál es la diferencia entre una distribución uniforme y una no uniforme de números aleatorios. Modifica el código de la caminata aleatoria para que utilice una distribución no uniforme, favoreciendo el movimiento hacia la derecha.
Entrega:
- Explicación de la diferencia entre distribuciones uniformes y no uniformes.
- Código modificado y captura de pantalla de la caminata con distribución no uniforme.
🚀 Tu solución:
Distribución no uniforme hacia la derechaaa
Realmente me parece que la diferencia es bastante sencilla, una distribución uniforme es aquella en la cual todos los números tienen exactamente las mismas probabilidades de salir, es decir, si tenemos 4 números, el 1, el 2, el 3 y el 4, todos tienen 25% de probabilidades de salir, sin embargo, una distribución no uniforme, es aquella en la que algunos números tienen más probabilidad de salir que otros, creando en este caso una campana de gauss, por ejemplo, en este caso, con estos mismos números, digamos que el 3 y el 4 tienen un 30% de posibilidades de salir, mientras que el 1 y el 2 sólo tinene un 20%, es un hecho de que es más probable que el 3 y el 4 salgan.
En resumen, en una distribución uniforme todos los números tienen la misma posibilidad de salir, y en una distribución no uniforme hay números con más posibilidades de salir que otros.
En el caso de las caminatas aleatorias lo único que hizo falta para que esta fuera una distribución no uniforme fue algo similar a lo que hice con la anterior actividad, que fue básicamente añadir otra posibilidad de que fuera hacia la derecha, haciendo que de esta manera, por mucho que en ocasiones fuera hacia la izquierda, debido a que había el doble de probabilidades de ir hacia la derecha, la caminata en este caso, siempre iba a tender a ir hacia la derechaaa.
- Ahora, la imagen del código funcionando:
- Ahora, el código modificado:
let walker;
function setup() { createCanvas(640, 640); //Obviamente lo agrandé walker = new Walker(); background(93,155,155); //Esta vez lo puse azul}
function draw() { walker.step(); walker.show();}
class Walker { constructor() { this.x = width / 2; this.y = height / 2; }
show() { stroke(0); point(this.x, this.y); }
step() { const choice = floor(random(5)); //Aquí aumenté el número de aleatoreidades if (choice == 0) { this.x++; } else if (choice == 1) { this.x--; } else if (choice == 2) { this.y++; } else if (choice == 3) { this.y--; } else { //Y aquí puse otra posibilidad de que pueda ir a la derecha, de esa manera aunque a veces se devuelve, tiende a ir más hacia allá this.x++; } }}
Actividad 05
Distribución Normal
Enunciado: implementa un ejemplo que genere números aleatorios con una distribución normal (gaussiana). Visualiza la distribución utilizando figuras geométricas.
Entrega:
- Código del ejemplo
- Captura de pantalla
- Una breve explicación de cómo se refleja la distribución normal en la visualización.
🚀 Tu solución:
Lo que hice fue ponerme a jugar un poco con el código de explicación de la distribución normal de la actividad #4, y tuve un resultado bastante cómodo a mi parecer, pues se nota como directamente se forma una campana de gauss en la visualización del código, la cual es la siguiente:
Me parece que es más que evidente que la distribución normal se refleja de manera directa en la campana que se forma al momento de verse la visualización del código, el cual es el siguiente:
function setup() { createCanvas(100, 100); background(93,125,125); describe('Robé el ejemplo de la actividad #4 y le estuve haciendo modificaciones hasta que funcionó como lo necesitaba.');}function draw() { // Style the circles. noStroke(); fill(0, 10); y = randomGaussian(50,1); x = 10; circle(x, y, 5);
y = randomGaussian(50,5); x = 20; circle(x, y, 5);
y = randomGaussian(50,10); x = 30; circle(x, y, 5); y = randomGaussian(50, 15); x = 40; circle(x, y, 5);
y = randomGaussian(50, 20); x = 50; circle(x, y, 5);
y = randomGaussian(50, 15); x = 60; circle(x, y, 5);
y = randomGaussian(50, 10); x = 70; circle(x, y, 5);
y = randomGaussian(50, 5); x = 80; circle(x, y, 5);
y = randomGaussian(50, 1); x = 90; circle(x, y, 5);}
Actividad 06
Distribución personalizada: Lévy flight
Enunciado: realiza una simulación donde visualices un salta de Lévy.
Entrega:
- En qué consiste el concepto de Lévy flight y en qué caso sería interesante usarlo.
- Código de la simulación.
- Captura de pantalla.
🚀 Tu solución:
Vuelo de Lévy
En este caso, el vuelo de lévy es un tipo de caminata aleatoria en que la mayoría de pasos son pequeños, pero de vez en cuando ocurre un salto considerablemente largo, y es en esencia esto lo que la diferencia de una caminata aleatoria normal, donde todos los pasos tienen prácticamente la misma distancia o el mismo tamaño por así decirlo, y si se llega a notar alguna inclinación es por mera aleatoreidad.
Este concepto normalmente se usa para modelar o simular movimientos naturales, estos pueden ser el patrón de búsqueda de comida de los animales, cuando claramente se dan cuenta que en la zona ya no hay y van hacia otra zona a seguir buscando, o en un caso un poco más experimental, en el comportamiento de partículas como pueden ser las de fluidos turbulentos, algo también aleatorio y muy variable.
let walker;
function setup() { createCanvas(640, 640); walker = new Walker(); background(95, 128, 128);}
function draw() { walker.step(); walker.show();}
class Walker { constructor() { this.x = width / 2; this.y = height / 2; this.prevX = this.x; this.prevY = this.y; }
show() { stroke(0); line(this.prevX, this.prevY, this.x, this.y); // Dibuja una línea entre el punto anterior y el actual }
step() { this.prevX = this.x; this.prevY = this.y;
let stepSize = this.levy(); let angle = random(TWO_PI); let dx = stepSize * cos(angle); let dy = stepSize * sin(angle);
this.x += dx; this.y += dy;
this.x = constrain(this.x, 0, width); this.y = constrain(this.y, 0, height); }
levy() { let num; do { num = randomGaussian(0, 1); } while (abs(num) < 0.1);
return pow(abs(num), 2) * 7 * random([1, -1]); // Aumenta la distancia de los saltos grandes }}
Actividad 07
Ruido Perlin
Enunciado: utiliza el ruido Perlin para generar variaciones aleatorias pero suaves. Construye una aplicación que permita visualizar lo anterior.
Entrega:
- Explica en tus propias palabras la figura 0.4: “A graph of Perlin noise values over time (left) and of random noise values over time (right)”
- Explica cómo usaste el ruido Perlin para generar las variaciones.
- El código.
- Una captura de pantalla que muestre la visualización generada.
🚀 Tu solución:
Concepto de Ruido Perlin
La izquierda es algo así como un camino aleatorio suavizado, es claro que esta usa Ruido Perlin, y se parece a una señal natural como una montaña, unas olas o una onda suave, mientras que la figura de la derecha es totalmente caótica y aleatoria, sin siquiera continuidad, cada punto es completamente aleatorio e independiente.
Ahora, hagamos una variación en mi código de la actividad #4 para que se note un ruido perlin en este, Ahora el movimiento del walker es más fluido y natural, como si siguiera una corriente en lugar de moverse de forma impredecible, y esto se debe a que su dirección no cambia abruptamente sino que sigue una secuencia de valores que evolucionan de manera continua, evitando los saltos bruscos del movimiento aleatorio.
let walker;
function setup() { createCanvas(640, 640); walker = new Walker(); background(93, 155, 155); // Azul}
function draw() { walker.step(); walker.show();}
class Walker { constructor() { this.x = width / 2; this.y = height / 2; this.tx = 0; // Tiempo para Perlin Noise en X this.ty = 10000; // Tiempo para Perlin Noise en Y (desfase para evitar valores iguales) }
show() { stroke(0); strokeWeight(2); point(this.x, this.y); }
step() { this.x = map(noise(this.tx), 0, 1, 0, width); this.y = map(noise(this.ty), 0, 1, 0, height);
this.tx += 0.01; // Pequeño incremento para transición suave this.ty += 0.01; }}
Aplicación
Vas a aplicar los conceptos con los que experimentaste en la fase de investigación para diseñar y desarrollar una aplicación interactiva en tiempo real.
Actividad 08
Diseño: exploración de la idea
Enunciado: diseña una aplicación interactiva en tiempo que utilice los conceptos que investigaste. La aplicación debe:
- Generar una pieza de arte generativo algorítmico.
- Debes usar al menos TRES conceptos.
- El contenido generado debe ser interactivo. Puedes utilizar mouse, teclado, cámara, micrófono, etc, para variar los parámetros del algoritmo en tiempo real.
Entrega:
- Un texto donde expliques tu intención de diseño.
- ¿Cómo piensas usar los tres conceptos y por qué estos?
- Reporta los referentes que usaste para inspirarte.
🚀 Tu solución:
Primera aplicación de arte interactiva
La verdad es que es algo fácil de pensar pero se me está complicando un poco de hacer, mi idea es la siguiente:
Me gustaría hacer una aplicación que con las teclas ‘WASD’ se controle una bolita con un movimiento ‘random walker’ pero que estas decidan la inclinación del mismo, es decir, un random walk que al presionar la ‘a’ tenga tendencia hacia la izquierda, al presionar la ‘d’, tendencia la derecha, etc, Luego, me gustaría implementar dos teclas interactivas dependiendo de donde esté, es decir, si le doy a la ‘f’ que haga un vuelo de lévy aleatorio desde donde está, si se presiona la tecla ‘g’ que se empice a mover con un ruido perlin pero con la tendencia dependiendo de la telca presionada, la que sea de las ‘WASD’, y ya al presionar la tecla ‘h’ que vuelva al modo random walker
Ahí estarían utilizados los tres conceptos de ‘Random Walker’, de ‘Perlin Noise’ y de ‘Lévy Flight’, escogí estos 3 conceptos porque siento que podrían tener una sinergia interesante al momento de hacer una pieza de arte generativa y que combinando los 3 conceptos se puede lograr prácticamente cualquier tipo de movimeinto que se necesite.
Y realmente mi referente principal fueron mi código de la actividad 4 con un rando walk con tendecia hacia la derecha el cual me hizo pensar que podría usar las flechas para que la tendencia sea hacia donde quiero, lo cual ya logré, sólo me falta la cuestión de los ‘modos de movimiento por’ así decirlo, y mi otra inspiración fue la gráfica del perlin noise, me gustó ese tipo de movimiento y me gustaría implementarlo, ya el vuelo de lévy es como un toque de aleatoreidad.
Actividad 09
Materialización
Enunciado: vas a implementar tu aplicación diseñada.
Entrega:
- Código de la aplicación.
- Captura del contenido generado.
- En caso de realizar alguna variación al concepto original, escribe un texto donde expliques la razón del cambio.
🚀 Tu solución:
Aplicación interactiva
Hice un cambio en el concepto, ahora el ruido perlin no irá en dirección de las teclas ‘WASD’ sino que al presionar la tecla ‘g’, este se moverá libremente durante un par de segundos, el vuelo de levy sigue siendo igual, al presionar la ‘f’ se mueve aleatoriamente a una parte de la pantalla.
Ahora todo quedó listo, se mueve con las teclas ‘WASD’, si presiono la tecla ‘F’ hace un vuelo de lévy y si presiono la tecla ‘G’ se mueve libremente con un ruido de Perlin durante 3 segundos.
let x, y; // Posición de la bolalet prevX, prevY; // Posición anterior para la trayectorialet stepSize = 5; // Tamaño del paso en el random walklet levyStepSize; // Tamaño del paso en el vuelo de Lévylet isLevy = false; // Indicador de si está en modo vuelo de Lévylet levySteps = 0; // Contador de los pasos del vuelo de Lévylet maxLevySteps = 4; // Número máximo de pasos para el vuelo de Lévy
// Variables para Perlin Noiselet tx = 0; // Tiempo para Perlin Noise en Xlet ty = 10000; // Tiempo para Perlin Noise en Y (desfase para evitar valores iguales)let isPerlinMoving = false; // Indicador de si está en modo Perlin Noiselet perlinStartTime; // Tiempo de inicio para el movimiento Perlinlet perlinDuration = 3000; // Duración del movimiento Perlin en milisegundos
function setup() { createCanvas(640, 640); // Inicializamos las posiciones de la bola x = width / 2; y = height / 2; prevX = x; prevY = y; background(93, 155, 155); // Fondo azul cian}
function draw() { // Dibujamos la trayectoria de la bola stroke(0); // Trazo negro para la trayectoria line(prevX, prevY, x, y); // Dibuja línea entre la posición anterior y la nueva
// Dibujamos la bola en rojo oscuro fill(139, 0, 0); // Rojo oscuro noStroke(); ellipse(x, y, 10, 10); // La bola tiene un tamaño de 10px
// Guardamos la posición anterior prevX = x; prevY = y;
if (isLevy) { levyMove(); // Si está en modo Lévy, mueve con Lévy } else if (isPerlinMoving) { perlinMove(); // Si está en modo Perlin Noise, mueve con Perlin } else { // Movimiento de la bola según la tecla presionada if (keyIsDown(65)) { // Tecla 'A' para izquierda x -= stepSize; } else if (keyIsDown(87)) { // Tecla 'W' para arriba y -= stepSize; } else if (keyIsDown(68)) { // Tecla 'D' para derecha x += stepSize; } else if (keyIsDown(83)) { // Tecla 'S' para abajo y += stepSize; } else { // Movimiento random walk cuando no se presiona ninguna tecla let angle = random(TWO_PI); let dx = cos(angle) * stepSize; let dy = sin(angle) * stepSize; x += dx; y += dy; } }
// Aseguramos que la bola no salga del canvas x = constrain(x, 0, width); y = constrain(y, 0, height);}
// Activar el vuelo de Lévy al presionar la tecla 'F'function keyPressed() { if (key === 'f' || key === 'F') { if (!isLevy) { isLevy = true; // Activa el vuelo de Lévy levyStepSize = levy(); // Establece el tamaño de paso para el vuelo de Lévy levySteps = 0; // Reinicia el contador de pasos de Lévy } }
// Activar el movimiento Perlin al presionar la tecla 'G' if (key === 'g' || key === 'G') { if (!isPerlinMoving) { isPerlinMoving = true; // Activa el movimiento con Perlin Noise perlinStartTime = millis(); // Guarda el tiempo actual } }}
// Función de vuelo de Lévyfunction levyMove() { if (levySteps < maxLevySteps) { let angle = random(TWO_PI); let dx = cos(angle) * levyStepSize; let dy = sin(angle) * levyStepSize;
x += dx; y += dy;
// Después de un salto, generamos un nuevo tamaño de paso para el próximo salto levyStepSize = levy(); // Calculamos un nuevo tamaño de paso
// Aseguramos que la bola no salga del canvas x = constrain(x, 0, width); y = constrain(y, 0, height);
levySteps++; // Incrementamos el contador de pasos de Lévy } else { isLevy = false; // Detenemos el vuelo de Lévy después de 4 pasos }}
// Función para calcular un tamaño de paso de Lévyfunction levy() { let num; do { num = randomGaussian(0, 1); // Generamos un valor normal (gaussiano) } while (abs(num) < 0.1); // Nos aseguramos de que el valor no sea demasiado pequeño
return pow(abs(num), 2) * 20 * random([1, -1]); // Retornamos un valor de paso de Lévy}
// Función para mover la bola con Perlin Noisefunction perlinMove() { // Comprobamos si han pasado 3 segundos desde que comenzamos el movimiento if (millis() - perlinStartTime < perlinDuration) { // Movimiento con Perlin Noise x = map(noise(tx), 0, 1, 0, width); y = map(noise(ty), 0, 1, 0, height);
tx += 0.01; // Pequeño incremento para transición suave ty += 0.01; } else { // Después de 3 segundos, detenemos el movimiento Perlin isPerlinMoving = false; }}
Consolidación y matacognión
Ahora que has experimentado con la aleatoriedad y has aplicado estos conceptos en una pieza de arte generativo, es momento de reflexionar sobre el proceso y los resultados obtenidos.
Actividad 10
Análisis de resultados
Enunciado: revisa los resultados de las actividades de la fase APPLY. ¿Qué desafíos encontraste al aplicar los conceptos aprendidos? ¿Qué aprendiste de estos desafíos?
Entrega: descripción de los desafíos encontrados y las lecciones aprendidas durante la fase APPLY.
🚀 Tu solución:
Análisis de resultados y dificultades
En este caso, en la fase de apply, honestamente lo más complicado fue el tema del código, la idea la tuve inmediatamente, no fue complicado pensar en una forma en la que pudiera aplicar tres de los conceptos aprendidos y pensar en cómo podría hacer que la aplicación fuera interactiva y generase algún tipo de pieza de arte procedural con cierto toque de aleatoreidad por el tema de los conceptos mismos, sin embargo, respecto al código es algo que no sabía cómo se podría llegar a organizar, es algo que claramente hice con ayuda de IA ya que codificando no soy muy bueno y aunque soy absolutamente consciente del código como tal, se me llegó a dificultar entender cómo podía hacer que este funcionara, probé con muchos promps y obviamente tuve en cuenta códigos que sí hice yo en actividades de la fase de seek, que fueron casi todos, y aún así tenía problemas para poder coordinar y organizar lo que quería hacer, de hecho debido a esto tuve que hacer el pequeño cambio de concepto que había hecho de la idea inicial que tuve, a lo que terminó siendo como tal mi código y mi aplicación interactiva finalmente.
Es cierto que el cambio fue mínimo, pero si es un hecho que lo hice para facilitar el código ya que de la otra manera no podía hacer que funcionara aunque traté de meterle mano al código varias veces, no pude hacer el concepto que tuve en un principio, así que quizá esa sea la dificultad mayor, que debido a mis limitaciones al momento de codificar, aunque tengo otras formas de hacer lo que quiero, y aprendí a salir del paso y a quizá ingeniármelas para hacer cosas casi que iguales o conceptos similares, no puedo pensar en algo, y codificarlo directamente, así que es algo que debo trabajar y aunque sí me fue mejor con el código esta vez, aún tengo bastante que aprender de algunas lógicas de programación.
Actividad 11
Conexión con Diseño de Entretenimiento Digital
Enunciado: describe cómo los conceptos de aleatoriedad, distribuciones y ruido Perlin pueden ser utilizados en el diseño de videojuegos, experiencias interactivas o animaciones. Da ejemplos concretos.
Entrega: descripción de al menos tres aplicaciones de los conceptos aprendidos en el diseño de entretenimiento digital, con ejemplos concretos.
🚀 Tu solución:
Aplicación de conceptos a la rama del entretenimiento digital
Es un hecho que los conceptos descritos pueden ser sumamente útiles en el entretenimiento digital y más específicamente en estas 3 ramas, la aleatoreidad, distribuciones y el ruido perlin permiten generar contenido dinámico, natural y evidentemente muy variado y todo de una manera procedural, sin tener que perder tiempo en diseñar manualmente este tipo de cosas, lo cual sería un costo excesivo y un trabajo eterno si se ve a gran escala como se usa usualmente en esta industria.
Por ejemplo, yo diría que la aleatoreidad y las distribucionees se podrían usar principalmente en los videojuegos y las experiencias interactivas, la aleatoreidad podrían usarse en la aparición de enemigos o ítems mismos dentro del juego, del mapa, o de los niveles como tal, puede referirse a efectos visuales, eventos, comportamientos de npcs en juegos más complejos, etc.
Las distribuciones de probabilidad pueden llegar a controlar muchas cosas, pueden controlar frecuencias, patrones de eventos, es decir, a medida que uno se acerque a ciertos lugares puede haber más probabilidad de items más valiosos pero al mismo tiempo enemigos más poderosos, etc, esto mismo puede ser en las experiencias interactivas, al momento por ejemplo de escucharse un ruido más alto, podría generar patrones visuales más evidentes a la vista del usuario en cosas como visualizers de canciones, o con luces.
Por otro lado está el ruido perlin, el cual se usa tanto en generación de terrenos orgánicos, como en la animación al momento de suavizar los movimientos, las transiciones, los efectos visuales y animaciones en general, evitando así cambios abruptos, innaturales y poco atractivos al usuario.
En resumen:
1- Distribuciones de probabilidad: En juegos con NPCs o enemigos, las distribuciones de probabilidad pueden determinar cómo y dónde aparecen.
2- Ruido Perlin: En VFX y animaciones, el ruido Perlin se usa para simular efectos como humo, fuego y agua con movimientos fluidos y realistas.
3- Aleatoreidad: En algunos juegos tipo roguelike la estructura de los niveles se genera de forma procedural usando aleatoriedad para decidir la ubicación de habitaciones, enemigos y tesoros.
Niveles aleatorios en ‘The Binding of Isaac or Hades’
Actividad 12
Reflexión sobre el proceso de aprendizaje
Enunciado: reflexiona sobre tu propio proceso de aprendizaje durante esta unidad. ¿Qué estrategias te resultaron más efectivas para comprender los conceptos? ¿Qué podrías mejorar en futuras unidades?
Entrega:
- Descripción de las estrategias de aprendizaje utilizadas y su efectividad.
- Planteamiento de mejoras para futuras unidades.
🚀 Tu solución:
Comprensión de conceptos
A decir verdad, la mejor manera que tuve de comprender los conceptos era leyendo los textos guías, buscando en internet y por otra parte pidiendo explicaciones utilizando conceptos que ya conocía a chatgpt, de esta manera aunque leía y entendía todo de una forma un poco técnica, y con nuevos conceptos, lo que hacía chatgpt era explicarme con palabras y conceptos que ya conocía, algo nuevo, y de esta manera lograba entender todo lo nuevo de una forma un poco más amigable y familiar, y pude en varias ocasiones asimilar un concepto comparándolo con otro, y pues evidentemente utilizando ejemplos puntuales.
Debo decir que de esta manera me fue muy bien, entendí todo correctamente, no tuve problemas con ningún concepto y pues me quedó todo más claro de lo que esperaba, me parece una estrategia interesante, y en este momento no se me ocurre una forma de mejorarla, quizá para futuras unidades, lo que debería hacer sería adentrarme un poco más en el tema del código, pero es algo que estoy intentando de a poquito nuevamente y aún se me dificulta un poco, llega un punto en que no sé cómo continuar y me ofusco, pero ahí voy, de resto, la forma de entender los conceptos, de aplicarlos, y todo, es algo que por ahora se me facilitó bastante.
Actividad 13
Autoevaluación
Enunciado: evalúa tu nivel de comprensión de los conceptos de la unidad en una escala del 1 al 5 (1: Nada de comprensión, 5: Dominio completo). Justifica tu autoevaluación con ejemplos concretos de tu trabajo en la unidad. Identifica áreas donde necesitas reforzar tu aprendizaje.
Entrega:
- Autoevaluación con justificación y ejemplos concretos.
- Identificación de áreas de mejora.
🚀 Tu solución:
Autoevaluación de la unidad
Diría que de manera general me pondría un 4
Esto se debe a que aunque es cierto que comprendí totalmente todos los conceptos, entiendo perfectamente en qué casos estos se podrían usar, se me ocurren ejempos concretos con todos ellos en mi rama, y en las otras dos de la carrera, es cierto que no logro utilizar la lógica de la programación con un dominio absoluto, que es lo que me gustaría, si me fue bien con los códigos y con entender por qué hacían qué, y si pude por mano propia modificar códigos que ya habían (Eran cosas realmente básicas, pero me reconforta saber que no se me complica tanto), aún así, hay momentos en los que no puedo avanzar con el código y me quedo un poco limitado.
Ya lo había mencionado antes, pero es un hecho que el lugar principal donde debo reforzar mi aprendizaje es en la utilización y la lógica del código, los conceptos son cosas que comprendo muy fácilmente en general, no tengo problema ni entendiéndolos, ni aplicándolos, ni recordándolos normalmente, pero ya cuando llegamos a la parte del código, es cierto que se me dificulta más y debo seguir trabajando en ello, de resto me siento muy satisfecho con mi progreso en esta primera unidad, siento que fue una forma tranquila de empezar el curso y que si las cosas siguen así no tendré muchas dificultades para sguir avanzando, pues planeo mejorar en el tema del código, y sino, pues siempre tenemos las ayudas disponibles, que espero no hacer mucho uso de ellas y poder desarrollar un poco más esa habilidad.