Archivo de la etiqueta: tutorial

Curlicue Fractal en Unity 5

El otro día estuve comentando con mi colega Patrick sobre las infinitas posibilidades artísticas que ofrecen los “Curlicue Fractal”.
A los que hayáis sufrido en vuestras carnes el estudio de los fundamentos matemáticos más profundos sobre cálculo infinitesimal seguramente os sonará.
A los que no, os lo explico brevemente. Un fractal es un objeto geométrico cuya estructura básica, fragmentada o irregular, se repite a diferentes escalas. Las maneras más comunes de determinar lo que hoy denominamos dimensión fractal fueron establecidas a principios del siglo XX en el seno de la teoría de la medida.(Wikipedia).

Dado que el Universo no son más que infinitas matemáticas, en la naturaleza se dan constantemente formas fractales a nivel molecular, por ejemplo, en un simple brócoli:

Dentro de los fractales existen multitud de familias y tipos. Entre ellos se encuentra el Curlicue Fractal.

El curlicue fractal es una figura obtenida por el siguiente enunciado:

The curlicue fractal is a figure obtained by the following procedure. Let s be an irrational number. Begin with a line segment of unit length, which makes an angle phi_0=0 to the horizontal. Then define theta_n iteratively by  theta_(n+1)=(theta_n+2pis) (mod 2pi),  with theta_0=0. To the end of the previous line segment, draw a line segment of unit length which makes an angle  phi_(n+1)=theta_n+phi_n (mod 2pi),

Dicho de otra forma, un Curlicue Fractal esa hecho por repetidas espirales conectadas entre sí que varían en escala y rotación. Un númerio irracional ‘s’ controla la característica forma y generación de estas espirales del siguiente modo:

theta(0) = 0
phi(0) = 0

theta(n+1) = (theta(n) + 2*PI*s) MOD (2*PI)
phi(n+1) = (phi(n) + theta(n)) MOD (2*PI)

Cuya distribución en un espacio de N2 se da por las coordenadas:
x(n) = cos(phi(n))
y(n) = sin(phi(n))

Como resultado en un espacio de 2 dimensiones, se pueden obtener las siguientes formas artísticas únicas, según qué constante “s”:

Tras todo este rollo paso a la parte que nos interesa, la generación de fractales en Unity 5.

La siguiente función en C# dibuja estos fractales:

void DrawCurlicue(GameObject particle, float s) {
float theta, phi, x0, y0, x1, y1;
theta = 0;
phi = 0;
x0 = 0;
y0 = 0;

for (int i = 1; i <= 10000; i++) {
x1 = x0 + Mathf.Cos(phi);
y1 = y0 + Mathf.Sin(phi);

x0 = x1;
y0 = y1;

phi = (theta + phi) % (2 * Mathf.PI);
theta = (theta + 2 * Mathf.PI * s) % (2 * Mathf.PI);

var new_obj = Instantiate(particle, new Vector3(x1, y1, (i/100f)), Quaternion.identity) as GameObject;
new_obj.transform.parent = particle_in_scene.transform;
}
}

Pasando por parámetro un tipo GameObject que en este caso es una esfera, y una constante real “s”, instancio en un espacio Vector3 hasta 10000 partículas que conforman el Curlicue Fractal.

3 2 11

 

Un impresionante, precioso resultado, único y con infnitas formas (un fractal por cada número float real)

https://dl.dropboxusercontent.com/u/11143518/fractals/curlicue/index.html

‘SimCity’ like in Unity

Estreno la categoría de Tutoriales con un nuevo proyecto personal llamado “UnityCity” descrito anteriormente; y en el que me he propuesto, como dice el título, hacer un juego al estilo SimCity 2000, SimCity 3000 o SimCity 4; en Unity.

Comienzo detallando el sistema de colocación de objetos (o ‘props’) en el escenario.

Comenzando por tener un grid como base de escenario, me he decantado por auto-generar una serie de minicubos prefabricados de tamaño (1, 0.25, 1) llamados “losa” con la siguiente textura:

Los “instancio” a partir de las coordenadas (0, 0, 0) con un script muy simple:

Y obtengo esto:

Captura

 

Ya tengo preparado un pequeño “grid” donde poder trastear con edificios, calles, etc…

Ahora, creo un .prefab con un par de cubos, que simulen una comisaria (o un hospital, o un colegio, o whatever…) al que llamo “edif_Test”, con un tamaño total máximo de (1, y, 1), con y un valor cualquiera (ya que es la altura del edficio).

Capturaedif Capturaedif2

Este prefab deberá anclarse a la casilla del suelo al hacer click sobre la misma. Para ello, hago uso de los famosos Raycast

Creo otro script con el siguiente código:

En este código preparo el típico Ray y RaycastHit para detectar dónde hago click. Al comenzar, cargo como recurso el prefab previamente creado del edificio en cuestión.

Mediante el método Camera.main.ScreenPointToRay(Input.mousePosition); lanzo un raycast desde la posición del ratón hacia la dirección en la que mira en la cámara. De este modo, con la cámara en modo Ortographic, donde pongo el puntero es donde pongo el edificio.

En caso de que el Raycast detecte físicas (en este caso, el grid del mapa), mediante el método Debug.DrawRay, puedo comprobar como efectivamente, la posición del puntero coincide con el lugar que señalo (aunque no se aprecia demasiado, el Debug.DrawRay es la delgada línea roja [peliculón!])

raycast_example_unitycity

Al definir

, lo que estoy haciendo es obtener las coordenadas ‘x’ y ‘z’ del centro del cuadradito del grid; de modo que al instanciar el edificio; éste aparezca justo en el centro del cuadrado.

Ya sólo queda entonces que, al hacer click, aparezca el dichoso edificio, en la posición definida:

Simple, rápido y eficaz. Ya tengo la base de UnityCity

unitycity_prev