domingo, 9 de diciembre de 2007

Hola profe

Nos vemos el viernes para ver le videojuego
aqui mostraré el código fuente y el video de como se ve el juego, además de todo el proyecto completo.


KEyland

Tarea 11





Un vertex shader es una función que recibe como parámetro un vértice. Sólo trabaja con un vértice a la vez, y no puede eliminarlo, sólo transformarlo. Para ello, modifica propiedades del mismo para que repercutan en la geometría del objeto al que pertenece. Con ésto se puede lograr ciertos efectos específicos, como los que tienen que ver con la deformación en tiempo real de un elemento; por ejemplo, el movimiento de una ola. Donde toma una gran importancia es en el tratamiento de las superficies curvas, y su avance se vio reflejado en los videojuegos más avanzados de la actualidad. Particularmente, en el diseño de los personajes y sus expresiones corporales.

En cambio, un píxel shader no interviene en el proceso de la definición del “esqueleto” de la escena (Wireframe), sino que forma parte de la segunda etapa: la rasterización (Rendering). Allí es donde se aplican las texturas y se tratan los pixeles que forman parte de ellas. Básicamente, un píxel shader especifica el color de un píxel. Este tratamiento individual de los pixeles permite que se realicen cálculos principalmente relacionados con la iluminación del elemento del cual forman parte en la escena, y en tiempo real. Teniendo la posibilidad de iluminar cada píxel por separado es como se lograron crear los fabulosos efectos de este estilo que se pueden apreciar en Doom 3, Far Cry y Half Life 2, por mencionar sólo los más conocidos. La particularidad de los píxel shaders es que, a diferencia de los vertex shaders, requieren de un soporte de hardware compatible. En otras palabras, un juego programado para hacer uso de píxel shaders requiere si o si de una tarjeta de video con capacidad para manipularlos.



Tarea 10

Animación
La animación es una simulación de movimiento producida mediante imágenes que se crearon una por una; al proyectarse sucesivamente estas imágenes (denominadas cuadros) se produce una ilusión de movimiento, pero el movimiento representado no existió en la realidad. Se basa en la ilusión de movimiento, en la que intervienen la persistencia de la visión y el fenómeno phi.
La animación pertenece al ámbito del cine y la televisión, aunque, como puede verse, está en relación directa con las artes visuales clásicas, dibujo, pintura y escultura, así como con la fotografía.
Para realizar animación existen numerosas técnicas que van más allá de los familiares dibujos animados. Los cuadros se pueden generar dibujando, pintando, o fotografiando los minúsculos cambios hechos repetidamente a un modelo de la realidad o a un modelo tridimensional virtual; también es posible animar objetos de la realidad y actores.
keyframes

Los keyframes son dibujos principales para definir puntos de inicio y de fin en una transición. Una secuencia de keyframes define cual movimiento se verá, mientras que la posición de éstos en la película definen el tiempo del movimiento. Para dar la ilusión de un movimiento continúo por segundo, se agregan keyframes llamados “in-betweens” o intermedios.


Cinemática Directa
Se denomina cinemática directa a una técnica usada en gráficos 3D por computadora, para calcular la posición de partes de una estructura articulada a partir de sus componentes fijas y las transformaciones inducidas por las articulaciones de la estructura.
Un ejemplo típico de estructura jerárquica sobre el que realizar éstos cálculos es un robot, formado por cuerpos rígidos enlazados por articulaciones. Se puede establecer un sistema de referencia fijo situado en la base del robot, y describir la localización de cada uno de los eslabones con respecto a dicho sistema de referencia. Una pieza rígida A depende jerárquicamente de otra B si, para alcanzar la parte fija de la estructura (base del robot) desde A, se debe pasar por B. Para calcular la posición de una pieza rígida de la estructura se deben calcular las posiciones de todas las piezas de las que depende. Bibliotecas gráficas de uso generalizado, como OpenGL, están diseñadas para facilitar estos cálculos y llevarlos a cabo eficientemente mediante pilas de matrices.

