Comiendo nueces para siempre

Así que en una materia en la que llevamos dinámica de sistemas, se nos planteó este problema:

Tienes un bowl con 100 nueces, decides comerte la mitad de las nueces que haya en el bowl cada hora, en cuánto tiempo te quedarás sin nueces?

Intuitivamente es fácil darse cuenta que, si puedes comer fracciones de nueces, estarás comiendo nueces para siempre… y si no confías en la intuición, la fórmula:

n(t) = n_0 / 2^t

que indica la cantidad de nueces que quedarán en la hora “t”, no tiene solución para 0.

Sabiendo esto, pregunto “puedo comerme medias nueces?” a lo que el lic. responde “no :|”. Me llevo las manos a la cabeza viendo a la hoja de papel con mis rudimentarios cálculos… “zomg! nunca aprendí a manejar correctamente los números enteros :S”…

Para salir del apuro, pienso: “bueno… cuando quede una sola nuez en el bowl, una hora después, me habré comido todas las nueces :D”, igualo la función a 1, la despejo para t, y le sumo 1 hora… el resultado? 7 horas!

Pero, no me convence, (de hecho, el error de este resultado crecerá proporcionalmente a la cantidad inicial de nueces en el bowl)… así que hago una simulación rudimentaria a mano:

horas   0     1     2     3     4     5     6     7
nueces  100,  50,   25,   12,   6,    3,    1,    0

yay! le achunté! :D… le muestro al lic, y me dice “no… sale más!”. Me rompo la cabeza intentando sacar más horas…

Tiempo más adelante, nos muestra su solución, y se ve algo así…

nueces1

“nos acabaremos las nueces, más o menos, después de 10 horas…”

Paso el resto de la clase intentando llegar a ese resultado de “10 horas”… hago una simulación “rudimentaria” en C++

#include <iostream>
#include <cmath>

using namespace std;

int main () {
  int n = 100;
  int h = 0;

  while (n > 0) {
    h++;
    n = floor(n/2);
    cout << "hr " << h << " " << n << endl;
  }

  return 0;
}

El resultado? las nueces llegan a 0 después de 7 horas… “pero… lic, hice una simulación rudimentaria en c++, y da 7 horas”… a lo que responde “ese es el problema! *rudimentaria*… hazlo en vencim, y hablamos”… no me gusta el vencim :S pero creo que voy a tener que usarlo esta vez, para demostrar mi punto…

nueces

usando vencim, me di cuenta que el gráfico que nos mostró asumía que sí podemos comer “medias nueces”, y, auque inicialmente sí parecía que acabaremos las nueces a las 10 horas, haciendo zoom, pareciera que acabaremos las nueces después de 10 horas, haciendo otro zoom, después de 12, otro zoom! y después de 14

nueces2nueces3.pngnueces4.png

Bueno… ahora solo tengo que pedirle al vencim que coma “nueces enteras” cada hora… no encuentro la función “floor”, pero sí encuentro la función “integer”… como lo redondea, cuando quede 1 sola nuez, redondeará 0.5 a 0, así que, según vencim, siempre habrán nueces en el bowl XD

nueces-enteras

rayos… creo que ni así puedo probar mi punto :S según el vencim, nunca acabaré las nueces! XD y ahora? si me pasa esto en el examen? cómo voy a encontrar la respuesta correcta? D:

Tal vez tenga que seguir el consejo de donkeysharp: “si quieres aprobar tus materias, tienes que apagar tu cerebro” T_T

Sliding background en unity 2D

Básicamente, lo que queremos hacer, es que el fondo de nuestro juego sea una imagen que puede repetirse infinitamente a lo horizontal. Es decir, partiendo de esta imagen:

tiled-background.png

Queremos que nuestro juego dé la impresión de un fondo infinito a lo horizontal, algo así:

infinite-scrolling.png

