<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Codenix</title>
	<atom:link href="http://www.codenix.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codenix.com</link>
	<description>Consulting services for game development.</description>
	<lastBuildDate>Wed, 11 Jul 2012 23:34:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Todo lo que siempre quiso saber sobre curvas Bézier, pero no se animo a preguntar</title>
		<link>http://www.codenix.com/prueba-3/</link>
		<comments>http://www.codenix.com/prueba-3/#comments</comments>
		<pubDate>Wed, 11 Jul 2012 23:14:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[devblog]]></category>

		<guid isPermaLink="false">http://www.codenix.com/?p=123</guid>
		<description><![CDATA[Que Son?: Dados dos puntos, hay infinitos tipos de funciones y formulas para llegar de un punto a otro. Partiendo de una recta, esta se podria &#8220;curvar&#8221; en todas direcciones y formas. En aplicaciones practicas, como arquitectura, diseño grafico, diseñno industrial, siempre se necesito definir objetos, trayectorias, perimetros, etc. Estas formas luego debian poder ser luego reproducidas (armadas, construidas, impresas, etc). El problema es que era muy complejo decir &#8220;esta curvatura quiero representarla con una funcion cuadratica, esta otra con una exponencial, etc&#8221;. Un ilustrador con un pulso maravilloso podria dibujar exactamente lo que tenia en la cabeza, pero luego no podia traducirse exactamente a un objeto fisico, un diseño etc. Para solucionar este problema, Pierre Bézier decidio crear las curvas que llevan su nombre. (Pierre claramente se inspiro en su Jopo.) Estas curvas no se basan en formulas cartesianas sino en el concepto de interpolacion. Asumo que la mayoria que esta leyendo esto sabe lo que es la interpolacion lineal, pero hago un mini repasito. Interpolacion: Si hay 2 puntos en un espacio N-dimensional (o sea que funciona para, 1D,2D,3D .. infinto-D), y esos dos puntos son A y B, es posible obtener cualquier posicion dentro del segmento que une a A y B usando la siguiente formula, donde c=0 es A y c=1 es B: f=(1.0-c)*A + c*B; o mas simple f=A+(B-A)*c; La interpolacion es una de las herramientas mas basicas y utiles del programador de videojuegos. Se usan tanto para dibujar (lineas y otras cosas), como para animar, haciendo transiciones en el tiempo (el tiempo altera el valor c). Bueno, volviendo a Pierre. Sus curvas son super sencillas de entender e implementar, se pueden ajustar a cualquier otra curva (hasta un grado relativo de complejidad) y consisten en interpolar recursivamente N puntos (o sea, funciona para 2 puntos, 3 puntos, 4 puntos, etc, pero en general solo se usa con 3 y 4 puntos). Por ejemplo, si tenemos 3 puntos A, B y C. y una magnitud &#8220;c&#8221;, donde al igual que en la interpolacion lineal, c=0 es A (el primer punto) y C=1 es C (el ultimo punto).  Primero se interpola AB usando c como magnitud, luego BC, tambien usando c como magnitud y luego el resultado de interpolar AB y BC, tambien usando c como magnitud. Esta animacion se entiende mejor que lo que escribi de cualquier forma: Simple no? Las curvas de bezier con 3 puntos se llaman &#8220;Curva Cuadratica de Bezier&#8221;. Pero la que mas se usa, y la que mas ven en todos en todos lados no es la de 3 puntos sino la de 4, la &#8220;Curva Cubica de Bezier&#8221;. Pero esa no es la forma mas comun de representarlas, sino esta (como Photoshop, Illustrator, Flash, etc): Los dos puntos del medio, (BC de ABCD), se los denomina puntos de control, y moviendolos es muy facil ajustar a mano la forma de la curva. Si  ABCD son colineares (se ponen todos en una recta) , la curva se como una linea, y sino cuanto mas grande la distancia de A a B, o de D a C, mas se &#8220;estira&#8221; la curva en esa direccion. Es por esto que las curvas de Bezier son tan populares, son muy simples de representar matematicamente (4 puntos en cualquier dimension), y sobre todo, muy faciles de editar por esos entes hippies que no distinguen entre una ecuacion y los ruleros de su hermana a los que llamamos artistas. Otra propiedad muy interesante es que si concatenamos varias curvas, y los puntos de control de entrada y salida de cada punto son colineales (todos en la misma recta), la curva se continua suavemente al proximo segmento. De esta forma, utilizando varias curvas de bezier concatenadas, se puede obtener casi cualquier curva con tan solo unos pocos puntitos. Dibujandolas: Lamentablemente, la simplicidad de las curvas de Bezier termina ahi, y aca es donde se vuelve mas complicado. Dibujarlas no es tan facil! Uno ve como flash dibuja curvas y piensa que es una boludez, pero eso esta lejos de la realidad. La funcion de una cubica es facil: // template para usar bezier en N dimensiones //se ve complicado, pero es la simplificacion matematica de hacer 3 interpolaciones, luego 2 y luego 1. template&#60;class T&#62; T cubic_bezier_interp(real_t t, T start, T control_1, T control_2, T end) { real_t omt = (1.0 &#8211; t); real_t omt2 = omt*omt; real_t omt3 = omt2*omt; real_t t2 = t*t; real_t t3 = t2*t; return start * omt3 + control_1 * omt2 * t * 3.0 + control_2 * omt  * t2 * 3.0 + end * t3; } Uno pensaria que para dibujarla, hay que dividirla en pedacitos y recorrerla, asi: segmentos=10 for(i=0;i&#60;segmentos-1;i++) { a=bezier( t/10.0, puntos[i].pos, puntos[i].pos + puntos[i].out, puntos[i+1].pos + puntos[i+1].in ) b=bezier( (t+1)/10.0, puntos[i].pos, puntos[i].pos + puntos[i].out, puntos[i+1].pos + puntos[i+1].in ) draw_line(a,b) } Pero esto no funciona! se ve toda poligonosa, entonces usamos mas pedacitos, pero se sigue viendo poligonosa cuando se estira.. horrible!! El problema con las curvas de bezier, es que cuanto mas grande es el vector entre un punto y su punto de control, mas se &#8220;estira&#8221; la formula. En la practica esto resulta en que por mas que uno haga un muestreo de N puntos, las distancias entre los puntos no es la misma, sino que donde mas se estira la curva mas distancia hay entre las muestras, y donde menos se estira hay menos. Por esto subdividirla en intervalos constantes no funciona para dibujarla. Hay varias formas de dibujar una curva bezier mas correctamente, pero los metodos que mejor funcionan son los que subdividen la curva recursivamente buscando que el angulo entre dos segmentos sea menor a uno predefinido.  Ejemplo con pseudocodigo: void bake_bezier(Map&#60;float,Vector3&#62;&#38; r_bake, float p_begin, float p_end,vec3 p_a,vec3 p_out,vec3 p_b, vec3 p_in,int p_depth) { float mp = p_begin+(p_end-p_begin)*0.5; vec3 beg = bezier(p_begin,p_a,p_a+p_out,p_b+p_in,p_b); vec3 mid = bezier(mp,p_a,p_a+p_out,p_b+p_in,p_b); vec3 end = bezier(p_end,p_a,p_a+p_out,p_b+p_in,p_b); Vector3 na = (mid-beg).normalized(); Vector3 nb = (end-mid).normalized(); float dp = na.dot(nb); // dot product if (dp&#60;cos(deg2rad(TOLERANCE))) { //tolerance es un angulo entre dos segmentos, si en algulo es menor add_point(mid) } if (p_depth&#60;MAX_DEPTH) { bake_bezier(r_bake,p_begin,mp,p_a,p_out,p_b,p_in,p_depth+1); bake_bezier(r_bake,mp,p_end,p_a,p_out,p_b,p_in,p_depth+1); } } Y si estan dibujando una forma cerrada con curvas, esto es solo el principio, una vez subdividida se suelen usar algoritmos como ear-clipping para transformar todo a triangulos y llenarlo: http://en.wikipedia.org/wiki/Polygon_triangulation Pero los resultados valen la pena! La PSP puede dibuajar curvas y poligonos bezier enteros por hardware. Las PCs recien hace poco tienen APIs estandarizadas disponibles para hacerlo, por eso siempre fue mas lento y no se vieron tantos juegos asi (Flash dibuja todo por software). Recorriendolas: Si dibujarlas es complicado, recorrerlas es todavia mas complicado. En muchos casos queremos recorrer una curva de bezier, como por ejemplo una montaña rusa, usarlo como guia para un juego de autos, o simplemente una trayectoria para una camara. Uno pensaria que es simplemente llamar a la funcion bezier() incrementando el parametro t (tiempo) en cada frame, pero esto no funciona porque, por lo mismo que no podemos subdividirla en puntos equidistantes para dibujar, el recorrido tampoco se va a poder hacer a velocidad constante. Reparametrizacion: Una regla implicita en las curvas de bezier, asi como en otro tipo de interpolaciones cubicas (como hermite, spline, catmull rom, etc), es que si los segmentos AB, BC y CD estan a la misma distancia, la velocidad de recorrido es constante. Hay varios papers que explican como hacer &#8220;recrear&#8221; las curvas moviendo y reordenando los puntos para obtener una simulacion mucho mas adecuada. Tambien hay otros papers que explican como transformar los beziers cubicos a varios cuadraticos, que son mas faciles de interpolar. Muestreo Uniforme Aproximado: La formula mas comun de hacer esto es, usando la misma regla que en el punto anterior, convertir la curva de multiples beziers a un un poligono hecho de puntos equidistantes. Esto es relativamente facil y funciona en la mayoria de los casos, y tiene la ventaja de que hacer la interpolacion es O(1). 1) Se considera una distancia para los puntos, en este caso por ejemplo 0.1 (s) 2) Se recorren los puntos de control, por cada punto y el proximo, nos fijamos la distancia (d) 3) Esa distancia se convierte a una magnitud 0-1, haciendo m=s/d. Si la division da &#62;1, forzamos 1. 4) La logica es que la curva nunca va a ser mas chica que la recta entre los dos puntos. 5) Se usa busqueda binaria para aproximar el proximo lugar en la curva avanzando entre cada segmento m. 6) Algunas curvas pueden estar muy deformadas, por lo cual siempre se puede dividir m un poco mas para tener mejores resultados, pero no influye mucho. Con los puntos equidistantes, se puede usar una interpolacion cubica (catmull rom es la que mas me gusta) para recorrerlos, y el resultado queda perfecto, indistinguible. Buscando el punto mas cercano. En muchos casos, las curvas de Bezier se utilizan como rieles de camara, para lo cual hay un objetivo (el personaje tiene el objetivo) y la camara debera situarse en el lugar mas cercano de la curva y el objetivo.  Juegos como God of War o Mario Galaxy usan muchisimo este recurso. Lo mas simple es usar un algoritmo K D-Tree, luego del paso anterior usado para recorrer, para encontrar el punto mas cercano al objetivo. Este algoritmo permite encontrar el punto (de un set finito) a cualquier posicion muy rapidamente. Luego de encontrarlo, se puede hacer una busqueda binaria de ese punto al proximo y al anterior para encontrar la posicion mas cercana, haciendo interpolacion cubica.]]></description>
			<content:encoded><![CDATA[<p><strong><br />
Que Son?:</strong></p>
<p>Dados dos puntos, hay infinitos tipos de funciones y formulas para llegar de un punto a otro. Partiendo de una recta, esta se podria &#8220;curvar&#8221; en todas direcciones y formas.<br />
En aplicaciones practicas, como arquitectura, diseño grafico, diseñno industrial, siempre se necesito definir objetos, trayectorias, perimetros, etc. Estas formas luego debian poder ser luego reproducidas (armadas, construidas, impresas, etc). El problema es que era muy complejo decir &#8220;esta curvatura quiero representarla con una funcion cuadratica, esta otra con una exponencial, etc&#8221;. Un ilustrador con un pulso maravilloso podria dibujar exactamente lo que tenia en la cabeza, pero luego no podia traducirse exactamente a un objeto fisico, un diseño etc.</p>
<p>Para solucionar este problema, Pierre Bézier decidio crear las curvas que llevan su nombre.</p>
<p><img class="alignnone" src="http://www.photoshopessentials.com/images/basics/pen-tool-selections/pierre-bezier.gif" alt="" width="200" height="269" /></p>
<p>(Pierre claramente se inspiro en su Jopo.)</p>
<p><span id="more-123"></span></p>
<p>Estas curvas no se basan en formulas cartesianas sino en el concepto de interpolacion. Asumo que la mayoria que esta leyendo esto sabe lo que es la interpolacion lineal, pero hago un mini repasito.</p>
<p>Interpolacion: Si hay 2 puntos en un espacio N-dimensional (o sea que funciona para, 1D,2D,3D .. infinto-D), y esos dos puntos son A y B, es posible obtener cualquier posicion dentro del segmento que une a A y B usando la siguiente formula, donde c=0 es A y c=1 es B:</p>
<p>f=(1.0-c)*A + c*B;</p>
<p>o mas simple</p>
<p>f=A+(B-A)*c;</p>
<p>La interpolacion es una de las herramientas mas basicas y utiles del programador de videojuegos. Se usan tanto para dibujar (lineas y otras cosas), como para animar, haciendo transiciones en el tiempo (el tiempo altera el valor c).</p>
<p>Bueno, volviendo a Pierre. Sus curvas son super sencillas de entender e implementar, se pueden ajustar a cualquier otra curva (hasta un grado relativo de complejidad) y consisten en interpolar recursivamente N puntos (o sea, funciona para 2 puntos, 3 puntos, 4 puntos, etc, pero en general solo se usa con 3 y 4 puntos).</p>
<p>Por ejemplo, si tenemos 3 puntos A, B y C. y una magnitud &#8220;c&#8221;, donde al igual que en la interpolacion lineal, c=0 es A (el primer punto) y C=1 es C (el ultimo punto).  Primero se interpola AB usando c como magnitud, luego BC, tambien usando c como magnitud y luego el resultado de interpolar AB y BC, tambien usando c como magnitud. Esta animacion se entiende mejor que lo que escribi de cualquier forma:</p>
<p><img class="alignnone" src="http://upload.wikimedia.org/wikipedia/commons/3/35/Bezier_quadratic_anim.gif" alt="" width="190" height="120" /></p>
<p>Simple no? Las curvas de bezier con 3 puntos se llaman &#8220;Curva Cuadratica de Bezier&#8221;.</p>
<p>Pero la que mas se usa, y la que mas ven en todos en todos lados no es la de 3 puntos sino la de 4, la &#8220;Curva Cubica de Bezier&#8221;.</p>
<p><img class="alignnone" src="http://upload.wikimedia.org/wikipedia/commons/a/a3/Bezier_cubic_anim.gif" alt="" width="290" height="120" /></p>
<p>Pero esa no es la forma mas comun de representarlas, sino esta (como Photoshop, Illustrator, Flash, etc):</p>
<p><img class="alignnone" src="http://shannonmayo.files.wordpress.com/2011/11/f2.gif" alt="" width="500" height="561" /></p>
<p>Los dos puntos del medio, (BC de ABCD), se los denomina <em>puntos de control</em>, y moviendolos es muy facil ajustar a mano la forma de la curva. Si  ABCD son colineares (se ponen todos en una recta) , la curva se como una linea, y sino cuanto mas grande la distancia de A a B, o de D a C, mas se &#8220;estira&#8221; la curva en esa direccion.</p>
<p>Es por esto que las curvas de Bezier son tan populares, son muy simples de representar matematicamente (4 puntos en cualquier dimension), y sobre todo, muy faciles de <strong>editar</strong> por esos entes hippies que no distinguen entre una ecuacion y los ruleros de su hermana a los que llamamos <em>artistas</em>.<br />
Otra propiedad muy interesante es que si concatenamos varias curvas, y los puntos de control de entrada y salida de cada punto son colineales (todos en la misma recta), la curva se continua suavemente al proximo segmento. De esta forma, utilizando varias curvas de bezier concatenadas, se puede obtener casi cualquier curva con tan solo unos pocos puntitos.</p>
<p><img class="alignnone" src="http://www.elated.com/res/Image/articles/graphics/photoshop/photoshop-paths-pen-tool/photoshop-paths-explained/example_path.gif" alt="" width="450" height="313" /><br />
<strong>Dibujandolas:</strong></p>
<p>Lamentablemente, la simplicidad de las curvas de Bezier termina ahi, y aca es donde se vuelve mas complicado.<br />
Dibujarlas no es tan facil! Uno ve como flash dibuja curvas y piensa que es una boludez, pero eso esta lejos de la realidad.</p>
<p>La funcion de una cubica es facil:</p>
<p>// template para usar bezier en N dimensiones<br />
//se ve complicado, pero es la simplificacion matematica de hacer 3 interpolaciones, luego 2 y luego 1.<br />
template&lt;class T&gt;<br />
T cubic_bezier_interp(real_t t, T start, T control_1, T control_2, T end) {</p>
<p>real_t omt = (1.0 &#8211; t);<br />
real_t omt2 = omt*omt;<br />
real_t omt3 = omt2*omt;<br />
real_t t2 = t*t;<br />
real_t t3 = t2*t;</p>
<p>return start * omt3<br />
+ control_1 * omt2 * t * 3.0<br />
+ control_2 * omt  * t2 * 3.0<br />
+ end * t3;<br />
}</p>
<p>Uno pensaria que para dibujarla, hay que dividirla en pedacitos y recorrerla, asi:</p>
<p>segmentos=10</p>
<p>for(i=0;i&lt;segmentos-1;i++) {<br />
a=bezier( t/10.0, puntos[i].pos, puntos[i].pos + puntos[i].out, puntos[i+1].pos + puntos[i+1].in )<br />
b=bezier( (t+1)/10.0, puntos[i].pos, puntos[i].pos + puntos[i].out, puntos[i+1].pos + puntos[i+1].in )</p>
<p>draw_line(a,b)<br />
}</p>
<p>Pero esto no funciona! se ve toda poligonosa, entonces usamos mas pedacitos, pero se sigue viendo poligonosa cuando se estira.. horrible!!</p>
<p>El problema con las curvas de bezier, es que cuanto mas grande es el vector entre un punto y su punto de control, mas se &#8220;estira&#8221; la formula. En la practica esto resulta en que por mas que uno haga un muestreo de N puntos, las distancias entre los puntos no es la misma, sino que donde mas se estira la curva mas distancia hay entre las muestras, y donde menos se estira hay menos. Por esto subdividirla en intervalos constantes no funciona para dibujarla.</p>
<p>Hay varias formas de dibujar una curva bezier mas correctamente, pero los metodos que mejor funcionan son los que subdividen la curva recursivamente buscando que el angulo entre dos segmentos sea menor a uno predefinido.  Ejemplo con pseudocodigo:</p>
<p>void bake_bezier(Map&lt;float,Vector3&gt;&amp; r_bake, float p_begin, float p_end,vec3 p_a,vec3 p_out,vec3 p_b, vec3 p_in,int p_depth) {</p>
<p>float mp = p_begin+(p_end-p_begin)*0.5;<br />
vec3 beg = bezier(p_begin,p_a,p_a+p_out,p_b+p_in,p_b);<br />
vec3 mid = bezier(mp,p_a,p_a+p_out,p_b+p_in,p_b);<br />
vec3 end = bezier(p_end,p_a,p_a+p_out,p_b+p_in,p_b);</p>
<p>Vector3 na = (mid-beg).normalized();<br />
Vector3 nb = (end-mid).normalized();<br />
float dp = na.dot(nb); // dot product</p>
<p>if (dp&lt;cos(deg2rad(TOLERANCE))) {<br />
//tolerance es un angulo entre dos segmentos, si en algulo es menor<br />
add_point(mid)<br />
}</p>
<p>if (p_depth&lt;MAX_DEPTH) {<br />
bake_bezier(r_bake,p_begin,mp,p_a,p_out,p_b,p_in,p_depth+1);<br />
bake_bezier(r_bake,mp,p_end,p_a,p_out,p_b,p_in,p_depth+1);<br />
}<br />
}</p>
<p>Y si estan dibujando una forma cerrada con curvas, esto es solo el principio, una vez subdividida se suelen usar algoritmos como ear-clipping para transformar todo a triangulos y llenarlo:<br />
<a href="http://en.wikipedia.org/wiki/Polygon_triangulation" target="_blank">http://en.wikipedia.org/wiki/Polygon_triangulation</a></p>
<p>Pero los resultados valen la pena!</p>
<p><img class="alignnone" src="http://thegamingliberty.com/wp-content/uploads/LocoRoco-2-g.jpg" alt="" width="480" height="272" /></p>
<p>La PSP puede dibuajar curvas y poligonos bezier enteros por hardware. Las PCs recien hace poco tienen APIs estandarizadas disponibles para hacerlo, por eso siempre fue mas lento y no se vieron tantos juegos asi (Flash dibuja todo por software).</p>
<p><strong>Recorriendolas:</strong></p>
<p>Si dibujarlas es complicado, recorrerlas es todavia mas complicado. En muchos casos queremos recorrer una curva de bezier, como por ejemplo una montaña rusa, usarlo como guia para un juego de autos, o simplemente una trayectoria para una camara.</p>
<p>Uno pensaria que es simplemente llamar a la funcion bezier() incrementando el parametro t (tiempo) en cada frame, pero esto no funciona porque, por lo mismo que no podemos subdividirla en puntos equidistantes para dibujar, el recorrido tampoco se va a poder hacer a velocidad constante.</p>
<p><strong>Reparametrizacion:</strong></p>
<p>Una regla implicita en las curvas de bezier, asi como en otro tipo de interpolaciones cubicas (como hermite, spline, catmull rom, etc), es que si los segmentos AB, BC y CD estan a la misma distancia, la velocidad de recorrido es constante. Hay varios papers que explican como hacer &#8220;recrear&#8221; las curvas moviendo y reordenando los puntos para obtener una simulacion mucho mas adecuada. Tambien hay otros papers que explican como transformar los beziers cubicos a varios cuadraticos, que son mas faciles de interpolar.</p>
<p><strong>Muestreo Uniforme Aproximado:</strong></p>
<p>La formula mas comun de hacer esto es, usando la misma regla que en el punto anterior, convertir la curva de multiples beziers a un un poligono hecho de puntos equidistantes. Esto es relativamente facil y funciona en la mayoria de los casos, y tiene la ventaja de que hacer la interpolacion es O(1).</p>
<p>1) Se considera una distancia para los puntos, en este caso por ejemplo 0.1 (s)<br />
2) Se recorren los puntos de control, por cada punto y el proximo, nos fijamos la distancia (d)<br />
3) Esa distancia se convierte a una magnitud 0-1, haciendo m=s/d. Si la division da &gt;1, forzamos 1.<br />
4) La logica es que la curva nunca va a ser mas chica que la recta entre los dos puntos.<br />
5) Se usa busqueda binaria para aproximar el proximo lugar en la curva avanzando entre cada segmento m.<br />
6) Algunas curvas pueden estar muy deformadas, por lo cual siempre se puede dividir m un poco mas para tener mejores resultados, pero no influye mucho.</p>
<p>Con los puntos equidistantes, se puede usar una interpolacion cubica (catmull rom es la que mas me gusta) para recorrerlos, y el resultado queda perfecto, indistinguible.</p>
<p><strong>Buscando el punto mas cercano.</strong></p>
<p>En muchos casos, las curvas de Bezier se utilizan como rieles de camara, para lo cual hay un objetivo (el personaje tiene el objetivo) y la camara debera situarse en el lugar mas cercano de la curva y el objetivo.  Juegos como God of War o Mario Galaxy usan muchisimo este recurso.</p>
<p>Lo mas simple es usar un algoritmo K D-Tree, luego del paso anterior usado para recorrer, para encontrar el punto mas cercano al objetivo. Este algoritmo permite encontrar el punto (de un set finito) a cualquier posicion muy rapidamente. Luego de encontrarlo, se puede hacer una busqueda binaria de ese punto al proximo y al anterior para encontrar la posicion mas cercana, haciendo interpolacion cubica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codenix.com/prueba-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>About Codenix</title>
		<link>http://www.codenix.com/about-codenix/</link>
		<comments>http://www.codenix.com/about-codenix/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 14:07:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[main]]></category>

		<guid isPermaLink="false">http://www.codenix.com/wordpress/?p=49</guid>
		<description><![CDATA[Codenix is small company located in Buenos Aires, made of indivuduals who truly love video games and their whole development process. We have a long history in technology consulting and helping other companies to deliver quality products on time and on budget, having worked with the major console and mobile platforms, as well as PC and Mac. Our team has produced several engines and tools for different games, and also modified existing engine technologies to suit the requirements of the most creative-challenging designers. Despite our strength in technology, we also like taking advantage of our experience for developing games and have produced several titles for publishers based on existing or original IPs, either using internal teams or working with qualified partners. For more information, please visit the services section.]]></description>
			<content:encoded><![CDATA[<p>Codenix is small company located in Buenos Aires, made of indivuduals who truly love video games and their whole development process. We have a long history in technology consulting and helping other companies to deliver quality products on time and on budget, having worked with the major console and mobile platforms, as well as PC and Mac.</p>
<p>Our team has produced several engines and tools for different games, and also modified existing engine technologies to suit the requirements of the most creative-challenging designers.</p>
<p>Despite our strength in technology, we also like taking advantage of our experience for developing games and have produced several titles for publishers based on existing or original IPs, either using internal teams or working with qualified partners.</p>
<p>For more information, please visit the <a title="Services" href="http://www.codenix.com/wordpress/?page_id=4">services </a>section.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codenix.com/about-codenix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Codigo engine</title>
		<link>http://www.codenix.com/codigo-engine/</link>
		<comments>http://www.codenix.com/codigo-engine/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 03:37:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[banners]]></category>

		<guid isPermaLink="false">http://www.codenix.com/wordpress/?p=37</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://www.codenix.com/codigo-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jetpaca</title>
		<link>http://www.codenix.com/jetpaca/</link>
		<comments>http://www.codenix.com/jetpaca/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 03:35:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[banners]]></category>

		<guid isPermaLink="false">http://www.codenix.com/wordpress/?p=34</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://www.codenix.com/jetpaca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Other Stuff</title>
		<link>http://www.codenix.com/other-stuff/</link>
		<comments>http://www.codenix.com/other-stuff/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 02:34:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[banners]]></category>

		<guid isPermaLink="false">http://www.codenix.com/wordpress/?p=23</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://www.codenix.com/other-stuff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Godot Engine</title>
		<link>http://www.codenix.com/godot-engine/</link>
		<comments>http://www.codenix.com/godot-engine/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 02:18:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[banners]]></category>

		<guid isPermaLink="false">http://www.codenix.com/wordpress/?p=16</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://www.codenix.com/godot-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