Cinemática inversa
En el área de mecánica y Robótica se denomina Cinemática Inversa al proceso algorítmico por el cual en base a las parámetros de la posición final de una cadena de enlaces (por ejemplo, un brazo robótico) se determina la posición requerida de cada una de las articulaciones.
El objetivo de la cinemática inversa consiste en encontrar el gesto que deben adoptar las diferentes articulaciones para que el final del sistema articulado llegue a una posición concreta.


Captura de movimiento
Es el proceso de grabar a alguna persona o animal realizando o ejecutando una acción, y capturarlo para mapearlo en un modelo 3D.

El actor protagonista lleva un traje con pequeños marcadores denominados LED. Cada uno de estos puntos sigue el cuerpo de manera exacta y muestra cómo se mueve.

MOTION CAPTOR RT es un sistema óptico de captura del movimiento en tiempo real, desarrollado íntegramente por STT, para las industrias de animación, televisión y video juegos. Al emplear marcadores reflectantes pasivos, no existen las restricciones derivadas de la utilización de cableado u otro tipo de elementos que restringen el movimiento a realizar por los actores.
MOTION CAPTOR RT consiste en una solución completa (Hardware + Software) para la captura del movimiento. Incluye todos los dispositivos como cámaras, cableado e iluminadores, además del equipo informático adecuado. Todo el sistema funciona de todo completamente automático y se maneja desde un interfaz muy sencillo.

http://www.simtechniques.com/descargas/descripcion_MotionCaptor.pdf

tarea 9

lunes, 3 de diciembre de 2007

Tarea 8

void linea( int x0,y0,xf,yf){
int Δ0=2*((yf-y0)+(x0-xf));
int ΔE=2*(yf-y0);
int ΔNE=2*((yf-y0)+(x0-xf));
int x=x0;
int y=y0;
if(x0>xf)
{
x=xf;
y=yf;
xf=x0;
yf=x0;
}
if((yf-y0) ≤ (xf-x0))
{
while(x≠xf)
{
punto(x,y)
if(Δ0≤0)
{
x++;
y++;
Δ0=Δ0+ΔE;
}
else
{
x++;
y++;
Δ0=Δ0+ΔNE;
}
punto(x,y)
}
}
else
{
while(x!=xf)
{
punto(x,y)
if(Δ0≤0)
{
x++;
y++;
Δ0=Δ0+ΔNE;
}
else
{
x++;
y++;
Δ0=Δ0+E;
}
punto(x,y)
}
}
}

Tarea 7

Algoritmo Incremental básico:

La estrategia más sencilla para discretizar líneas es calcular la pendiente ,n como z e incrementar x en 1 a partir del punto del extremo izquierdo para calcular y, = mx + B de cada x, e intensificar el pixel en (x, round(y,)), donde round(y,) = floor(0.5 + y,). Con este cálculo se obtiene el pixel más cercano, o sea, aquel cuya distancia a la línea verdadera sea menor. Sin embargo, esta estrategia burda no es muy eficiente, ya que cada iteración requiere una multiplicación y una suma de punto flotante (o de fracción binaria), además de invocar afloor. Podemos eliminar la multiplicación al observar que

yi+1 = mxi+1 + B = m(xi+ Δ x) + B = yi + mΔx