una opción, sería crear el mismo sprite una y otra vez, a lo horizontal, dependiendo de qué tan grande queremos que sea nuestro nivel… no me gusta esta opción, porque para que nuestro juego fuera rápido, tendríamos que aplicar culling (y aún no aprendemos eso en El Guild lol), además! con esta opción tendríamos que copiar y pegar a mano el sprite (o hacer un script que lo haga, pero los tutoriales que he visto, donde hacen esto, generan un montón de código! :S).

La otra opción (y la que veremos aquí), es la de: ponerle una imagen a un plano, y hacer que la imagen se “recorra”, mediante el Offset.X del standard shader en un material.

Para lo que no sirve…

Cuidado! esto debería usarse solo para el “fondo” del juego… si están haciendo un plataformer, como mario, lo que veremos aquí, es cómo hacer el fondo de mario, no las plataformas, ni el piso, ni las colisiones… eso es tema de otro tutorial XD (y la verdad, justo ahora, no estoy segura de cómo hacerlo lol).

¿Cómo hacerlo?

Primero, crearemos un nuevo proyecto en 2D… si tu proyecto está en 3D, no te preocupes! solo asegúrate que la cámara esté en Projection -> ortographic, y que en la escena, tengas activado ese botoncito “2D”.

02.jpg

Ahora, crearemos un plano. El plano será el recipiente de la imagen de fondo.03.jpg

Para que el plano esté viendo hacia la cámara, le cambiamos su rotación

04.jpg

Ahora crearemos un material (recuerdan? esas bolitas a las que les poníamos colores, y luego, podíamos colorear cualquier cosa en nuestro juego).

05.jpg

Después, importaremos la imagen que vamos a poner en el fondo.

06.jpg

Una vez importada la imagen, la “arrastramos” a Albedo. (Recuerdan? en albedo, cambiabamos el color de la bolita… aahh… entonces ahora, en vez de darle un color sólido, le estamos dando una imagen!). También le asignamos este nuevo material a nuestro plano. (La imagen se ve estirada :S pero no se preocupen! lo arreglaremos en seguida!).

07.jpg

Antes de seguir, tenemos que decirle a unity que la imagen que importamos es un “tile” o “mosaico”… para eso, seleccionamos la imagen, y nos aseguramos que Wrap Mode esté en Repeat y Texture Type en Texture.

08.jpg

En el material que acabamos de crear, hay una opción llamada “Offset”, que indica qué tanto de la imagen debería estar recorrida hacia la izquierda… pruébalo tú mismo! es más fácil de lo que suena: Pon tu mouse sobre el label “X”, haz clic y arrástralo hacia la derecha o izquierda, y verás que la imagen del plano también se moverá!.

09.jpg

Arreglando la proporción de la imagen

la imagen ahorita está estirada, y fea DX para arreglar esto, he encontrado un pequeño truquito :)

Básicamente, en scale, le ponemos el tamaño real de la imagen en pixeles.

Para ver el tamaño de la imagen en pixeles, puedes abrirla con gimp!

10.jpg

ahora que ya sabemos el tamaño de nuestra imagen, nos vamos a unity, y ponemos estos valores en el scale!

11.jpg

Si la imagen queda muy grande (o muy pequeña), solo achícala (o agrándala) uniformemente. Lo que nos interesa, es la proporción original.

Y ahora, desde código!

Entonces, lo que queremos hacer, es mover ese Offset.X desde el código, para que cuando el personaje se mueva hacia la derecha, la imagen se mueva hacia la izquierda, y cuando nuestro personaje se mueva hacia la izquierda, la imagen se mueva hacia la derecha.

No meteremos al personaje en este tutorial! pero sí veremos cómo mover la imagen desde el código!

Primero, creamos un script para el plano.

12.jpg

y luego… programamos! XD

Necesitamos “acceder desde el código” al material del plano, para esto, necesitamos acceder al Renderer, que es el componente que se encarga de renderizar al plano. Este componente, tiene acceso al material del plano.

Inicializamos al renderer (2da línea roja de código).

Luego, en el update, le diremos al offset que se “deslice” hacia la derecha (para que nuestra imagen se deslie hacia la izquierda), esto lo hacemos en la línea azul de código.

