<?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>The So3</title>
	<atom:link href="http://www.theso3.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.theso3.com</link>
	<description>La web de Ricardo Sánchez Sotres. Portfolio y blog sobre Flash y AS3</description>
	<lastBuildDate>Tue, 07 May 2013 07:57:43 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Tres 1.1</title>
		<link>http://www.theso3.com/tres-1-1</link>
		<comments>http://www.theso3.com/tres-1-1#comments</comments>
		<pubDate>Wed, 18 Jan 2012 08:55:35 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=974</guid>
		<description><![CDATA[Ayer por fin Apple aprobó la actualización de Tres que envié la semana pasada. Simplemente arregla algunos fallos, mejora el rendimiento y ahora cuando se exporta como imagen lo hace al doble del tamaño de la pantalla (2048&#215;1536). Para mejorar el rendimiento toqué el algoritmo que genera la triangulación de Delaunay haciéndolo más eficiente.]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Ayer por fin Apple aprobó la actualización de Tres que envié la semana pasada.</p>
<p>Simplemente arregla algunos fallos, <strong>mejora el rendimiento</strong> y ahora cuando se exporta como imagen lo hace al <strong>doble del tamaño de la pantalla</strong> (2048&#215;1536).</p>
<p>Para mejorar el rendimiento toqué el algoritmo que genera la <strong>triangulación de Delaunay</strong> haciéndolo más eficiente.<br />
<div class="one_half"><img class="size-medium wp-image-943 alignright" title="icon512x512" src="http://www.theso3.com/wp-content/uploads/2012/01/icon512x512-150x150.png" alt="" width="150" height="150" /></div><br />
<div class="one_half last"><strong>Tres 1.1</strong><br/><a href="http://itunes.apple.com/us/app/tres/id492560895?l=es&amp;ls=1&amp;mt=8"><img class="size-full wp-image-745" title="appstore" src="http://www.theso3.com/wp-content/uploads/2011/11/appstore.png" alt="" width="154" height="54" /></a></div><div class="clear"></div></p>
<div class="shr-publisher-974"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/tres-1-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De Actionscript a Objective-C</title>
		<link>http://www.theso3.com/de-actionscript-a-objective-c</link>
		<comments>http://www.theso3.com/de-actionscript-a-objective-c#comments</comments>
		<pubDate>Tue, 17 Jan 2012 18:51:56 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=953</guid>
		<description><![CDATA[Llevo tiempo sin escribir nada nuevo en el blog, y no es porque no tenga cosas que contar, de hecho tengo varios artículos a la mitad (entre otros &#8220;Decálogo para diseñadores, como cuidar a tu desarrollador parte II&#8221;), pero he estado dedicado este tiempo a ponerme seriamente a estudiar Objective-C en los huecos en los [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img src="http://www.theso3.com/wp-content/uploads/2012/01/codigo.jpg" alt="" title="codigo" width="640" height="240" class="aligncenter size-full wp-image-962" /></p>
<p>Llevo tiempo sin escribir nada nuevo en el blog, y no es porque no tenga cosas que contar, de hecho tengo varios artículos a la mitad (entre otros &#8220;<a href="http://www.theso3.com/¿como-cuidar-a-tu-programador-decalogo-para-disenadores-i" title="decálogo para diseñadores parte I">Decálogo para diseñadores, como cuidar a tu desarrollador</a> parte II&#8221;), pero he estado dedicado este tiempo a ponerme seriamente a estudiar Objective-C en los huecos en los que el trabajo me lo permitía.</p>
<p>En este artículo pretendo dar una visión general de por qué me metí en este embolao y cómo empecé a aprender lo poco que hoy sé. En próximos artículos espero seguir hablando del <strong>cambio de Actionscript a Objective-C</strong> a la vez que voy haciendo un recorrido por lo que fue el desarrollo de mi primera aplicación para iPad: <a href="http://www.theso3.com/tres-app" title="Tres">Tres</a></p>
<h3>Esto está cambiando</h3>
<p>Llevo los últimos 8 años dedicado en exclusiva a la programación en Actionscript (con algo, poco, de php y html) y ha sido una experiencia satisfactoria en general, he aprendido mucho, tanto de programación como de técnicas gráficas, algoritmos y demás, he podido trabajar con gente muy buena y, salvo excepciones (todos hemos hecho banners), en proyectos muy interesantes.</p>
<p>Pero no es ningún secreto que <strong>el uso de Flash está cambiando</strong>. La tecnología en sí, en mi opinión, no va a morir pronto, ha evolucionado mucho y sigue habiendo una enorme comunidad de desarrolladores, pero sí que cambiarán el tipo de proyectos y es posible que hasta que se asiente su papel, haya menos trabajo. No creo que sea tanto la muerte de Flash, como la muerte de la web tal y como la conocemos. Dejamos atrás el PC para conectarnos con móviles, tabletas y televisores. Eso implica un cambio en la forma de acceder a la información y también un cambio en la tecnología con la que se presenta esa información.</p>
<p>Pero no quiero divagar sobre el tema.</p>
<h3>¿Por qué aplicaciones y no html5?</h3>
<p>Parece que todo el mundo de mi alrededor que se dedicaba a programar en Actionscript hasta la fecha están cogiendo cada vez más proyectos de html (html5 como le gusta llamarlo a los clientes, html+javascript+php+css al fin y al cabo). Habiéndome dedicado a la web durante tanto tiempo parece que sería el <strong>paso lógico</strong>. Pero en realidad yo tengo formación de programador puro y duro, tengo una base sólida (aunque algo olvidada) de C++ y odio maquetar. Lo odio y se me da mal. Además me da una pereza horrible enfrentarme al lío de los navegadores (el hecho de que está web sea una plantilla lo deja claro).  El javascript tampoco me genera mucha simpatía, viniendo de AS3 es, definitivamente, un paso atrás. No te digo ya comparado con Objective-C, en cuanto a paradigmas de <strong>programación orientada a objetos</strong>, que es lo que a tipos con protegebolsillos y cinta aislante en las gafas y a mi, nos mola.</p>
<h3>¿Por qué iOS y no Android?</h3>
<p>Es algo que me preguntan mucho. Bueno, para empezar, simplemente tenía que elegir. Descarté desde el principio usar AIR, para llegar a las dos plataformas, debido a temas de rendimiento, sobretodo, pero también tenía ganas de aprender algo nuevo. También descarté PhoneGap y similares, por las mismas razones y porque además es Javascript (ver punto anterior). Sea como sea, con ningún sistema de los que están saliendo ahora como setas se puede alcanzar <strong>el rendimiento de una aplicación nativa</strong>. Están muy bien para cosas sencillas multiplataforma, pero si te complicas un poco simplemente no sirven.</p>
<p>En cuanto a iOS vs Android, pues bueno, no quiero ser un fanboy, pero he tenido un móvil Android, he probado tabletas Android y siempre he vuelto a Apple. Que es cerrado, cierto. Que Apple a veces se pasa con sus restricciones, cierto. Pero en mi opinión el iPhone/iPad + iTunes + App Store es un sistema mucho mejor. Además con Apple te quitas el 99% de los <strong>problemas de fragmentación</strong> que tienes trabajando para Android. Esto sin contar que en el caso de querer vender aplicaciones, donde actualmente se están comprando es en la App Store y no en el Android Market, no tengo cifras, pero existen por ahí.</p>
<p>Y por último porque las herramientas de desarrollo que proporciona Apple son una maravilla, llevan años depurándolas ya que son las mismas que se utilizan para programar para ordenadores Apple. En mi opinión mejores que las alternativas que existen para Android (Eclipse y otros) y están a años luz que todo lo que lleva Adobe <strong>vendiéndonos por una pasta</strong> (sobretodo si vives en Europa). ¡Ah! y son gratuitas.</p>
<h3>Cómo aprendí</h3>
<p><img src="http://www.theso3.com/wp-content/uploads/2012/01/libros.jpg" alt="" title="libros" width="640" height="240" class="aligncenter size-full wp-image-964" /><br />
Para empezar dejé de coger trabajos. Aprovechando que había facturado bien a principios de año, en junio dejé de contestar a ofertas de freelance. Y empecé a aprender. <strong>No estudiaba tanto desde la universidad</strong>, y puede que ni entonces. </p>
<p>Me pedí unos cuantos libros a <a href="http://www.amazon.com" title="amazon">Amazon</a>, en concreto estos:</p>
<p>- Programming in Objective-C<br />
- iOS programming. The big nerd ranch guide.<br />
- iPhone 3D Programming<br />
- OpenGL ES 2.0 Programming Guide<br />
- Cocoa Design Patterns</p>
<p>Los dos primeros son de conocimientos generales de iOS y Objective-C. Estuve bastante tiempo investigando como hacer <a href="http://www.theso3.com/triangulacion-de-delaunay" title="deformaciones con Delaunay">deformaciones con Delaunay</a> con Objective-C. Como contaré en otra entrada resultó que no conseguía todo lo que pretendía hacer solo con Objective-C, así que, <strong>siendo un poco inconsciente</strong> de la complicación que tendría, me lié la manta a la cabeza y me dispuse aprender <strong>OpenGL</strong>. Para eso me compré los dos siguientes libros.</p>
<p>El tercero aún no lo he leído, pero lo haré, todavía me queda muchísimo que aprender.</p>
<p>De todas formas, más allá de estos libros, que están bien como referencia, donde realmente aprendí los entresijos de la programación para iOS fue en los vídeos que hay en <strong>iTunes University</strong>. Sobretodo los de <a href="http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255" title="Paul Hegarty">Paul Hegarty de Stanford</a>, que es un profesor excelente y lo explica todo de una forma clara y sencilla. Pero también los de <a href="http://itunes.apple.com/us/itunes-u/advanced-iphone-development/id407243032" title="Brad Larson">Brad Larson de Madison Area Technical College</a> que son más avanzados y Brad no es tan claro, se lía, corta frases a la mitad y a veces, para un hispano hablante, es difícil entenderle, pero que toca temas complejos como OpenGL o CoreData en más profundidad.</p>
<p>Y por supuesto también internet, leer mucho, buscar más y preguntar. Recomiendo, cómo no, <a href="http://www.stackoverflow.com" title="stackoverflow">stackoverflow</a>, que tiene muchísimo movimiento de <strong>preguntas relacionadas con iOS</strong>.</p>
<p>Hasta aquí esta pequeña introducción. Pronto más sobre este cambio de rumbo.</p>
<div class="shr-publisher-953"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/de-actionscript-a-objective-c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tres en The App Date</title>
		<link>http://www.theso3.com/tres-en-the-app-date</link>
		<comments>http://www.theso3.com/tres-en-the-app-date#comments</comments>
		<pubDate>Wed, 11 Jan 2012 10:18:10 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=935</guid>
		<description><![CDATA[Un poco a toro pasado, pero aprovecho que tengo nuevo diseño de web para recordar que el pasado 28 de Noviembre di una charla sobre Tres en el HUB Madrid invitado por la gente de The App Date. Aquí podéis ver un vídeo con un pequeño resumen. Tardo un poco en salir porque fui el [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.theso3.com/wp-content/uploads/2012/01/charla.jpg" rel="lightbox[935]"><img src="http://www.theso3.com/wp-content/uploads/2012/01/charla.jpg" alt="" title="charla" width="640" height="240" class="aligncenter size-full wp-image-936" /></a><br />
Un poco a toro pasado, pero aprovecho que tengo nuevo diseño de web para recordar que el pasado 28 de Noviembre di una charla sobre <a href="http://www.theso3.com/tres-app" title="Tres">Tres</a> en el <a href="http://madrid.the-hub.net/" title="Hub Madrid">HUB Madrid</a> invitado por la gente de <a href="http://theappdate.com/" title="The App Date">The App Date</a>.</p>
<p>Aquí podéis ver un vídeo con un pequeño resumen. Tardo un poco en salir porque fui el último ponente.</p>
<p><iframe src="http://player.vimeo.com/video/32842129?title=0&amp;byline=0&amp;portrait=0&amp;color=1EA718" width="640" height="360" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>Quiero dar las gracias a The App Date por invitarme cuando el proyecto todavía estaba en pañales, creer en él y además, de esa manera, forzarme un poco a acabarlo a tiempo.</p>
<p>Más información <a href="http://theappdate.com/noviembre-2012-the-app-date-12/" title="the app date noviembre">aquí</a>.</p>
<div class="shr-publisher-935"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/tres-en-the-app-date/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mi charla en ASNativos</title>
		<link>http://www.theso3.com/mi-charla-en-asnativos</link>
		<comments>http://www.theso3.com/mi-charla-en-asnativos#comments</comments>
		<pubDate>Tue, 19 Jul 2011 16:13:49 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=681</guid>
		<description><![CDATA[Se me está quedando cara de triángulo de tanto hablar de Delaunay. En fin, por si a alguien le puede interesar aquí está la charla de ASNativos: Triangulación de Delaunay y Deformaciones Tiene un inicio un poco denso, mucha programación, así que para quien quiera saltar directamente a la parte de las aplicaciones que vaya [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Se me está quedando cara de triángulo de tanto hablar de Delaunay.</p>
<p><a href="http://www.theso3.com/wp-content/uploads/2011/07/charla.jpg" rel="lightbox[681]"><img src="http://www.theso3.com/wp-content/uploads/2011/07/charla.jpg" alt="" title="charla" width="600" height="424" class="aligncenter size-full wp-image-682" /></a></p>
<p>En fin, por si a alguien le puede interesar aquí está la charla de ASNativos: <a href="http://mmse-v5.emea.adobe.acrobat.com/p5zjgobau04/">Triangulación de Delaunay y Deformaciones</a></p>
<p>Tiene un inicio un poco denso, mucha programación, así que para quien quiera saltar directamente a la parte de las aplicaciones que vaya al minuto 24:44</p>
<p>Y para ir directamente al ejemplo del Morphing: 42:00</p>
<p>Ahora mismo estoy trabajando en portar este tema a Objective-C para llevar Metamorpher ™ a la App Store, espero poder dar noticias al respecto pronto (eso sí, seguro que le pongo otro nombre).</p>
<p>Os recuerdo que <a href="http://www.theso3.com/codigo-de-delaunay-y-mapeado-de-triangulos">aquí</a> están las clases, si las usáis para algo me haría ilusión que me lo dijerais.</p>
<p>Gracias a <a href="http://www.refr3sh.es/">Joseba</a> y <a href="http://asnativos.com/">ASNativos</a> por organizar esto.</p>
<div class="shr-publisher-681"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/mi-charla-en-asnativos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Código de Delaunay y Mapeado de triángulos</title>
		<link>http://www.theso3.com/codigo-de-delaunay-y-mapeado-de-triangulos</link>
		<comments>http://www.theso3.com/codigo-de-delaunay-y-mapeado-de-triangulos#comments</comments>
		<pubDate>Mon, 20 Jun 2011 11:31:00 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Actionscript]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=651</guid>
		<description><![CDATA[Como prometí en la charla de asnativos, aquí está el código que he usado para calcular la triangulación de Delaunay y posteriormente para mapear los triángulos. Todo listo para hacer morphings de este tipo: Pronto estará la presentación online y también la pondré por aquí. Contenido El paquete se compone de las siguientes clases: - [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Como prometí en la charla de <a href="http://www.asnativos.com/index.php/meetings/">asnativos</a>, aquí está el código que he usado para calcular la triangulación de Delaunay y posteriormente para mapear los triángulos.</p>
<p>Todo listo para hacer morphings de este tipo:</p>
<p><a href="http://www.theso3.com/wp-content/uploads/2011/06/metamorpher.jpg" rel="lightbox[651]"><img class="aligncenter size-full wp-image-652" title="Metamorpher" src="http://www.theso3.com/wp-content/uploads/2011/06/metamorpher.jpg" alt="¿Quieres hacer cosas como esta? ¡Bájate estas clases!" width="600" height="333" /></a></p>
<p>Pronto estará la presentación online y también la pondré por aquí.<br />
<span id="more-651"></span><br />
<br/></p>
<h1>Contenido</h1>
<p>El paquete se compone de las siguientes clases:<br />
- <em>TriangulacionDelaunay</em>: Clase estática que contiene el método que a partir de una serie de puntos genera la red de triángulos.<br />
- <em>DTriangulo</em>: ValueObject, contienen los 3 puntos de cada triángulo. Los puntos no son Point, son int, posiciones del Vector de puntos que le pasamos a la triangulación.<br />
- <em>DLado</em>: Almacena los lados para hacer cálculos en la triangulación. Tampoco son puntos reales si no referencias.<br />
- <em>Deformador</em>: Hace el mapeado de los triángulos y pinta el resultado en un Shape.<br />
- <em>Malla</em>: Guarda el vector de puntos y el de triángulos (referencias al de puntos) que conforman la Malla.<br />
<br/></p>
<h1>Uso</h1>
<p>Creación de la red de triángulos.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> puntos:Vector.<span style="color: #66cc66;">&lt;</span>Point<span style="color: #66cc66;">&gt;</span> = <span style="color: #000000; font-weight: bold;">new</span> Vector.<span style="color: #66cc66;">&lt;</span>Point<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//...Rellenamos este vector con los puntos que necesitemos.</span>
<span style="color: #000000; font-weight: bold;">var</span> triangulos:Vector.<span style="color: #66cc66;">&lt;</span>DTriangulo<span style="color: #66cc66;">&gt;</span> = TriangulacionDelaunay.<span style="color: #006600;">triangulate</span><span style="color: #66cc66;">&#40;</span>puntos<span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//admite otro parámetro que ordena el Vector, y así acelera el algoritmo,</span>
<span style="color: #808080; font-style: italic;">//pero no lo podemos usar en un morph porque perdemos la referencia a los puntos</span></pre></td></tr></table></div>

<p>Creación y deformación de la malla de triángulos.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> destino:Shape = <span style="color: #000000; font-weight: bold;">new</span> Shape<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> malla:Malla = <span style="color: #000000; font-weight: bold;">new</span> Malla<span style="color: #66cc66;">&#40;</span>puntos, triangulos<span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//bmpd es un BitmapData con la imagen que queremos deformar</span>
<span style="color: #000000; font-weight: bold;">var</span> df:Deformador = <span style="color: #000000; font-weight: bold;">new</span> Deformador<span style="color: #66cc66;">&#40;</span>bmpd, malla, destino<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//Aquí podemos mover los puntos del Vector puntos</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//esta línea es para actualizar la Malla y por lo tanto ver la imagen deformada, debería estar en un bucle os similar</span>
df.<span style="color: #006600;">morph</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//si además queremos actualiza la imagen.</span>
df.<span style="color: #006600;">actualizaBitmap</span><span style="color: #66cc66;">&#40;</span>bmpd<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>&nbsp;<br />
<br/></p>
<h1>Descarga</h1>
<p><a href="http://www.theso3.com/contenido/delaunay/DelaunayMorpher.zip">Aquí</a> os podéis descargar el código y usarlo para lo que queráis. Eso sí, si hacéis algo que mole, estaría bien que me lo hicierais saber en los comentarios de este post. Por curiosidad solamente.</p>
<div class="shr-publisher-651"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/codigo-de-delaunay-y-mapeado-de-triangulos/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>¿Cómo cuidar a tu programador? Decálogo para diseñadores (I)</title>
		<link>http://www.theso3.com/%c2%bfcomo-cuidar-a-tu-programador-decalogo-para-disenadores-i</link>
		<comments>http://www.theso3.com/%c2%bfcomo-cuidar-a-tu-programador-decalogo-para-disenadores-i#comments</comments>
		<pubDate>Wed, 13 Oct 2010 11:30:29 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://theso3.com/blog/?p=318</guid>
		<description><![CDATA[Por aclararlo, no vayamos a herir sensibilidades. Lo que viene a continuación son consejos desde el punto de vista de un programador, pensados sobre todo para diseñadores que viene de diseño off-line y que no acompañan sus amplios conocimientos de diseño con otros sobre cómo funcionan las cosas en digital. Yo soy un simple programador [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Por aclararlo, no vayamos a herir sensibilidades. Lo que viene a continuación son <strong>consejos</strong> desde el punto de vista de un programador, pensados sobre todo para diseñadores que viene de diseño off-line y que no acompañan sus amplios conocimientos de diseño con otros sobre cómo funcionan las cosas en digital. Yo soy un simple programador y nunca me he sentido capacitado para dar consejos de diseño a un diseñador.</p>
<p>En principio todo esto está escrito desde el punto de vista del programador <strong>Flash</strong> que trabaja en agencias de publicidad, pero probablemente la mayor parte sea extrapolable a otro tipo de programadores en otro tipo de trabajos, siempre que trabajen con diseñadores.</p>
<p>Para muchos el programador no es más que ese ser paliducho que se sienta en una esquina de la agencia, come bolsas de patatas y siempre tiene la pantalla llena de letras extrañas. Pero señores, más allá de ese pelo desordenado, detrás de esa camiseta de heavy metal, dentro de ese cuerpo falto de ejercicio hay un corazón que se siente herido si no se le trata con cariño.</p>
<p>Pero basta de drama, en realidad lo que digo a continuación no solo ayudará a tener al programador contento, si no que además incidirá en una mejora del flujo de trabajo en general, haciendo que haya que dar menos vueltas al ciclo de desarrollo y que por lo tanto se pierda menos tiempo en el proyecto.</p>
<p>Los 10 consejos que describo a continuación en realidad podrían resumirse en uno solo, el más importante de todos: <strong>Ten el archivo fuente de diseño tan ordenado como si fuera tu casa justo antes de que tu madre viniera de visita</strong>.<br />
<span id="more-318"></span></p>
<h2>1 Software</h2>
<p>El 90% de los flasheros suelen trabajar con <strong>Photoshop</strong> y sí, me acabo de inventar la estadística, pero ¿a que suena creíble?. Este punto es un poco conflictivo, ya que habrá gente que prefiera utilizar <strong>Fireworks</strong>, otros <strong>Ilustrator</strong> e incluso habrá algún obsoleto que siga con el <strong>Freehand</strong>. De todas formas el más común sigue siendo Photoshop y es el software que deberíais utilizar si queréis aseguraos de no fallar. Quizás Ilustrator funcione mejor para algo que luego en flash vaya a ser vectorial, pero para bitmaps nos quedaremos con Photoshop y sus extensas posibilidades de exportación para web.</p>
<p>En cuanto a Fireworks, hay muchos programadores que lo prefieren sobre Photoshop, pero creo que son más del bando de &#8220;yo me lo guiso, yo me lo como&#8221;, que diseñan y montan la web ellos mismos, normalmente en HTML + CSS, para lo cuál, Fireworks, tiene ciertas ventajas. Tiene muchas herramientas que facilitan el trabajo en web, pero en cuanto a bitmaps es una versión descafeinada de Photoshop. Además las supuestas ventajas de Fireworks desaparecen en el momento en el que el diseñador no tiene en cuenta la <strong>metodología de trabajo</strong> del mismo en cuanto a ordenación de capas y demás para luego exportar fácilmente a flash.</p>
<p>De todas formas, si existe la posibilidad, lo mejor es preguntar al programador con qué software prefiere que se diseñe la web. Dependiendo del tipo de trabajo puede que sea más conveniente uno u otro. Eso sí, no intentéis hacerlo siempre en el mismo y exportar a otros formatos (por ejemplo, hacerlo en Fireworks y exportar a PSD), porque simplemente no funciona, el exportador creará tal caos en las capas que hace el archivo incomprensible incluso para el propio diseñador.</p>
<h2>2 Resolución de pantalla</h2>
<p>Sé que esto no hace falta decírselo al común de los mortales, pero el diseñador de papel es un ser fuera de lo normal. Por lo tanto lo digo: La resolución del archivo tiene que ser de<strong> 72 puntos por pulgada</strong>. Los archivos de 300 puntos por pulgada los dejamos para imprenta.</p>
<p>Si me dieran un euro por cada vez que he recibido un archivo a 300 ppp, ahora tendría… no sé, 3 o 4 euros.</p>
<h2>3 Tamaño</h2>
<p>Hay una diferencia importante entre el diseño pensado para papel, televisión, etc y el pensado para internet. Y es que en internet no puedes controlar diversos aspectos de cómo el usuario verá tu diseño. El más importante de ellos es el <strong>tamaño de pantalla</strong>.</p>
<p>A día de hoy se toma como tamaño mínimo 1024&#215;768, es decir, se entiende que todo el mundo tiene esa resolución de pantalla o más. Si a eso le restamos lo que ocupa el navegador en si nos queda que aproximadamente el diseño tiene que andar por los <strong>950&#215;600</strong> para que no salgan las barras de scroll.</p>
<p>Aún así todavía hay gente con resoluciones más pequeñas (portátiles probablemente) y casualmente alguien en el cliente suele tener una resolución más pequeña. Generalmente no pasa nada, se les puede explicar que lo suyo no es lo normal, pero aún así es buena idea no colocar elementos interactivos pegados al borde inferior, ya que, aunque puedas mover el scroll hasta allí, no salen en un <strong>primer vistazo</strong>.</p>
<p>Es muy común que se diseñe pensando en un tamaño fijo concreto sin darle mucha importancia a cómo se verá en pantallas más grandes o más pequeñas. Esto sobretodo es un problema cuando se hacen diseños que ocupen <strong>toda la pantalla del navegador</strong>.  Creo que esto queda claro con el siguiente ejemplo.</p>
<p><a rel="shadowbox;width=800;height=800" href="http://www.theso3.com/wp-content/uploads/2010/10/imagen13.jpg" rel="lightbox[318]"><img class="aligncenter size-large wp-image-597" title="Diseño original" src="http://www.theso3.com/wp-content/uploads/2010/10/imagen13-1024x741.jpg" alt="" width="640" height="463" /></a></p>
<p>Esto suele ser la captura que hace el diseñador de cómo va a ser la home de una web. Ha puesto la ventana del navegador para que el cliente se haga una idea de cómo quedaría (parece que si no el cliente no se hace una idea, así es… ). Todo muy bonito, el cliente lo aprueba y claro, cuando esté online quiere ver <strong>exactamente eso</strong>.</p>
<p>Pero ¿qué pasa si la ventana del navegador del usuario tiene un tamaño diferente? ¿se reposicionan los elementos para ajustarse al tamaño nuevo? ¿mantenemos todo en su sitio y ponemos un marco? ¿no dejamos que reescale la ventana? (muy poco recomendable) No es una decisión muy complicada de tomar, pero puede cambiar completamente el look de la página, podemos pasar de una página limpia con muchos espacios en blanco a una con todo apiñado o viceversa si esto no se piensa con antelación. Y el encargado de pensarlo tiene que ser el diseñador.</p>
<p>Veamos qué puede pasar si la pantalla del usuario es más grande. Primero podemos <strong>poner un marco</strong> para que el contenido se mantenga centrado y conserve las proporciones del original.</p>
<p><a href="http://www.theso3.com/wp-content/uploads/2010/10/grande1.jpg" rel="lightbox[318]"><img class="aligncenter size-large wp-image-605" title="Mayor resolución con marco" src="http://www.theso3.com/wp-content/uploads/2010/10/grande1-1024x703.jpg" alt="" width="640" height="439" /></a></p>
<p>Ésta es la solución más sencilla desde el punto de vista del programador, no requiere andar haciendo cálculos ni comprobar si se escala o no la ventana. Desde el diseño, mi impresión es que hacer esto también es más fácil.</p>
<p>Otra opción sería <strong>reposicionar los elementos</strong> para que se extiendan por toda la pantalla, pero sin escalar nada.</p>
<p><a href="http://www.theso3.com/wp-content/uploads/2010/10/grande2.jpg" rel="lightbox[318]"><img class="aligncenter size-large wp-image-606" title="Mayor resolución reposicionando" src="http://www.theso3.com/wp-content/uploads/2010/10/grande2-1024x703.jpg" alt="" width="640" height="439" /></a></p>
<p>Esta opción requiere algo más tanto para diseño como para programación. El ejemplo que uso es muy sencillo, pero ya se pueden ver algunas cosas que pueden dar lugar a conflictos. Por ejemplo, ¿qué pasa con el pie?, ¿lo dejamos pegado al contenido súper molón o lo pegamos al borde inferior de la ventana?. Lo mismo con el logo, ¿lo ponemos en el borde superior de la ventana o pegado al contenido?</p>
<p>Este tipo de dudas crecen exponencialmente según la complejidad del diseño, no hablemos ya de las animaciones y transiciones entre secciones. Todo eso habría que tenerlo en cuenta.</p>
<p>Una tercera opción sería reposicionar algunos elementos y <strong>escalar</strong> otros.</p>
<p><a href="http://www.theso3.com/wp-content/uploads/2010/10/grande3.jpg" rel="lightbox[318]"><img class="aligncenter size-large wp-image-607" title="Mayor resolución reescalando" src="http://www.theso3.com/wp-content/uploads/2010/10/grande3-1024x703.jpg" alt="" width="640" height="439" /></a></p>
<p>En muchos casos esto estará bien ya que se podrá ver el contenido a mayor tamaño. Tenemos los mismos retos que en el caso anterior, hay que pensar bien cómo queda todo en el nuevo tamaño. Pero además hay otras cosas a tener en cuenta. En el caso de que el contenido súper molón fuera vídeo o imágenes antes de plantear esta solución habría que pensar si se dispone de ese contenido con una <strong>calidad suficiente</strong> como para mostrarlo a un tamaño tan grande (y hay que tener en cuenta que todavía habrá gente con pantallas mayores). Sin embargo, si el contenido es 3D (Papervision, Away…) u otra cosa que haga un uso intensivo de la <strong>CPU</strong> es posible que no vaya igual de fluido a tamaños muy grandes.</p>
<p>Cuidado con esto y sobretodo pregúntale al programador antes de enseñárselo al cliente, no vaya a ser que éste se encapriche por un diseño que luego no se va a poder montar.</p>
<h2>4 Nombrar capas y carpetas</h2>
<p>Ésta es de cajón, para saber qué hay en cada capa sin tener que andar seleccionándolas y moviéndolas por el documento, encendiendo y apagando otras, lo mejor es que cada una tenga un nombre <strong>claro y conciso</strong> de lo que contiene.</p>
<p>No solo eso, además ayudará a que el diseño esté estructurado. Nosotros como programadores tenemos el cerebro completamente cuadriculado (lo digo por mantener el mito, aunque algo de verdad hay), para nosotros un logo es un logo y un botón es un botón. Por eso nos resulta bastante lioso cuando, por ejemplo, ese logo está compuesto de varias capas (sombra, brillo, mancha, texto…) que no están colocadas de forma consecutiva en el PSD y sobretodo cuando además alguna de esas capas afecta a otros elementos al mismo tiempo. He visto más de una vez que se dibuja todo el interfaz y luego se le dan tonos o brillos a todo en una capa por encima.</p>
<p>Nombrar las capas y las carpetas del PSD, además de ayudar al programador a entenderlo, ayudará al diseñador a <strong>estructurar el contenido</strong> de forma que un logo sea un logo y un botón un botón. Si hay alguna capa a la que no sepas qué nombre darle quizás me plantearía si esa capa es realmente necesaria o si realmente va situada donde la estás poniendo. Puede parecer demasiado restrictivo, pero hay que tener en cuenta que no estamos diseñando para papel, esto no se imprime y listo, lo que se haga en Photoshop tiene que ser extraído por partes a Flash, por eso esas partes tienen que estar bien definidas.</p>
<p>Si además de todo esto ponemos colorines al PSD ya es para nota.</p>
<p>Y ahora un ejemplo de lo que <strong>NO</strong> se debe hacer</p>
<p><iframe width="640" height="480" src="http://www.youtube.com/embed/uzC_Gh8726k?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>El vídeo es real, grabado por mi. En defensa del diseñador diré que en realidad el jaleo en el PSD es el resultado de exportarlo desde Fireworks, pero igualmente, es buen un ejemplo de lo que no se debe hacer jamás. </p>
<p>Y un par de lo que <strong>SÍ</strong> se debe hacer.</p>
<p><a href="http://www.theso3.com/wp-content/uploads/2010/10/capas1.jpg" rel="lightbox[318]"><img src="http://www.theso3.com/wp-content/uploads/2010/10/capas1-108x300.jpg" alt="" title="Capas ordenadas 1" width="108" height="300" class="aligncenter size-medium wp-image-611" /></a><br />
<a href="http://www.theso3.com/wp-content/uploads/2010/10/capas2.jpg" rel="lightbox[318]"><img src="http://www.theso3.com/wp-content/uploads/2010/10/capas2-129x300.jpg" alt="" title="Capas ordenadas 2" width="129" height="300" class="aligncenter size-medium wp-image-612" /></a></p>
<p>Como anécdota diré, que pedí por twitter y facebook imágenes de PSDs bien ordenados y coloreados como ejemplo para este post y la respuesta más común fue que la existencia de ese tipo de PSDs era una leyenda urbana. Es vuestro deber como diseñadores demostrar que eso no es así.</p>
<h2>5 Efectos de capa</h2>
<p>Como regla general un solo consejo: <strong>no los uses</strong>.</p>
<p>Vale, me he pasado, puedes usarlos, pero con moderación. No todos los efectos de capa que hay en Photoshop están disponibles en Flash. Y aunque lo estén no siempre es una buena idea usarlos. Van a cargar más la CPU y además hay que tener en cuenta cómo funcionarán cuando el contenido sea animado.</p>
<p>Por ejemplo, a lo mejor ponemos un logotipo en algún modo de capa para que el fondo sea transparente, pero resulta que en Flash lo que está debajo del logo en algún momento cambia de color o se anima. Puede que el modo de capa deje de funcionar o que el logo cambie de color. Aunque es más trabajo, suele ser mejor idea <strong>recortar</strong> el logo y exportarlo como PNG.</p>
<p>&#8211;<br />
<strong>Pronto una segunda parte.</strong></p>
<div class="shr-publisher-318"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/%c2%bfcomo-cuidar-a-tu-programador-decalogo-para-disenadores-i/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Color Theory</title>
		<link>http://www.theso3.com/color-theory</link>
		<comments>http://www.theso3.com/color-theory#comments</comments>
		<pubDate>Fri, 01 Oct 2010 09:25:06 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[El juego del viernes]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=590</guid>
		<description><![CDATA[Ya aviso que el juego no es sencillo, tampoco es que gráficamente sea una maravilla, pero está realmente bien pensado. Solo espero que si pinchas sobre el enlace no tengas nada que hacer en la próxima hora. Yo me he hecho todos los niveles, sin buscar la solución en google, a ver quién lo logra. [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Ya aviso que el juego no es sencillo, tampoco es que gráficamente sea una maravilla, pero está realmente bien pensado. Solo espero que si pinchas sobre el enlace no tengas nada que hacer en la próxima hora.</p>
<p><a href="http://www.silvergames.com/game/color-theory/" target="_blank"><img src="http://www.theso3.com/wp-content/uploads/2010/10/colortheory.jpg" alt="" title="colortheory" width="500" height="500" class="aligncenter imagen-post wp-image-591" /></a></p>
<p>Yo me he hecho todos los niveles, sin buscar la solución en google, a ver quién lo logra.</p>
<p><a href="http://www.silvergames.com/game/color-theory" target="_blank">¡Jugar!</a></p>
<div class="shr-publisher-590"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/color-theory/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Circulos, semicírculos, coronas circulares y semicoronas circulares</title>
		<link>http://www.theso3.com/circulos-semicirculos-coronas-circulares-y-semicoronas-circulares</link>
		<comments>http://www.theso3.com/circulos-semicirculos-coronas-circulares-y-semicoronas-circulares#comments</comments>
		<pubDate>Thu, 30 Sep 2010 15:56:50 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Actionscript]]></category>

		<guid isPermaLink="false">http://www.theso3.com/?p=565</guid>
		<description><![CDATA[Puede parecer una cuestión trivial, pero lo cierto es que no hay ningún método en la API de dibujo de flash que permita crear todas esas formas. Como mucho podemos crear círculos y arcos y a partir de ahí ir haciendo apaños. Para un proyecto, aún en desarrollo, necesité crear varios círculos superpuestos, en ocasiones [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Puede parecer una cuestión trivial, pero lo cierto es que no hay ningún método en la API de dibujo de flash que permita crear todas esas formas. Como mucho podemos crear círculos y arcos y a partir de ahí ir haciendo apaños.</p>
<p>Para un proyecto, aún en desarrollo, necesité crear varios círculos superpuestos, en ocasiones semicirculos y también con un radio interior (coronas circulares).</p>
<p>Así que decidí crear mi propia clase círculo. Un <strong>Shape</strong> que expone las siguientes propiedades mediante getters/setters:</p>
<ul>
<li><strong>radio_interior</strong></li>
<li><strong>radio_exterior</strong></li>
<li><strong>angulo_inicial</strong></li>
<li><strong>angulo_final</strong></li>
<li><strong>color</strong></li>
</ul>
<p>Al exponerlas en el interfaz nos permite acceder a ellas fácilmente desde fuera de esa clase y como el círculo se redibuja cada vez que una de esas propiedad cambia, es muy sencillo animarlo. Como se ve en el siguiente ejemplo en el que lo animo aleatoriamente con la clase TweenMax:<br />
<span id="more-565"></span></p>
<div align="center"><embed wmode="transparent" src="http://www.theso3.com/contenido/circulos/circulos.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="640" height="480"></embed></div>
<p>Aquí está el código de este ejemplo.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="actionscript" style="font-family:monospace;">package 
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">greensock</span>.<span style="color: #006600;">TweenMax</span>;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">greensock</span>.<span style="color: #006600;">easing</span>.<span style="color: #006600;">Quad</span>;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">theso3</span>.<span style="color: #006600;">graficos</span>.<span style="color: #006600;">Circulo</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
	<span style="color: #66cc66;">&#91;</span>SWF<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">width</span>=<span style="color: #cc66cc;">800</span>, <span style="color: #0066CC;">height</span>=<span style="color: #cc66cc;">600</span>, frameRate=<span style="color: #cc66cc;">30</span>, <span style="color: #0066CC;">backgroundColor</span>=0xFFFFFF<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #0066CC;">extends</span> Sprite <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> c:Circulo;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>		
			c = <span style="color: #000000; font-weight: bold;">new</span> Circulo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			c.<span style="color: #006600;">x</span> = <span style="color: #cc66cc;">400</span>;
			c.<span style="color: #006600;">y</span> = <span style="color: #cc66cc;">300</span>;
			addChild<span style="color: #66cc66;">&#40;</span>c<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			anima<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> anima<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			c.<span style="color: #0066CC;">color</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>0xFFFFFF;
			TweenMax.<span style="color: #006600;">to</span><span style="color: #66cc66;">&#40;</span>c, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">2</span>+<span style="color: #cc66cc;">1</span>, <span style="color: #66cc66;">&#123;</span>
				radio_exterior:<span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">200</span>+<span style="color: #cc66cc;">100</span>, 
				radio_interior:<span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">100</span>,
				angulo_inicial:<span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">180</span>,
				angulo_final:<span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">180</span>+<span style="color: #cc66cc;">180</span>,
				ease:Quad.<span style="color: #006600;">easeInOut</span>,
				onComplete:<span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
					anima<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>La geometría aplicada está sacada de internet (no recuerdo de dónde), lamentablemente no atendí lo suficiente en esas clases de la carrera como para desarrollar algo así desde cero. Lo que hice fue coger una clase que creaba un arco en tramos y ampliarla para que creara dos arcos  completos que luego se unen con dos líneas rectas, al rellenarlas de un color da como resultado la forma que buscamos.</p>
<p>El número de miniarcos que forman los arcos grandes varía automáticamente dependiendo del alcance del ángulo del arco grande. Esto se puede ver en el siguiente ejemplo en el que dibujo los puntos de control y los anclajes de los miniarcos.</p>
<div align="center"><embed wmode="transparent" src="http://www.theso3.com/contenido/circulos/debug.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="640" height="480"></embed></div>
<p>Por eso en realidad los círculos no son perfectos, y si superpones dos con el mismo radio, pero diferentes ángulos y diferentes colores verás que no encajan perfectamente. Aún así es una solución rápida en términos de consumo de CPU y para casi todo, <strong>suficientemente perfectos</strong>.</p>
<p>Aquí está el código, por si alguien necesita crear círculos a tutiplén:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="actionscript" style="font-family:monospace;">package com.<span style="color: #006600;">theso3</span>.<span style="color: #006600;">graficos</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Shape</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Circulo <span style="color: #0066CC;">extends</span> Shape <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _radio_exterior:<span style="color: #0066CC;">Number</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _radio_interior:<span style="color: #0066CC;">Number</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _angulo_inicial:<span style="color: #0066CC;">Number</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _angulo_final:<span style="color: #0066CC;">Number</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _color:<span style="color: #0066CC;">Number</span>;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Circulo<span style="color: #66cc66;">&#40;</span>radio_exterior:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">200</span>, radio_interior:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">50</span>, angulo_inicial:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">30</span>, angulo_final:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">330</span>, <span style="color: #0066CC;">color</span>:<span style="color: #0066CC;">Number</span> = 0xaaaaaa<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">this</span>._radio_exterior = radio_exterior;
			<span style="color: #0066CC;">this</span>._radio_interior = radio_interior;
			<span style="color: #0066CC;">this</span>._angulo_inicial = angulo_inicial;
			<span style="color: #0066CC;">this</span>._angulo_final = angulo_final;
			<span style="color: #0066CC;">this</span>._color = <span style="color: #0066CC;">color</span>;
&nbsp;
			dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			graphics.<span style="color: #0066CC;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			graphics.<span style="color: #0066CC;">lineStyle</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
			graphics.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span>_color<span style="color: #66cc66;">&#41;</span>;
			graphics.<span style="color: #0066CC;">moveTo</span><span style="color: #66cc66;">&#40;</span>_radio_interior, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> a1:<span style="color: #0066CC;">Number</span> = -_angulo_inicial<span style="color: #66cc66;">*</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">PI</span> <span style="color: #66cc66;">/</span><span style="color: #cc66cc;">180</span>;
			<span style="color: #000000; font-weight: bold;">var</span> a2:<span style="color: #0066CC;">Number</span> = -_angulo_final<span style="color: #66cc66;">*</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">PI</span> <span style="color: #66cc66;">/</span><span style="color: #cc66cc;">180</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> diff:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">abs</span><span style="color: #66cc66;">&#40;</span>a2-a1<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> dir:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">1</span>;
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>a2<span style="color: #66cc66;">&lt;</span>a1<span style="color: #66cc66;">&#41;</span>
				dir = -<span style="color: #cc66cc;">1</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> divs:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">floor</span><span style="color: #66cc66;">&#40;</span>diff<span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">PI</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>+<span style="color: #cc66cc;">1</span>;
			<span style="color: #000000; font-weight: bold;">var</span> span:<span style="color: #0066CC;">Number</span> = dir <span style="color: #66cc66;">*</span> diff<span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">*</span>divs<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> rc:<span style="color: #0066CC;">Number</span> = _radio_exterior <span style="color: #66cc66;">/</span> <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>span<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			graphics.<span style="color: #0066CC;">moveTo</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_exterior , <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">sin</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_exterior<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span>=<span style="color: #cc66cc;">0</span>; i<span style="color: #66cc66;">&lt;</span>divs; ++i<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				a2 = a1+span;
				a1 = a2+span;
&nbsp;
				graphics.<span style="color: #0066CC;">curveTo</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>a2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>rc, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">sin</span><span style="color: #66cc66;">&#40;</span>a2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>rc, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_exterior , <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">sin</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_exterior<span style="color: #66cc66;">&#41;</span>;
	     	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	     	rc = _radio_interior<span style="color: #66cc66;">/</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>span<span style="color: #66cc66;">&#41;</span>;
	     	graphics.<span style="color: #0066CC;">lineTo</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_interior, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">sin</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_interior<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=divs; i<span style="color: #66cc66;">&gt;</span><span style="color: #cc66cc;">0</span>; --i<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				a2 = a1-span;
				a1 = a2-span;
				graphics.<span style="color: #0066CC;">curveTo</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>a2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>rc, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">sin</span><span style="color: #66cc66;">&#40;</span>a2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>rc, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">cos</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_interior, <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">sin</span><span style="color: #66cc66;">&#40;</span>a1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>_radio_interior<span style="color: #66cc66;">&#41;</span>;
	     	<span style="color: #66cc66;">&#125;</span>			
&nbsp;
			graphics.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;			
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> radio_interior<span style="color: #66cc66;">&#40;</span>r:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_radio_interior = r;
			dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> radio_exterior<span style="color: #66cc66;">&#40;</span>r:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_radio_exterior = r;
			dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> angulo_inicial<span style="color: #66cc66;">&#40;</span>a:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_angulo_inicial = a;
			dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> angulo_final<span style="color: #66cc66;">&#40;</span>a:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_angulo_final = a;
			dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">color</span><span style="color: #66cc66;">&#40;</span>c:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_color = c;
			dibuja<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;				
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> radio_interior<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> <span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> _radio_interior;<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> radio_exterior<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> <span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> _radio_exterior;<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> angulo_inicial<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> <span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> _angulo_inicial;<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> angulo_final<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> <span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> _angulo_final;<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">color</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> <span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> _color;<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<div class="shr-publisher-565"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/circulos-semicirculos-coronas-circulares-y-semicoronas-circulares/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aplicaciones de Delaunay: Drag blando</title>
		<link>http://www.theso3.com/aplicaciones-de-delaunya-i-drag-blando</link>
		<comments>http://www.theso3.com/aplicaciones-de-delaunya-i-drag-blando#comments</comments>
		<pubDate>Mon, 26 Apr 2010 14:59:43 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Actionscript]]></category>

		<guid isPermaLink="false">http://theso3.com/blog/?p=307</guid>
		<description><![CDATA[Y digo &#8220;drag blando&#8221; por llamarlo de alguna manera. Simplemente utilizando el método descrito anteriormente, creamos una malla de triángulos. Al mover la imagen la sustituimos por la malla y hacemos que los puntos se muevan con cierto retardo según lo lejos que estén del ratón. Y &#8230; ¡tachán! Aquí el código fuente.]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Y digo &#8220;drag blando&#8221; por llamarlo de alguna manera.</p>
<p>Simplemente utilizando el <a href="http://theso3.com/triangulacion-de-delaunay">método descrito anteriormente</a>, creamos una <strong>malla de triángulos</strong>.</p>
<p>Al mover la imagen la sustituimos por la malla y hacemos que los puntos se muevan con cierto <strong>retardo</strong> según lo lejos que estén del ratón.</p>
<p>Y &#8230; ¡tachán!</p>
<div align="center"><embed wmode="transparent" src="http://theso3.com/contenido/dragblando/dragblando.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="640" height="640"></embed></div>
<p><a href="http://theso3.com/contenido/dragblando/source_dragblando.zip">Aquí</a> el <strong>código fuente.</strong></p>
<div class="shr-publisher-307"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/aplicaciones-de-delaunya-i-drag-blando/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Volkswagen Nuevo Polo</title>
		<link>http://www.theso3.com/volkswagen-nuevo-polo</link>
		<comments>http://www.theso3.com/volkswagen-nuevo-polo#comments</comments>
		<pubDate>Mon, 15 Mar 2010 16:08:25 +0000</pubDate>
		<dc:creator>Ricardo</dc:creator>
				<category><![CDATA[Portfolio]]></category>

		<guid isPermaLink="false">http://theso3.com/blog/?p=267</guid>
		<description><![CDATA[Cliente: Volkswagen Agencia: Tribal DDB Esta vez se quería algo bastante ambicioso, un proyecto pensado para internacional. Esto quiere decir que todos los textos tienen que ser dinámicos, y los campos tienen que variar de tamaño para adaptarse a las diferentes lenguas (malditos alemanes, no tienen palabras cortas, ¿o qué?). Además se tiene que proporcionar [...]]]></description>
				<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.theso3.com/wp-content/uploads/2010/03/polo.jpg" rel="lightbox[267]"><img src="http://www.theso3.com/wp-content/uploads/2010/03/polo.jpg" alt="" title="polo" width="640" height="240" class="aligncenter size-full wp-image-884" /></a><br />
Cliente: <strong>Volkswagen</strong><br />
Agencia: <strong>Tribal DDB</strong></p>
<p>Esta vez se quería algo bastante ambicioso, un proyecto pensado para <strong>internacional</strong>. Esto quiere decir que todos los textos tienen que ser dinámicos, y los campos tienen que variar de tamaño para adaptarse a las diferentes lenguas (malditos alemanes, no tienen palabras cortas, ¿o qué?). Además se tiene que proporcionar la posibilidad de que editando un xml se puedan deshabilitar determinadas partes del site. Con la dificultad añadida de que los Xmls se tenían que adaptar a una estructura prefijada para que funcionaran correctamente con la herramienta de <strong>localización</strong> de Volkswagen.</p>
<p>Por si esto fuera poco el proyecto ya de por si no era nada trivial. Consistió en hacer un <strong>configurador</strong> para el nuevo Volkswagen Polo. Todo en 3D, con Papervision, que permitiera ajustar diferentes parámetros y elementos visuales del coche, que hubiera una galería, que se pudiera conducir, compartir en redes sociales y como colofón que fuera un <strong>concurso</strong> cuyo premio final fuera el coche tal y cómo el usuario ganador lo había diseñado.</p>
<p>Afortunadamente conté con la ayuda de <a href="http://fortalezaescondida.blogspot.com/" target="_blank">Pablo Martín</a> (para la parte de producto), <a href="http://drusunlimited.com/" target="_blank">Javier Fernández</a> (para la galería y el registro) y Elena Sánchez (para el backend). En este artículo hablaré del resto, es decir, de lo que hice yo.</p>
<p>Desafortunadamente el proyecto fue un <strong>infierno</strong> de principio a fin, y no,  no fue por casi nada de lo que digo arriba.<br/><br />
<iframe width="640" height="360" src="http://www.youtube.com/embed/FXnZj7tlnV4?rel=0" frameborder="0" allowfullscreen></iframe><br />
<span id="more-267"></span></p>
<h2>Cómo se hizo</h2>
<p>Ya que íbamos a ser 3 programadores trabajando en diferentes partes del site al mismo tiempo, por primera vez decidí utilizar <a href="http://www.gaiaflashframework.com/">Gaia Framework</a>. Fue de gran ayuda a la hora de organizarnos. Pero bueno, a estas alturas no voy a decir nada de Gaia que no se haya dicho ya.</p>
<h3>El modelo del coche</h3>
<p>El excelente modelo del Polo en low poly me lo pasó la gente de <a href="www.aparenta.com">Aparenta</a>. Consiguieron que con una geometría sencilla y unas cuantas texturas bien puestas el coche diera el pego a pesar de las limitaciones (en cuanto a recursos y CPU) de Flash + Papervision 3D.</p>
<p>Hubo que pasar dicho modelo por Blender para mover algunos objetos de sitio y renombrar la geometría. Por ejemplo, las ruedas las moví al centro de la escena (0,0,0) para que su propio centro geométrico fuera también su centro de rotación. Luego por programación las volvía a situar en su sitio y en el caso de las delanteras las metía dentro de otro objeto que hacía de eje para que giraran en Y, además de rotar.</p>
<p>Este es el código para las ruedas de la parte izquierda:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="actionscript" style="font-family:monospace;">eje_izq = <span style="color: #000000; font-weight: bold;">new</span> DisplayObject3D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
model.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>eje_izq<span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//referencia a la rueda frontal izquierda en el modelo 3ds</span>
<span style="color: #000000; font-weight: bold;">var</span> left_tyre : DisplayObject3D = model.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;frnttyrel&quot;</span><span style="color: #66cc66;">&#41;</span>;
model.<span style="color: #006600;">removeChild</span><span style="color: #66cc66;">&#40;</span>left_tyre<span style="color: #66cc66;">&#41;</span>;
eje_izq.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>left_tyre<span style="color: #66cc66;">&#41;</span>;
eje_izq.<span style="color: #006600;">x</span> = -<span style="color: #cc66cc;">250</span>;
eje_izq.<span style="color: #006600;">y</span> = <span style="color: #cc66cc;">70</span>;
eje_izq.<span style="color: #006600;">z</span> = <span style="color: #cc66cc;">130</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//referencia a la rueda trasera izquierda en el modelo 3ds</span>
model.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bktyrel&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">x</span> = <span style="color: #cc66cc;">230</span>;
model.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bktyrel&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">y</span> = <span style="color: #cc66cc;">60</span>;
model.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bktyrel&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">z</span> = <span style="color: #cc66cc;">130</span>;</pre></td></tr></table></div>

<p>Costó varias horas de rompederos de cabeza, pero finalmente llegué a la conclusión de que el exportador de Blender a <strong>3ds</strong> es una auténtica bazofia (porque no sé si queda muy profesional decir &#8220;mierda&#8221; en un blog). Cambia los nombres de los objetos sin una regla fija aparente, así que me vi obligado a hacer trazas en flash hasta que descubría cómo le había dado a mi amigo Blender por llamarlos esta vez.</p>
<p>Debido a esto el <a href="http://theso3.com/navidad-con-telefonica-y-raphael">siguiente proyecto</a> en el que hubo que hacer algo así fue directamente hecho con <strong>Maya</strong>.</p>
<h3>Materiales interactivos</h3>
<p>Como se ve en el vídeo, las diferentes partes del coche cambian de material cuando pasas el ratón sobre ellas. Te indican que estás sobre ellas con un color rojo. Esto debería ser sencillo utilizando un <strong>material interactivo</strong> de Papervision 3D, bueno pues&#8230; no lo es.</p>
<p>El problema es que cuando se trata de un modelo cargado de un archivo externo, con relativa complejidad, por algún motivo que desconozco, no detecta bien las zonas activas y solo dependiendo del ángulo con respecto a la cámara hará bien el rollOver o no. Finalmente la solución consistió en crear un <strong>modelo proxy</strong> mediante programación que imitara una geometría similar a la de las diferentes partes del coche pero simplificada. Esto es: un cubo para una puerta, otro para otra, etc.</p>
<p style="text-align: center;"><a href="http://theso3.com/wp-content/uploads/2010/03/proxy.png" rel="lightbox[267]"><img class="size-full wp-image-209 aligncenter" title="El coche con el modelo Proxy solapado." src="http://theso3.com/wp-content/uploads/2010/03/proxy.png" alt="" width="616" height="421" /></a></p>
<p>De esta forma el modelo proxy detecta el ratón y le pasa al evento al coche que se encarga de cambiar el material de la parte correspondiente.</p>
<p>Los materiales son <strong>MovieMaterials</strong> compuestos por varios Sprites de la siguiente forma:</p>
<p style="text-align: center;"><a href="http://theso3.com/wp-content/uploads/2010/03/texturas.jpg" rel="lightbox[267]"><img class="size-full wp-image-293 aligncenter" title="Configuración de Materiales" src="http://theso3.com/wp-content/uploads/2010/03/texturas.jpg" alt="" width="450" height="450" /></a></p>
<p>Las dos capas superiores añaden detalle a la geometría mediante relieve y brillos. Así las superficies más o menos planas pueden parecer deformadas según la textura que usemos. La capa de brillos es un png transparente y la capa de relieve es un jpg en escala de grises que al poner en<strong> modo multiplicar</strong> da el efecto de que las partes negras se hunden.</p>
<p>Finalmente el vinilo es también un png transparente que aparece sobre el color o la imagen en patrón, según lo que hayamos seleccionado.</p>
<p>Además hay otro Sprite situado en una capa superior al resto, de color rojo y opacidad a 50% que es el que indica, al mostrarse, cuando estamos haciendo rollOver sobre alguna parte del coche.</p>
<h3>La conducción</h3>
<p>Para que el usuario pudiera conducir el coche y, sin complicarme demasiado la vida, tuviera un poco de realismo lo que hice fue coger la entrada de teclado y a partir de la misma actualizar unos valores: steer (izquierda y derecha) y speed (arriba y abajo).</p>
<p>Además utilicé la velocidad del coche para simular una ligera <strong>suspensión</strong>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> update<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;">//rotación de los ejes delanteros según dirección del coche</span>
	eje_der.<span style="color: #006600;">rotationY</span> = steer;
	eje_izq.<span style="color: #006600;">rotationY</span> = steer;
&nbsp;
	<span style="color: #808080; font-style: italic;">//rotación de todas las ruedas según velocidad</span>
	<span style="color: #000000; font-weight: bold;">var</span> roll:<span style="color: #0066CC;">Number</span> = speed<span style="color: #66cc66;">*</span>.4;
	eje_der.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;frnttyrer&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">yaw</span><span style="color: #66cc66;">&#40;</span> -roll <span style="color: #66cc66;">&#41;</span>;
	eje_izq.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;frnttyrel&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">yaw</span><span style="color: #66cc66;">&#40;</span> -roll <span style="color: #66cc66;">&#41;</span>;
	model.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bktyrer&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">yaw</span><span style="color: #66cc66;">&#40;</span> -roll <span style="color: #66cc66;">&#41;</span>;
	model.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bktyrel&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">yaw</span><span style="color: #66cc66;">&#40;</span> -roll <span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//simula una ligera suspensión</span>
	car_parts.<span style="color: #006600;">rotationX</span> = -<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">abs</span><span style="color: #66cc66;">&#40;</span>speed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>steer<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">800</span>;
	car_parts.<span style="color: #006600;">rotationZ</span> += <span style="color: #66cc66;">&#40;</span>-acceleration<span style="color: #66cc66;">*</span><span style="color: #cc66cc;">8</span>-car_parts.<span style="color: #006600;">rotationZ</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">2</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">// Gira y mueve el coche</span>
	<span style="color: #0066CC;">this</span>.<span style="color: #006600;">yaw</span><span style="color: #66cc66;">&#40;</span> speed <span style="color: #66cc66;">*</span> steer <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">625</span> <span style="color: #66cc66;">&#41;</span>;
	<span style="color: #0066CC;">this</span>.<span style="color: #006600;">moveLeft</span><span style="color: #66cc66;">&#40;</span> speed <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Y eso es todo, o más bien, eso es una pequeña parte de lo que creo que merece la pena contar de un proyecto que duró varios meses de trabajo intenso.</p>
<div class="shr-publisher-267"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.theso3.com/volkswagen-nuevo-polo/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