y que si x = Δx, entonces yi+1 = yi + m
De esta manera, un cambio unitario en
x cambia y por m, que es la pendiente de la línea. Para todos los puntos (xi, yi) en la línea (no los puntos en la versión de trama de la línea), sabemos que si xi+1 = xi + 1, entonces yi+1 = yi + m; es decir, los valores de x y y se definen en función de sus valores anteriores. Esto es lo que define un algoritmo incremental: en cada paso se realizan cálculos incrementales basados en el paso anterior.
Comenzamos el cálculo incremental en (x0, y0), las coordenadas enteras de un punto extremo. Observe que esta técnica incremental evita la necesidad de tratar con la intersección del eje y, es decir, B. Si |m| > 1, un incremento en
x crea un incremento en y mayor que 1. Por lo tanto, tenemos que invertir los papeles de x y y asignando un incremento unidad a y y aumentando x en Δx = Δy/m = l/m. La función línea del programa 3.1 implanta la técnica incremental. El punto de partida debe ser el punto extremo de la izquierda. Así mismo, está limitado al caso -1 <=m <=1, pero las otras pendientes pueden acomodarse por simetría. Se omite la revisión de los casos especiales de líneas horizontales, verticales o diagonales.
La función escribir_pixel, que utiliza línea, es una función de bajo nivel proporcionada por el software de la pantalla que coloca un valor en un lienzo para un pixel cuyas coordenadas se especifican como los dos primeros argumentos. Supondremos aquí que únicamente discretizamos en modo de reemplazo; para los otros modos de escritura de SRGP tenemos que usar una función de bajo nivel leer_pixel para leer el pixel en la localidad destino, combinar lógica mente este valor con el del pixel fuente y escribir el resultado en el destino con escribir pixel.

Este algoritmo se conoce como algoritmo analizador diferencial digital (DDA, digital differential analyzer). El DDA es un dispositivo mecánico que resuelve ecuaciones diferenciales usando métodos numéricos: rastrea valores (x, y) sucesivos incrementando simultáneamente x y y en pequeñas cantidades proporcionales a la primera derivada de x y de y. En nuestro caso, el incremento de x es 1 y el incremento de y es dy/dx =m. Como las variables reales tienen precisión limitada, la suma repetida de una m inexacta produce una acumulación de errores y por último una desviación con respecto a un valor round(y0) verdadero; esta situación no ocasionará problemas en la mayoría de las líneas (cortas).

void Linea(int x0, int y0, intx1, int y1, int valor)