13.jpg

Recuerdan el Time.deltaTime? bueno, básicamente, es un número float que dice cuánto tiempo tardó un frame en pintarse…. como distancia = velocidad * tiempo, entonces, para que el movimiento de la imagen sea más “coherente”, podemos multiplicarle a scrollingSpeed el Time.deltaTime. (trozo amarillo de código)

14.jpg

Y eso es todo! XD denle play, y la imagen se va a deslizar ^__^

Este sábado les prometí muchos tutoriales D: así que… aún les quedo debiendo:

  • introducción al código
  • Horneando normales en blender
  • Mecanim
  • ??? (por fa, recuérdenme si me olvido algo XD)

Intentaré subir tutoriales en texto (no quiero comerme sus megas @.@), y también algunos tutoriales en video, cuando las cosas no se puedan explicar bien en texto…

Nos vemos! (y perdón por lo del proyector :S intentaré arreglarlo antes del siguiente viernes)

Sombras

Últimamente he estado dibujando en 2D bastante seguido… se ha convertido tan natural, que ahora siento como si fuera un proceso de compilación: tengo una idea, y mis manos la compilan en inkscape (claro, el proceso de compilación es bastante lento x__x).

Mis primeros dibujos eran bien sencillos, sin sombras, sin muchos detalles… me gustaba dejar que la imaginación del observador se inventara el resto :) y esto es bueno, pero… conforme tus ideas van haciéndose más complicadas, necesitas nuevas herramientas para “compilar” tu idea…

noob-showdown

Las sombras son una de las herramientas más poderosas en mi “librería de compilación” lol.

Con las sombras, puedes enfatizar la forma de un objeto! cuando dibujas en 2D, todo es plano, pero con las sombras, puedes darle pistas a la imaginación de los observadores para que asimilen la forma en 3D de tu dibujo.

01

Nunca me han gustado los gradientes, por eso, mis sombras siempre son colores definidos. Así mismo, procuro mantener el conteo de colores bajo, porque… no sé XD siento que así se ve más profesional. Si las sombras de tus dibujos tienen demasiados tonos, cuando quieras dar una pista sutil, es más probable que el observador la ignore.

Iluminación

02

Esa sutileza en el cambio de color que lleva al observador a especular sobre el lugar en el que está nuestro dibujo, es muy complicada de lograr…

hue-iluminacion.png

Recuerdas el vestido blanco y dorado que en realidad era azul y negro? algunos han especulado que esa confusión se debió a que, un trozo “A” de la foto le daba la información a nuestro cerebro de que el entorno en el que se tomó la foto era muy brillante, por lo que concluíamos que el vestido era azul y negro.

Otro trozo “B” de la foto, le daba la información a nuestro cerebro de que el entorno carecía de luz, por lo que concluía que el vestido era blanco y dorado (un dorado muy brillante).

dress.png

Algunos veían el trozo “A”, e ignoraban (involuntariamente) el trozo “B”, mientras que otros veían el trozo “B” e ignoraban (involuntariamente) el trozo “A”.

Bueno, así de poderoso es ese sutil cambio de colores… pero tenemos que ser muy cuidadosos con el “entorno”, porque si nuestro entorno (entorno: el fondo, el ambiente, otros bichitos que también estén en la escena) no está acorde a la iluminación plasmada en el dibujo, la imaginación del observador se confundirá, y concluirá que nuestro dibujo es de un color diferente al que queríamos plasmar.

Estilos

Cuando estaba comenzando a dibujar, leí la regla de oro de la iluminación: Si subes la iluminación, también subes la saturación; si bajas la iluminación, también bajas la saturación.

Entonces, la iluminación y la saturación son directamente proporcionales, qué tanto bajar/subir la saturación en comparación al brillo? eso depende del estilo del dibujo y del material que queremos dibujar.

Toon

He aprendido que, para las zonas iluminadas, subir la saturación para la iluminación, nos da un efecto más “toon”, así que si estamos dibujando algo caricaturezco, debemos subir la saturación bastante.

Luego, hay que ir subiendo gradualmente la iluminación, hasta que “parezca” que el área está más iluminada.

podemos aplicar ese mismo criterio en las áreas no iluminadas! :D

toon.png

Realista

Los cambios de tono deben ser sutiles (para un escenario con iluminación “normal”). Las sombras necesitan menos sutileza… si las hacemos muy sutiles, no se notarán ;)

realista.png

Metálico

En general, los materiales metálicos tienen el brillo y las sombras más fuertes y más definidos.

Por eso, los brillos de los metales deberían ser casi blancos, y más pequeños que los de los materiales suaves.

Lo malo es que, al poner los brillos más pequeños, estos aportan menos información sobre la forma 3D de nuestro dibujo, por eso, yo combino esta técnica con sombras grandes y un poco sutiles.

Como el objeto es metálico, procuro que, tanto la sombra como el brillo, tengan una saturación alta :)

metal

Bueno… esos son todos los estilos que sé hasta ahora XD.

Y bueno… esas son algunas cositas que he aprendido con el tiempo, dibujando en 2D, espero que les sirvan ^__^

Ejecutando comandos con parámetros en bash

Cuando hice el script para arreglar un libro escaneado a doble cara, me topé con varios problemas, porque no entendía cómo un script recibe parámetros desde bash! así que decidí  escribir esta entrada, explicando lo que aprendí.

Primero, este script, nos servirá para ver qué es lo que está pasando cuando le pasamos parámetros (o argumentos) a un comando en bash.

En este script, le paso parámetros al script de arriba. Les recomiendo descarguen ambos archivos, y los ejecuten, para ver en tiempo real lo que pasa :O (ambos archivos deben estar en la misma carpeta, duh!)

Resumiendo, para ejecutar un comando, asegúrate de no usar cadenas de texto, lo mejor, es escribirlo justo como lo escribirías en la consola.

Para pasar argumentos a dicho comando, asegúrate de que no estén en una cadena de texto, todas juntitas, porque si no, bash las interpretará como un elemento de los argumentos, en vez de una lista de argumentos ^w^

Libros escaneados a doble cara? No más!

YOHOHOHOOOO surcando por mares, robando libros a los bucaneros.

YOHOHOOO, todo eso ha de ser libre, pero ellos quieren más dinero…

son las editoriales las que se enriquecen, mientras el tercer mundo decrece

YOHOHOHOOO por eso les robo, sin que se den cuenta, sin que afecte a mi moral!

sin tocar sus bolsillos mientras navego por los mares de la web!

Así que Gus fue al centro de estudiantes de la carrera de Bioquímica, y resulta que tenían el libro Bioquímica Humana, texto y atlas, de Koolman y Rön, estaban cobrando por imprimirlo, y había una compu allí, abierta al público, con su mouse, su teclado y todo! ni siquiera tenía contraseña… así que le dijo a su amigo “pero… para qué hacerlo imprimir? podemos copiárnoslo de la compu, y leerlo en nuestros celulares :3”

Así que su amigo puso su flash en la compu, y cuando estaba a punto de copiarlo, llega un ogro y les grita “NO PUEDEN HACER ESO!!! LARGO DE AQUÍ! EN DÓNDE LO COPIARON?! EN DÓNDE?!”, pese a que le dijeron que aún no lo habían copiado, el ogro les formateó su flash :(

Más tarde, encontró el libro, pero estaba escaneado a doble cara x_x, eran cerca de 500 páginas! así que hacerlo a mano no era plausible (pero seguro ese pobre ogro lo hizo a mano… por qué más se portaría tan agresivo? lol).

Así que escribí un script en bash para arreglarlo! XD básicamente lo que hace, es cortar las páginas a la mitad con pdfjam, genera un pdf con páginas pares y otro con impares, y luego las une intercaladas ^w^.

este es el script

(y recuerden… eval is evil T_T)

(también recuerda que debes tener LaTeX instalado para correr este script, ya que usa pdfinfo y pdfjam!)