{

int x;

float dy, dx, y, m;

dy=y1-y0;

dx=x1-x0;

m=dy/dx,

y=y0;

for(x=x0;x<= x1;x++){

escribirpixel(x,(int)floor(y+0.5,valor);

y+=m;

}

}

Algoritmo de línea de punto medio

Las desventajas de la función línea son que el redondeo de y a un entero requiere tiempo y que las variables y y m deben ser reales o binarias fraccionarias, ya que la pendiente es una fracción. Bresenham desarrolló un algoritmo clásico que resulta atractivo porque sólo emplea aritmética entera con lo cual se evita el empleo de la función round, y permite efectuar incrementalmente el cálculo de (x i+1, yi+1 ), es decir, usando el cálculo efectuado para (x i, yi ). Se puede aplicar una versión de punto flotante de este algoritmo a líneas con coordenadas de puntos extremos con valores arbitrarios de punto flotante. Así mismo, la técnica incremental de Bresenham se puede aplicar también al cálculo entero de círculos, aunque no es fácil de generalizar a cónicas arbitrarias. Por ello usaremos una formulación un poco distinta, la técnica de punto medio, publicada por primera vez por Pitteway y adaptada por Van Aken y otros investigadores. En el caso de líneas y círculos enteros, la formulación de punto medio, como demuestra Van Aken se reduce a la formulación de Bresenham y por ende genera los mismos pixeles. Bresenham demostró que sus algoritmos de líneas y círculos enteros ofrecen las aproximaciones de mejor ajuste a las líneas y los círculos verdaderos, minimizando el error (distancia) a la primitiva verdadera.

Suponemos que la pendiente de la línea está entre 0 y 1. Las demás pendientes se pueden manejar con una reflexión adecuada respecto a los ejes principales. Al punto extremo inferior izquierdo lo llamaremos (x 0, y0) y al superior derecho, (x 1, y1).

Considere la línea que se presenta en la figura 3.6, donde el pixel previa mente seleccionado aparece como un círculo negro y los dos pixeles de los cuales podemos escoger en la etapa siguiente se presentan como círculos huecos. Suponga que acabamos de seleccionar el pixel P en (xp, yp) y ahora tenemos que elegir entre el pixel que está un incremento a la derecha (llamado pixel este, E) el pixel que se halla un incremento hacia la derecha y un incremento hacia arriba (llamado pixel noreste, NE). Sea Q el punto de intersección de la línea que se discretiza y la línea de malla x = xp+ 1. En la formulación de Bresenham se calcula la diferencia entre las distancias verticales de E y NE a Q, y se usa el signo de la diferencia para seleccionar como mejor aproximación de la línea el pixel cuya distancia de Q sea la menor. En la formulación de punto medio se observa a qué lado de la línea se encuentra el punto medio M. Es fácil ver que si el punto medio está por encima de la línea, el pixel E es el más cerca no a la línea; si el punto medio está debajo, el pixel NE es el más cercano. La línea puede pasar entre E y NE o ambos pixeles pueden estar del mismo lado; en cualquier caso, la prueba de punto medio elige el más cercano. Además, el error (la distancia vertical entre el pixel elegido y la línea real) siempre es menor o igual que ½.


El algoritmo escoge NE como el siguiente pixel para la línea presentada en la figura 3.6. Ahora lo que necesitamos es una forma de calcular en qué lado de la línea se encuentra el punto medio. Representemos la línea por medio de una función implícita con coeficientes a, b y c: F(x, y) = ax + by + c = 0 (el coeficiente b de y no está relacionado con la intersección B del eje y en la forma de intersección de pendiente). Si dy = y1 - y0 y dx = x1- x0 la forma de intersección de pendiente se puede escribir como y=dy·x/dx+B por lo tanto, F(x,y) = dy·x— dx·y + B·dx = 0.

Aquí, a = dy, b = -dx y c = B·dx en la forma implícita.
Es sencillo verificar que
F(x, y) es cero en la línea, positiva para los puntos debajo de la línea y negativa para los puntos encima de la línea. Para aplicar el criterio del punto medio, sólo tenemos que calcular F(M) = F(xp+1, yp + ½) y evaluar su signo. Como nuestra decisión se basa en el valor de la función en (xp + 1, yp + ½), definimos una variable de decisión d = F(xp + 1, yp + ½). Por definición, d = a·(xp + 1) + b(yp + ½) + c. Si d > 0, elegimos el pixel NE; si d < O, escogemos E; y si d = 0, podemos elegir cualquiera y seleccionamos E.
Después nos preguntamos qué sucede con la ubicación de M y por ende con el valor de d para la siguiente línea de la trama; por supuesto, los dos valores dependen de la elección de E o de NE. Si elegimos E, M se incrementa una vez en la dirección x. Por lo tanto,

dnuevo=F(xp + 2, yp + ½) = a(xp + 2) + b(yp + ½) + c

Pero

dviejo=a(xp + 1) + b(yp + ½) + c

Al restar d de dnuevo para obtener la diferencia incremental, escribimos dnuevo= dviejo+ a.

El incremento que se usa después de elegir E se denomina ΔE; ΔE= a = dy. En otras palabras, con sólo sumar ΔE podemos obtener en forma incremental el valor de la variable de decisión en el siguiente paso a partir del valor en el paso actual, sin tener que calcular F(M) directamente.

Si elegimos NE, M se incrementa una unidad tanto en la dirección x como
en la y. Entonces,

dnuevo=F(xp + 2, yp +3/2) = a(xp + 2) + b(yp + 3/2) + c .

Al restar dviejo a dnuevo para obtener la diferencia incremental, escribimos

dnuevo= dviejo+ a+b.

El incremento que sumamos a d después de elegir NE se llama ΔNE; ΔNE= a +b = dy -dx.

Resumamos la técnica incremental del punto medio. En cada paso, el algoritmo escoge entre dos pixeles con base en el signo del cálculo de la variable de decisión en la iteración anterior; después la variable de decisión se actualiza su mando ΔE o ΔNE al valor anterior, dependiendo de la elección del pixel.
Como el primer pixel es el primer punto extremo (x0, y0) y podemos calcular en forma directa el valor inicial de d eligiendo entre E y NE. El primer punto medio está en (x0+1, y0+
½) y

F(x0+1, y0+½) = a(x0+1) + b( y0+½) + c=a·x0 +b·y0+c+ a+ b/2=F(x0, y0)+a+b/2

Sin embargo, (x0, y0) es un punto en la línea y F(x0, y0) y es por lo tanto 0; entonces, dinicio es simplemente a + b/2 = dy - dx/2. Con base en dinicio elegimos el segundo pixel, etcétera. Para eliminar la fracción en dinicio redefinimos nuestra F original multiplicándola por 2; F(x, y) = 2(ax + by + c). Así se multiplican por 2 cada constante y la variable de decisión (así como los incrementos ΔE y ΔNE) pero no se afecta el signo de la variable de decisión, que es lo que nos interesa para la prueba del punto medio.

La aritmética necesaria para evaluar dnuevo para cualquier iteración es una suma entera sencilla. No se requieren multiplicaciones que consuman mucho tiempo. Además, el ciclo interior es bastante sencillo, como se ve en el algoritmo de punto medio del programa 3.2. El primer enunciado en el ciclo, la evaluación de d, determina la elección del pixel, pero en realidad incrementamos x y y a la posición de ese pixel después de actualizar la variable de decisión (por cuestiones de compatibilidad con los algoritmos para círculos). Observe que esta versión del algoritmo sirve únicamente para líneas con pendiente entre O y 1; la generalización del algoritmo queda como tarea para el lector en el ejercicio 3.2. En [ Sproull ofrece una elegante derivación de la formulación de Bresenham del algoritmo como una serie de transformaciones de programa a partir del burdo algoritmo original. Aún no se ha presentado ningún equivalen te de la derivación para los círculos, pero sí se puede generalizar la técnica de punto medio, como veremos más adelante.

Void línea_punto_medio (int x0, int y0, int x1, int y1, int valor)

{

int dx, dy, inca_E, inca_NE, d, x, y;

dx=x1-x0;

dy=ty1-y0;

d=dy*2-dx;

inca_E=dx*2;

inca_ne=(dy-dx)*2;

y=x0;

y=y0;

escribir_pixel(x,y,valor)

While(x

If (d<=0){

d+=incr_E;

x++;

}else{

d+=inca_NE;

x++;

y++,

}

escribir_pixel(x,y,valor);

}

}


Para una línea que parte del punto (5, 8) al punto (9, 11), los valores sucesivos de d son 2, 0, 6 y 4, con lo cual se obtiene la selección de NE, E, NE y luego NL respectivamente, como se ilustra en la figura 3.7. La línea tiene una fuerte apariencia de escalera por la escala muy amplificada del dibujo y el espaciado artificialmente grande entre los pixeles que se usa para que quede clara la geometría del algoritmo. Por la misma razón, los dibujos en las secciones siguientes también hacen que las primitivas aparezca más irregulares que como se verían en realidad en la pantalla.

Examen

1. ¿Qué es una tubería de rendering?

Es la que permite pasar del espacio objeto hacia el espacio dispositivo

2. Haga la composición de transformaciones tales que:

  • Se traslada un objeto sobre el vector(2,-3,1)
  • Se escala en los factores α=0.5, β=1, γ=2
  • Se rota sobre el eje z en 45°

3. Aplique la composición sobre los vectores

  • (0,0,0)

[2.82 -1.41 2 1]

  • (1,1,1)

[2.47 -.35 4 1]

  • (2,0.5,1)

[3.18 -.35 4 1]

  • (-1,0,1)

[2.47 -1.76 4 1]

4. Diseñe la matriz para una proyección isométrica a 45°



5. Proyecte los vectores del punto 3 utilizando la matriz de proyección del punto 4

[0 0 0 1]
[0 -0.29 1.70 1]
[0-70 -1.14 1.8 1]
[-1.41 0 0 1]