<?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>mat janson blanchet</title>
	<atom:link href="http://jansensan.net/feed" rel="self" type="application/rss+xml" />
	<link>http://jansensan.net</link>
	<description>User experience consultant and creative technologist from Montréal</description>
	<lastBuildDate>Wed, 23 Jan 2013 22:22:30 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>Of touch screens and game controllers</title>
		<link>http://jansensan.net/of-touch-screens-and-game-controllers</link>
		<comments>http://jansensan.net/of-touch-screens-and-game-controllers#comments</comments>
		<pubDate>Wed, 23 Jan 2013 20:59:49 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Interaction Design]]></category>
		<category><![CDATA[Mobile Development]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=1026</guid>
		<description><![CDATA[In the recent years, video games production and distribution have considerably been democratized. Gone is the time when it was mandatory to purchase expensive SDKs and get a license deal to have your games distributed. Web games and mobile games allow for innovations and reinventions of known models. However, as innovative as this new game market [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Game controller and on screen controller on mobile device" src="http://jansensan.net/images/blog/post0036-header.jpg" alt="Game controller and on screen controller on mobile device" width="640" height="200" /></p>
<p>In the recent years, video games production and distribution have considerably been democratized. Gone is the time when it was mandatory to purchase expensive SDKs and get a license deal to have your games distributed. Web games and mobile games allow for innovations and reinventions of known models.</p>
<p>However, as innovative as this new game market can be, some creators still create games based on classic schemes, and there is nothing wrong with that. For example, even though new styles and sounds were born, rock 'n roll has been around for a while and is here to stay. It may be adapted and reinvented, just like games can be.</p>
<p>Some developers aim to provide their players with a classic feel, but there is a trend that should be put to rest: the on screen gamepad.</p>
<p>&nbsp;</p>
<p><strong>On screen gamepad</strong></p>
<p><img class="alignnone" title="On screen gamepad controls" src="http://jansensan.net/images/blog/post0036-on-screen-controls-01.jpg" alt="On screen gamepad controls" width="640" height="208" /></p>
<p>For those who grew up playing the <a title="NES on Wikipedia" href="http://en.wikipedia.org/wiki/Nintendo_Entertainment_System" target="_blank">Nintendo Entertainment System</a>, the <a title="Sega Master System on Wikipedia" href="http://en.wikipedia.org/wiki/Sega_Master_System" target="_blank">Sega Master System</a> and all the following consoles, a <a title="Gamepad on Wikipedia" href="http://en.wikipedia.org/wiki/Gamepad" target="_blank">gamepad</a> is pretty much with what they learned to play games. <a title="Atari 2600 on Wikipedia" href="http://en.wikipedia.org/wiki/Atari_2600" target="_blank">Joysticks</a>, <a title="Trackball on Wikipedia" href="http://en.wikipedia.org/wiki/Trackball" target="_blank">trackballs</a> and <a title="ColecoVision on Wikipedia" href="http://en.wikipedia.org/wiki/ColecoVision" target="_blank">calculators for which you could swap design</a> were on their way out for home consoles. Over time, gamepads also became more ergonomic and more comfortable, although they were growing more buttons every generation.</p>
<p>Handheld (and thus mobile) game-dedicated devices also made use of these control schemes, from the <a title="Game &amp; Watch on Wikipedia" href="http://en.wikipedia.org/wiki/Game_%26_Watch" target="_blank">Game &amp; Watch</a>, the <a title="GameBoy on Wikipedia" href="http://en.wikipedia.org/wiki/Game_Boy" target="_blank">GameBoy</a>, the <a title="Sega Game Gear on Wikipedia" href="http://en.wikipedia.org/wiki/Sega_Game_Gear" target="_blank">Game Gear</a> to the following devices.</p>
<p>Games were built around these human-computer interfaces, just like PC games were built for keyboard and mouse interaction.</p>
<p>And then came touch screens.</p>
<p>The <a title="Nintendo DS on Wikipedia" href="http://en.wikipedia.org/wiki/Nintendo_DS" target="_blank">Nintendo DS</a> may have been the first device to bring a touch screen to mainstream gamers. Although at first, games were not using the full potential of that screen.</p>
<p>A couple of years later, the iPhone came out and brought games and touch screens to the mainstream populace. Other phones had a touch screen before, but none caught the heart of the customers as much as the iPhone.</p>
<p>No other company claimed they wanted developers to create content for their device, with as much fervor. An <a title="iOS SDK" href="http://en.wikipedia.org/wiki/IOS_SDK" target="_blank">affordable SDK</a> and somewhat reasonable profit margin allowed bedroom developers to create games with mainstream reach like never before. And they did.</p>
<p><img class="alignnone" title="On screen gamepad controls" src="http://jansensan.net/images/blog/post0036-on-screen-controls-02.jpg" alt="On screen gamepad controls" width="640" height="209" /></p>
<p>Growing up with gamepads and <a title="Side scrolling game on Wikipedia" href="http://en.wikipedia.org/wiki/Side-scrolling_video_game" target="_blank">side scroller/platformer games</a>, many developers recreated controls they knew and liked. Games like <a title="League of Evil on iTunes" href="https://itunes.apple.com/ca/app/league-of-evil/id405552598?mt=8" target="_blank">League of Evil</a>, <a title="Super Crate Box on iTunes" href="https://itunes.apple.com/us/app/super-crate-box/id483025428?mt=8" target="_blank">Super Crate Box</a>, <a title="Pizza Boy on iTunes" href="https://itunes.apple.com/en/app/pizza-boy/id389318128?mt=8" target="_blank">Pizza Boy</a> and <a title="Pix'n Love Rush on iTunes" href="https://itunes.apple.com/en/app/pixn-love-rush/id373962521?mt=8" target="_blank">Pix'n Love Rush</a> are well executed and fun games.</p>
<p>But they do not belong on a mobile phone or tactile screen.</p>
<p><img class="alignright" title="Gravis gamepad" src="http://jansensan.net/images/blog/post0036-gravis-gamepad.jpg" alt="Gravis gamepad" width="160" height="160" /></p>
<p>Such games require dexterity and a tactile feedback that only a gamepad can provide. A screen feels like glass and is the same all over, it does not provide any feedback, making it very easy for fingers to slip.</p>
<p>In the case of a phone, your fingers end up covering a huge part of the playable area. Sometimes, like it is the case for Pizza Boy, the playable area is just designed smaller to make way for the controls.</p>
<p>It is a waste of good space, but also a bad practice that tries to reproduce an interaction scheme from an altogether different human-computer interface. Just like the <a title="Gravis Gamepad on Wikipedia" href="http://en.wikipedia.org/wiki/Gravis_PC_GamePad" target="_blank">Gravis Gamepad</a> had it wrong when they tried to force a joystick into a gamepad.</p>
<p>&nbsp;</p>
<p><strong>Mobile devices add-ons</strong></p>
<p><img class="alignnone" title="Mobile devices add-ons" src="http://jansensan.net/images/blog/post0036-add-ons.jpg" alt="Mobile devices add-ons" width="640" height="375" /></p>
<p>Realizing that the on screen gamepad caused all sorts of issues, some companies thought of creating hardware that players could add to their mobile devices. These add-ons could be split into two types: those that are affixed to the screen and those that are separate and require an integration into the codebase of the software.</p>
<p>Attaching an add-on to the screen, like the <a title="Fling Mini" href="http://tenonedesign.com/flingmini.php" target="_blank">Fling Mini</a> (bottom left in the image above) and the <a title="Joystick it on ThinkGeek" href="http://www.thinkgeek.com/product/e75a/" target="_blank">Joystick it</a> (bottom center), solves the issue of the expected physical feedback when playing. Parts of the screen still are hidden though, if not more so in some cases. And what if the game designs the gamepad not in line with the add-on placement?</p>
<p>The other types of add-ons are actually smart. The problem in this case is that the hardware developer expects games devs to use their API so that their add-on can be used. It's not that much of an inconvenient, however there is a multitude of add-ons. The image above samples only a few ones: the <a title="iControlPad" href="http://www.icontrolpad.com/" target="_blank">iControlPad</a> (top left), the <a title="iFrogz Caliber Advantage" href="http://www.caliberseries.com/advantage.html" target="_blank">Caliber Advantage</a> (top center), the <a title="iCade 8 Bitty on ThinkGeek" href="http://www.thinkgeek.com/product/ecea/" target="_blank">8 Bitty</a> (center) and the <a title="PhoneJoy" href="http://www.phonejoy.us/" target="_blank">PhoneJoy</a> (right). And there are more. Game devs would then have to incorporate the API of each of those add-ons to provide support for any eventual add-on their clients might use. On the other hand, if the developers don't, the onus falls on the player to purchase many add-ons to be able to play with a controller, depending on which one the game devs chose.</p>
<p>This is ridiculous.</p>
<p>Let's also remember that the success of gaming on mobile phones relies a lot on the fact that the device is already in your pocket, no need to carry anything else.</p>
<p>The advantage of the gamepad on a console is that the gamepad is standardized and works for all games. Each game does not chose what gamepad it supports.</p>
<p><img class="alignleft" title="DS Paddle" src="http://jansensan.net/images/blog/post0036-ds-paddle.jpg" alt="DS Paddle" width="200" height="149" /></p>
<p>There are some exceptions, obviously. A couple years back, a hyperactive reinvention of <a title="Space Invaders Extreme trailer" href="http://youtu.be/5UfB1_Jznvg" target="_blank">Space Invaders</a> was released. For the DS release, an <a title="DS Paddle on Wired" href="http://www.wired.com/gamelife/2007/09/hands-on-why-ta/" target="_blank">add-on paddle</a> was created. The paddle was a hommage to the controls that the arcade Space Invaders sported a while back. It was fun  and novel to play for someone like me who grew up with a gamepad in hand.</p>
<p>But ultimately, the gimmick was superfluous. I would carry my DS in my pocket in the subway, but never the add-on. Customers want was is convenient, and carrying more things in their pocket is not. This argument has been laughed at by many, but over time the rise of gaming on mobile phones has been shown to hurt gaming-dedicated handheld devices sales.</p>
<p>&nbsp;</p>
<p><strong>On screen interaction</strong></p>
<p><img class="alignnone" title="Legend of Zelda - Phantom Hourglass interaction" src="http://jansensan.net/images/blog/post0036-phantom-hourglass.jpg" alt="Legend of Zelda - Phantom Hourglass interaction" width="640" height="239" /></p>
<p>Nintendo has always really been good at making games that explains how to use their innovations, not that all studios or developers were always dedicated enough to apply or explore all those innovative ways.</p>
<p>The Legend of Zelda: Phantom Hourglass was an awesome game that managed to keep its feet rooted in its history while pushing how you use the handheld device in the game. The first thing you notice when playing is that, contrary to previous Zelda games, you move Link by taping holding the stylus where you want him to go. You would also tap directly on the objects and the enemies on screen to interact with them. Sure you can still use the D-pad and the buttons, but that made no sense, the game wasn't built for that.</p>
<p>No on screen gimmick. You want your character to go somewhere? Tap there. Developers should really think of that more often. The <a title="A* search algorithm" href="http://en.wikipedia.org/wiki/A*_search_algorithm" target="_blank">A* algorithm</a> deals exactly with that logic.</p>
<p>Another remarkable thing was that the player could write and take personal notes on the map. Let that sink for a moment. It may seem like nothing, but for so long, inventories and maps might have been editable, but always within the confine of the user interface. This game offered the player the option to draw and write whatever they wanted on the maps, to not have to deal with the interface!</p>
<p>At a point during the game, the player has to fold a map to obtain some information about where to go further. So as a player, you tap, you click, you read and still cannot figure what to do. Eventually, you realize that you actually have to close the DS clamshell and reopen it and ta-da! The ink on you map is transposed from the bottom to the top (or the reverse, I forget).</p>
<p>That's smart! This is making use of the device and its specificities, and not trying to recreate old ways.</p>
<p><img class="alignnone" title="Lost Winds on screen direction control" src="http://jansensan.net/images/blog/post0036-lost-winds.jpg" alt="Lost Winds on screen direction control" width="640" height="234" /></p>
<p>Fast forward a couple of years later. <a title="Lost Winds on Wikipedia" href="http://en.wikipedia.org/wiki/LostWinds" target="_blank">Lost Winds</a> is a side scroller game that was originally released for the Wii. This game already made use of novel ways to move the character by combining the thumbstick of the Wii's Nunchuck and pointing at the screen with the Wiimote.</p>
<p>When this game was <a title="Lost Winds on iTunes" href="https://itunes.apple.com/ca/app/lostwinds/id477973472?mt=8" target="_blank">ported to iOS</a>, I was really curious. I was really charmed with the Wii game, but somehow the iOS port is even better. Pointing at the screen with the Wiimote has been easily adapted into swiping the screen with your finger.</p>
<p>How do you move Toku around without the thumbstick? For one thing, there is no on screen game pad. A bit akin to how you would move Link around in the Phantom Hourglass, simply tap in the direction where you want Toku to go. Don't want to tap, tap, tap and tap again? Simply hold the direction for a while, and Toku will move automatically in that direction. See the screenshots above, there is even a visual indication. While he walks, you can swipe and attack monsters. Tap anywhere and he stops walking.</p>
<p>This is a smart adaptation of the <a title="On-rails definition on Giant Bomb" href="http://www.giantbomb.com/on-rails/92-169/" target="_blank">on-rails</a> feeling that that you get from endless runners, such as <a title="Canabalt" href="http://www.adamatomic.com/canabalt/" target="_blank">Canabalt</a>. While at moments you may want the character to move automatically, at other times you want more control. This is obviously no way to play a reflex-demanding Mega Man game, but tactile screens are not the proper target for those games.</p>
<p>&nbsp;</p>
<p><strong>Create controls for the device you target </strong></p>
<p>With the advent of new microconsoles like the <a title="OUYA" href="http://www.ouya.tv/" target="_blank">OUYA</a> and the <a title="GameStick" href="http://www.kickstarter.com/projects/872297630/gamestick-the-most-portable-tv-games-console-ever" target="_blank">GameStick</a>, and with the <a title="PlayStation Mobile Developer Program" href="http://blog.us.playstation.com/2012/11/19/playstation-mobile-developer-program-launches-download-official-ps-mobile-sdk/" target="_blank">Playstation Vita's affordable SDK</a>, it will be possible for game creators to create games for devices that benefit from an actual game controller, rather than try to recreate those controls. It's too bad that Nintendo is not open to that kind of indie creation, so many game devs would be thrilled to have their games released on Nintendo devices.</p>
<p>There is obviously a <a title="iPhone platform games article on Tech Radar" href="http://www.techradar.com/news/software/applications/7-best-iphone-platform-games-937644" target="_blank">demand</a> for side scrollers and adventure games on mobile phones and touch screen devices, but it's about time that developers start exploring ways of controlling their games according to the device onto which the game is published.</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/of-touch-screens-and-game-controllers/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Moving towards user experience</title>
		<link>http://jansensan.net/moving-towards-user-experience</link>
		<comments>http://jansensan.net/moving-towards-user-experience#comments</comments>
		<pubDate>Mon, 31 Dec 2012 17:00:43 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Information Architecture]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Storyboarding]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=996</guid>
		<description><![CDATA[A couple of years ago Malcom Gladwell presented what he dubbed the 10,000 hours rule, which explains that for one to become proficient with a skill, 10,000 hours have to be invested into that skill. Oddly, most tech journalists and bloggers seem to take this for gospel. I'm not going to dissect and argue against Gladwell [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Digital production positions diagram" src="http://jansensan.net/images/blog/post0035-header.jpg" alt="Digital production positions diagram" width="640" height="377" /></p>
<p>A couple of years ago Malcom Gladwell presented what he dubbed the <a title="Malcom Gladwell's Outliers on Wikipedia" href="http://en.wikipedia.org/wiki/Outliers_(book)">10,000 hours rule</a>, which explains that for one to become proficient with a skill, 10,000 hours have to be invested into that skill. Oddly, most tech journalists and bloggers seem to take this for gospel. I'm not going to dissect and argue against Gladwell here, but rather I have a different perception of his argument. I believe that if I invest this much of myself into a certain unique skill, I'm going to grow bored of it and I will need to move on.</p>
<p>I have been developing and coding for approximately this long, it's time to move in a different direction.</p>
<p>Oftentimes when trying to explain to clients and colleagues that even though I am good at coding, I do not care for it as much as I care for what the user experiences. Even clients, faced with my technical knowledge, wanted to push me towards back-end coding, which has nothing to do with visuals or interfaces, and thus is of no interest to me.</p>
<p>When I <a title="Phil Bonhard - Diagram of some commonly misnamed roles" href="https://twitter.com/UXPhil/status/274123246541099008" target="_blank">stumbled upon</a> the diagram above, it made so much sense to me! It was so clear that I could then illustrate to people, even those who have no technical knowledge, what I do and where I what I am aiming to do. I need to move towards the left side of that diagram, and not the right side!</p>
<p>&nbsp;</p>
<p><strong>Don't let them put you into a box</strong></p>
<p>I have never been a fan of simply being told what to do without seeing the big picture. This is why I always strived to be included in every step of a project, from the brief to the strategy, from the design to the production.</p>
<p>However, not everyone is at ease with that. I once had a manager that was displeased because I wanted to take the time to sketch out storyboards, he thought that our department should only have cared about development, and that storyboarding should only be done by information architects or designers. I think it was short sighted, if I knew the assets I required to build the project and knew how to share the requirements efficiently, why stay confined into the limited description of a job position?</p>
<p>Another time in another place, a director of production had just been hired. He was in charge of the producers/project managers as well as the technical department. From then on, he chose to limit our input to only technical things, we were not to be part of the creative brainstorms. Why would removing the people who build the creative experiences from the creation process be a good idea?</p>
<p>I recently spoke with a friend about expanding or reorienting my service offer, and he suggested that I should choose one specialty, and stick with only this one, rather than many. He thought being technical, creative, strategy- and user-oriented were too many things at once.</p>
<p>A university teacher of mine once said that we should aim to become like the scholars of the Renaissance and try to learn as much as we can from every field. And that is what I want to do, no matter if others feel threatened because they are comfortable with only one specific skill. Too often have we heard stories of specialists, whether they are developers or factory workers, that are rendered useless once a new trend appears.</p>
<p>&nbsp;</p>
<p><strong>Updated service offer</strong></p>
<p><img class="alignnone" title="Sketches" src="http://jansensan.net/images/blog/post0025_004.jpg" alt="Sketches" width="640" height="480" /></p>
<p>With all that in mind, I reorient my service offer towards user experience rather than front end development. Fabricio Teixeira dubbed the person with a multidisciplinary approach to the field <a title="The UX Chameleon and Its Multidisciplinary Skin" href="http://www.uxbooth.com/articles/the-ux-chameleon-and-its-multidisciplinary-skin/" target="_blank">the UX chameleon</a> and I find that image quite apt.</p>
<p>As a user experience consultant, I intend to use my technical knowledge and experience to suggest smart strategies in using technologies to appropriately answer the needs of the user, rather than simply pushing for the latest tech buzzword. I can create documents to help others get a clear understanding of the goals to reach. I aim to work more upstream in the creation process: analyze the client's brief and then work with the strategy and the creative teams.</p>
<p>I have already been drawing sketches, creating user flows and building information architecture for a while, now I am pushing this side of my aptitudes as my main service offer.</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/moving-towards-user-experience/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Marine Science Magnet High School installation</title>
		<link>http://jansensan.net/msmhs-vanderweil-installation</link>
		<comments>http://jansensan.net/msmhs-vanderweil-installation#comments</comments>
		<pubDate>Tue, 27 Nov 2012 03:41:50 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Art Direction]]></category>
		<category><![CDATA[Commercial Works]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Information Architecture]]></category>
		<category><![CDATA[Post Mortem]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Storyboarding]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[AS3Signals]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Float4]]></category>
		<category><![CDATA[Installation]]></category>
		<category><![CDATA[Marine Science Magnet High School]]></category>
		<category><![CDATA[MSMHS]]></category>
		<category><![CDATA[Multitouch]]></category>
		<category><![CDATA[PQ Labs]]></category>
		<category><![CDATA[RealMotion]]></category>
		<category><![CDATA[RobotLegs]]></category>
		<category><![CDATA[TUIO]]></category>
		<category><![CDATA[Vanderweil]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=929</guid>
		<description><![CDATA[Last spring, Float4 started building an installation for Marine Science Magnet High School. This organisation, located in Connecticut close to the Long Island Sound, centers its educational program not only on academic knowledge, but also on natural sciences, mainly marine-related science. I was stoked, because I always wanted to participate into more educational projects, whether [...]]]></description>
			<content:encoded><![CDATA[<p>Last spring, Float4 started building an installation for <a title="Marine Science Magnet High School" href="http://www.marinesciencemagnet.org/" target="_blank">Marine Science Magnet High School</a>. This organisation, located in Connecticut close to the <a title="Long Island Sound in Wikipedia" href="http://en.wikipedia.org/wiki/Long_Island_Sound" target="_blank">Long Island Sound</a>, centers its educational program not only on academic knowledge, but also on natural sciences, mainly marine-related science. I was stoked, because I always wanted to participate into more educational projects, whether for schools or museums. Also, since we were targeting a young audience, we could allow ourselves to design interaction without taking them by the hand and show them how interaction works.</p>
<p>Even though I have posted <a title="Marine Science Magnet High School portfolio entry" href="http://jansensan.net/portfolio/?keywords=msmhs">screenshots in my portfolio</a>–and I hope to get a video of the kids interacting with it eventually–I thought it would be great to share how we built that project, a case study of sorts.</p>
<p>&nbsp;</p>
<p><strong>Navigation</strong></p>
<p>This installation was split between three states of user interaction:</p>
<ul>
<li>Attract: At first, catch the user's eye and interest. It's at this point that you invite the user to interact.</li>
<li>Engage: Once the user interacts, add some information with which the user can play a bit.</li>
<li>Explore: The user can explore the experience further from there. Offer more content upon the user's request.</li>
</ul>
<p>These are just general points as to how you get a user to interact with your installation, which we applied for our installation. Let's see how we designed this.</p>
<p>&nbsp;</p>
<p><strong>Design and user flow</strong></p>
<p>The original concept was heavily influenced by infographic design, with heavy fonts, flat and bright colors. To be honest, it was a bit of a mess, too many elements at once for the eye to know where to look and how to read. However, the idea was there, we simply needed to refine it into a finished product.</p>
<p><img class="alignnone" title="Marine Science Magnet Highschool Vanderveil original user flow" src="http://jansensan.net/images/blog/post0034-user-flow.jpg" alt="Marine Science Magnet Highschool Vanderveil original user flow" width="640" height="224" /></p>
<p>As can be seen in the concept images above, there is a clear disconnect between the design of the map view and the design of the infographic view. There were also lots of elements that needed not be repeated in every state, such as the temperature and other weather information.</p>
<p>I worked with <a title="Raed Moussa" href="http://raedmoussa.com" target="_blank">Raed Moussa</a> to streamline the design, keeping only necessary information. He was able to create a cohesive visual environment between the map and the side view.</p>
<p><img class="alignnone" title="Marine Science Magnet Highschool Vanderveil redesigned user flow" src="http://jansensan.net/images/blog/post0034-redesigned-user-flow.jpg" alt="Marine Science Magnet Highschool Vanderveil redesigned user flow" width="640" height="358" /></p>
<p>As for informational elements, we opted to keep them only where they were pertinent:</p>
<ul>
<li>The attract view contains animated weather information over a map of the Long Island Sound area, with a clear call to action to invite people to touch the screen.</li>
<li>The engage view presents people with some additional information overlaid on the same map that they saw from the attract view. All the information is relative to the map they see: water depth, buoy locations, shipwreck locations and historical events.</li>
<li>The explore view contains a figurative slice view of a coastal region in the same area. Species icons are displayed in locations where said species would usually live, and if the user so desires, more information on each species is available upon touch.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Water depths</strong></p>
<p>One of the scientific information that we had to overlay on the map was the water depths of the area. This information is usually printed directly on the maps or embedded into ships navigational systems. We wanted to display this information in the way topography maps display heights.</p>
<p><img class="alignnone" title="Long Island Sound nautical chart" src="http://jansensan.net/images/blog/post0034-nautical-chart.jpg" alt="Long Island Sound nautical chart" width="640" height="398" /></p>
<p>The inconvenient was that the available maps did not provide it directly. Somehow, most of the depths variations on the map were not big enough, most were simply noted by numbers.</p>
<p><img class="alignnone" title="Water depths highlighted values" src="http://jansensan.net/images/blog/post0034-highlighted-details.jpg" alt="Water depths highlighted values" width="640" height="240" /></p>
<p>So we had an idea: highlight all the numbers with different colors in order to create a heat map. And I mean manually highlight! At first, we ordered the physical maps, we planned on sitting at a desk with markers to highlight the numbers. We looked into how to take a high resolution photo of the map, but the depth numbers came out all blurry. It was a no go.</p>
<p>Finally, we were able to get the digital maps from <a title="Nautical Charts Online" href="http://www.nauticalchartsonline.com/" target="_blank">Nautical Charts Online</a>. From then, I took a couple of days in Photoshop with my graphic tablet to highlight all the numbers according to a range we predetermined. We were able to get a good heat map.</p>
<p><img class="alignnone" title="Long Island Sound water depths as heat map" src="http://jansensan.net/images/blog/post0034-highlighted.jpg" alt="Long Island Sound water depths as heat map" width="640" height="359" /></p>
<p>It was still necessary to incorporate the information of this heat map into the design. Raed was provided a vectorized topographical render of the heat map and was able to incorporate it smoothly into the map.</p>
<p><img class="alignnone" title="Long Island Sound water depths" src="http://jansensan.net/portfolio/assets/images/msmhs_vanderweil/big/007.jpg" alt="Long Island Sound water depths" width="640" height="360" /></p>
<p>&nbsp;</p>
<p><strong>Transition from map to slice view</strong></p>
<p>It was a bit tricky to think of a transition between the map view, which is a flat map of the Long Island Sound area, and the side view, which is a slice view of a coastal area. At the time I was watching Avatar: the Last Airbender cartoon. In its intro, there was exactly what I was looking for! Take a look between 0:12 and 0:28.</p>
<p><object width="640" height="480" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/CggapZLtWdo?version=3&amp;hl=en_US&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed width="640" height="480" type="application/x-shockwave-flash" src="http://www.youtube.com/v/CggapZLtWdo?version=3&amp;hl=en_US&amp;rel=0" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<p><img class="alignnone" title="Avatar the Last Airbender intro" src="http://jansensan.net/images/blog/post0034-avatar-intro.jpg" alt="Avatar the Last Airbender intro" width="640" height="114" /></p>
<p>This was a great inspiration. Being a fan of old Final Fantasy games, I also thought of how the map was tilted back when the characters would hop onto an airship.</p>
<p><img class="alignnone" title="Transition storyboard" src="http://jansensan.net/images/blog/post0034-transition-storyboard.jpg" alt="Transition storyboard" width="640" height="756" /></p>
<p>With the storyboard above, <a title="Francis Dakin-Côté" href="http://www.francisdakin.com/" target="_blank">Francis Dakin-Côté</a> was able to create the perfect transition we needed between the map view and the slice view. This animation is presented when a user chooses to explore the installation more in depth, providing a logical transition between the states. The same animation is played backwards when going from the slice view to the map view.</p>
<p>&nbsp;</p>
<p><strong>Development</strong></p>
<p>As I probably mentioned in earlier posts or tweets, Float4 most often uses RealMotion, its own software. The development was then split in two: the RealMotion graph that handles the interaction and embeds the content, built by <a title="Bruno Gohier" href="http://www.linkedin.com/pub/bruno-gohier/0/4bb/663" target="_blank">Bruno Gohier</a>, and the interface and content, which I built.</p>
<p>Akin to how <a title="Autodesk Scaleform" href="http://gameware.autodesk.com/scaleform" target="_blank">Scaleform</a> allows to embed Flash content, so does RealMotion. Since the content for this installation needed not to live anywhere else, and also since it was mostly a two dimensional multitouch graphical interface, Flash was the most indicated technology to choose here.</p>
<p>As I did for other projects these last years, I built the application with the <a title="RobotLegs" href="http://www.robotlegs.org/" target="_blank">RobotLegs framework</a>. I also used <a title="AS3 Signals" href="https://github.com/robertpenner/as3-signals" target="_blank">AS3 Signals</a> rather than events, which is a charm to work with.</p>
<p>I may have said in other posts that RealMotion can communicate touch points to the application via the <a title="TUIO" href="http://www.tuio.org/" target="_blank">TUIO</a> protocol. I was using the <a title="TUIO AS3" href="http://bubblebird.at/tuioflash/tuio-as3-library/" target="_blank">TUIO AS3 library</a>, although along the way I ended up finding and fixing some of its memory leaks and other issues. Don't get me wrong though, it's still an awesome library.</p>
<p>The development was pretty much straightforward, however I think I haven't done something this demanding on a machine since the <a title="adidas Originals Women's Lookbook" href="http://jansensan.net/portfolio/?keywords=wlb" target="_blank">adidas Originals Women's Lookbook</a>. This project is in full HD (1920 x 1080) at 60 FPS and was required to work in multitouch.</p>
<p>The transition animation ended up being a lot more work than expected. Using a 60 FPS video would prove impossible, as it would take too much time to start and skip too many frames. I tried scrubbing the video manually at every frame, which ended up being worse. I also tried loading dynamically all 360 frames for the transition and built a class that would display the animation. This worked smoothly and was quite satisfying visually. The issue was that once all the images were loaded, the application would freeze while trying to add the images to the stage. And this would only work while developing in FDT, as soon as I tried in a browser or within the context of RealMotion, a crash would occur. So I ended up using two 30 fps videos, one forward and one backwards, since the user has to be free to come back to the map state.</p>
<p>It was not <a title="Float4 Slideshow SS12" href="http://jansensan.net/portfolio/?keywords=slideshow" target="_blank">my first go at multitouch</a>, so I could apply the discoveries I had made there. The main thing was really about keeping track of the touch ids: once an item is touched, no matter how many times other touches disappear from the surface, the item is still considered touched as long as the first id is still touching the item. It would translate into something like this:</p>
<p>ActionScript 3.0:</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">override protected <span style="color: #000000; font-weight: bold;">function</span> onReleased<span style="color: #66cc66;">&#40;</span>_:TuioTouchEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>_.<span style="color: #006600;">tuioContainer</span>.<span style="color: #006600;">sessionID</span> == _touchId<span style="color: #66cc66;">&#41;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #0066CC;">super</span>.<span style="color: #006600;">onReleased</span><span style="color: #66cc66;">&#40;</span>_<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!_isTouched<span style="color: #66cc66;">&#41;</span> _released.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li></ol></pre>
</blockquote>
<p>Another touch behaviour that I implemented from the slideshow was the "touch and hold to trigger". You can read a bit more about that logic in <a title="News and plans for spring and summer 2012" href="http://jansensan.net/news-ss2012" target="_blank">previous post</a>. In this case it was used in an area where images and videos could be dragged, a bit like a vertical carousel. It then became possible to distinguish between dragging to change images and triggering to start a video.</p>
<p>Because laser touch detection cannot be as precise as touch screens, we wanted to avoid small UI elements as much as possible. We decided that textfields would be draggable, like on mobile devices, also because it allowed us to remove the drag bar and the arrows. More space for content.</p>
<p>The weather data presented in the attract view is pulled from the <a title="Yahoo! Weather RSS Feed" href="http://developer.yahoo.com/weather/" target="_blank">Yahoo! Weather RSS Feed</a>, whereas the buoy data is obtained from <a title="NERACOOS" href="http://neracoos.org/" target="_blank">NERACOOS</a>. Actually, if you ever need to use buoy data, contact these guys, there were thrilled to help us use their service. Even before completion of the project, they showcased the installation in their newsletter.</p>
<p>All other historical and animal data is entered in a CMS by the users (students or teachers).</p>
<p>The RealMotion graph contained the Flash content and presented it on screen. Since this software is really strong with visual effects, there was no need to try and implement them in the Flash application. We opted for a water ripple effect, which made sense in the context. As the user touches or swipes the surface, water like waves are created across the screen. In the map view, we also added a mask so that the waves would ricochet off the shores of the coast.</p>
<p>We had to come up with a way to change the states of the waves according to the states of the Flash application. The best way to do so was to send values via the <code><a title="Socket AS3 documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html?filter_flash=cs5&amp;filter_flashplayer=10.2&amp;filter_air=2.6" target="_blank">Socket</a></code> AS3 class. RealMotion contains a module (called "box" in their environment, akin to <a title="Cycling 74 Max" href="http://cycling74.com/products/max/" target="_blank">Max</a>'s) that could receive data from a socket. That box can currently only receive bytes, but I believe that it could grow into something more useful where Flash applications and JavaScript applications could send bytes, integers and strings. Even better, if two way communication could be implemented, a new layer of flexibility would be available to content creators.</p>
<p>&nbsp;</p>
<p><strong>CMS</strong></p>
<p>In order to manage the content, we provided the client with a CMS (Content Management System). I believe that this project can live long and evolve according to the students' work. Rather than provide the client with a paper manual, I took the landing page of the CMS as an instruction page, and suggested how they could use that tool:</p>
<blockquote><p>Do not think of this installation simply as a static repository of information, but rather as a dynamic space to display involving and evolving information concerning the Long Island Sound area. Rather than throwing in all the data at once, maybe there could be a theme for each week or each month.</p>
<p>Here are some ideas:</p>
<ul>
<li>A student's essay receives a great grade: if a student's essay on a subject that is pertinent to the installation (Long Island Sound area, history or sea life) is well written and worth sharing with the school, present it by adding items in the appropriate sections with excerpts of the essay.</li>
<li>Shipwreck week (or month): showcase only shipwrecks in the Engage View section by deactivating all items that are not shipwrecks.</li>
<li>Shellfish week (or month): showcase only shellfish species in the Explore View section by deactivating all items that are not shellfish.</li>
</ul>
<p>Obviously, these are simple examples, but it's up to you to engage the student in using the installation and maybe write content for it to be shared with fellow students.</p></blockquote>
<p>As you can see, I believe that as container as well as content creators, we may have a responsibility to inspire our clients on how to use the tools we create for them. Sometimes it's obvious (product display for business), but in this case, I thought it would be best to also guide teachers and educators. These people already have a lot on their plate, let's make sure what we create answer their needs and doesn't complicate their work.</p>
<p><img class="alignnone" title="CMS information architecture" src="http://jansensan.net/images/blog/post0034-cms-ia.jpg" alt="CMS information architecture" width="640" height="160" /></p>
<p>I built the information architecture for the CMS and gave this information to <a title="WLAB" href="http://www.wlab.ca/" target="_blank">WLAB</a>, the service providers who developed most of the CMS. They used <a title="CakePHP" href="http://cakephp.org/" target="_blank">CakePHP</a>, a framework I didn't know then. To be honest, I found this framework too bloated and convoluted for the needs of this project, a fully custom CMS would have been preferable, quicker and more flexible. The providers became overloaded with other projects, so I asked <a title="Simon Arame" href="http://simonarame.com/" target="_blank">Simon Arame</a> to take over and help us finish the work.</p>
<p><img class="alignnone" title="CMS with design" src="http://jansensan.net/images/blog/post0034-cms.jpg" alt="CMS with design" width="640" height="215" /></p>
<p>In the end I went through the code to separate CSS and JavaScript from the PHP/HTML. Simon helped me deploy the CMS and the database onto the installation machines.</p>
<p>&nbsp;</p>
<p><strong>Installation</strong></p>
<p>The installation itself consists of two separate screens, each with its own computer. One of these computers acts as a server for the CMS, as mentioned above. Each screen is encased with a <a title="PQ Labs" href="http://multi-touch-screen.com/" target="_blank">PQ labs</a> frame, which detects touch points. This hardware is handled by RealMotion.</p>
<p>The installation is somewhere in the high school. As I say at the top of this post, we will eventually film people using the installation. However, as the school is located on the path of <a title="Hurrican Sandy on Wikipedia" href="http://en.wikipedia.org/wiki/Hurricane_Sandy" target="_blank">hurricane Sandy</a> that devastated a lot of the American east coast recently, we will leave them time to sort their priorities before we push for them to let us come in and film.</p>
<p>&nbsp;</p>
<p><strong>Looking ahead</strong></p>
<p>This long project represents a bit how I like to work: touch every bit of the project, do some user experience design and art direction as well as some project management. It gave me a clear view that I'd rather leave hardcore coding aside and put my energy into UX and storyboarding as much as I can.</p>
<p>I'm proud of this project and can't wait to see where the teachers and students of the Marine Science Magnet High School are going to take it!</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/msmhs-vanderweil-installation/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Find out what codecs your browser supports</title>
		<link>http://jansensan.net/codec-detect</link>
		<comments>http://jansensan.net/codec-detect#comments</comments>
		<pubDate>Wed, 31 Oct 2012 04:24:14 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Personal Works]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technologies]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Audio Codec]]></category>
		<category><![CDATA[Audio Tag]]></category>
		<category><![CDATA[Codec]]></category>
		<category><![CDATA[Codec Detect]]></category>
		<category><![CDATA[HTML Tag]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[Video Codec]]></category>
		<category><![CDATA[Video Tag]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=909</guid>
		<description><![CDATA[Even though HTML5 is quite promising, a lot of us realized that the fragmentation of what video and audio codecs are supported is quite an issue. While making a mobile version of Float4's website, I tested on an Android phone and obtained a message from the embedded Vimeo video that the H264 codec was not [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Codec Detect" src="http://jansensan.net/images/blog/post0033-title.jpg" alt="Codec Detect" width="640" height="104" /></p>
<p>Even though HTML5 is quite promising, a lot of us realized that the fragmentation of what video and audio codecs are supported is quite an issue.</p>
<p>While making a <a title="Float4's mobile website" href="http://m.float4.com/" target="_blank">mobile version</a> of Float4's website, I tested on an Android phone and obtained a message from the embedded Vimeo video that the H264 codec was not supported. Even though each browser vendor publishes its own matrix of what they do and do not support, it's not always easy to find out that information quickly. Worse, not all clients are tech savvy, and they may not easily be able to provide you with the necessary information to figure out what codecs their browser or device support.</p>
<p>It came to me that I should create a simple tool to detect what codecs are supported in a browser. I was inspired by websites like <a title="Player Version" href="http://playerversion.com" target="_blank">playerversion.com</a> and <a title="Support Details" href="http://supportdetails.com" target="_blank">supportdetails.com</a> to create <a title="Codec Detect" href="http://codecdetect.com" target="_blank">codecdetect.com</a>. Each website allows any user to find out technical information about their computer, information that they may not be able to know where to find.</p>
<p>So here you go internet, I offer you this tool for you to use to test your browsers and your client's browsers. You may <a title="Codec Detect JavaScript Source" href="http://codecdetect.com/assets/js/main.js" target="_blank">view the JavaScript source</a> all you want to see how I have done it. I will try to maintain and update it to the best of my knowledge, but if you find additional codecs that this tool should test, or better ways to do so, do not hesitate to share!</p>
<p>Link: <a title="Codec Detect" href="http://codecdetect.com" target="_blank">codecdetect.com</a></p>
<p>EDIT (2012/11/05): I have added an email details form to make user's life easier (inspired from SupportDetails), and I have also put all the sources available on a <a title="Codec Detect Github repository" href="https://github.com/jansensan/codec-detect" target="_blank">Github repository</a> for everyone to see. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/codec-detect/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Montréal BlackBerry 10 Jam</title>
		<link>http://jansensan.net/montreal-blackberry-10-jam</link>
		<comments>http://jansensan.net/montreal-blackberry-10-jam#comments</comments>
		<pubDate>Thu, 26 Jul 2012 04:24:19 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Inspiration]]></category>
		<category><![CDATA[Mobile Development]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Technologies]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[BB10]]></category>
		<category><![CDATA[BB10 Dev Alpha]]></category>
		<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[BlackBerry 10]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=865</guid>
		<description><![CDATA[Some two weeks ago, I attended the BlackBerry 10 Jam World Tour in Montréal. It was a nice day and I could have done something else, but hey, learning about new technologies is a passion. With such a name, I sort of expected the sessions to be more hands on into coding, but this event [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="BlackBerry 10 Jam World Tour" src="http://jansensan.net/images/blog/post0032-bb10-jam-header.jpg" alt="BlackBerry 10 Jam World Tour" width="640" height="150" /></p>
<p>Some two weeks ago, <a href="https://twitter.com/jansensan/status/223044007348019200" target="_blank">I attended</a> the <a href="http://www.blackberryjamworldtour.com/" target="_blank">BlackBerry 10 Jam World Tour</a> in Montréal. It was a nice day and I could have done <a href="https://twitter.com/jansensan/status/223043736454696960" target="_blank">something else</a>, but hey, learning about new technologies is a passion. With such a name, I sort of expected the sessions to be more hands on into coding, but this event was more about introducing the latest OS and its intricacies to developers.</p>
<p>&nbsp;</p>
<p><strong>The morning session</strong></p>
<p>Given all the bad press that RIM gets these days, it was understood that the reps had to justify their situation. Without getting too deep into the technical and financial fine points, the company reps boasts that their store grows quickest and offers the most profit per sale.</p>
<p>In fact, RIM is so confident about the future of their upcoming platform that they offer a prize to all certified apps available on their store at the launch of the BlackBerry 10: if the app sold for at least $1,000, but did not exceed the $10,000 mark, they'll cover the difference.</p>
<p><img class="alignnone" title="Conference crowd" src="http://jansensan.net/images/blog/post0032-photo.jpg" alt="Conference crowd" width="640" height="240" /></p>
<p>The morning session concluded with <a href="http://www.linkedin.com/in/christopherdsmith" target="_blank">Chris Smith</a> who presented the architecture of the BlackBerry 10. He boasted that since the OS is built on <a href="http://www.qnx.com/" target="_blank">Qnix</a>, a system quite robust as he explained, BB10 would be the only OS that could run another OS on top of it. He also claimed that the new OS would be backwards compatible, so a dev could write in the latest OS and deploy across multiple generations of BlackBerry phone. That seems almost too good to be true, I'll believe it when I see it.</p>
<p>Cascades, the new UI,  is built on top of <a href="http://en.wikipedia.org/wiki/Qt_(framework)" target="_blank">Qt</a>, a C++ framework of which I heard for the first time recently, since the <a href="http://float4.com/" target="_blank">Float4</a> devs use it to develop their software. This framework functions a bit like <a href="http://en.wikipedia.org/wiki/Flash_component" target="_blank">AS3's components</a>, or Objective-C's <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Framework/_index.html" target="_blank">UIKit</a>: it offers pre-made components that respect the OS's UI.</p>
<p>RIM has decided to spend a lot of time to provide many types of developers the librairies to develop with <a href="https://developer.blackberry.com/" target="_blank">their own tools</a> to target the new BlackBerry 10 platform: <a href="https://developer.blackberry.com/platforms/ndk">C/C++</a>, <a href="https://developer.blackberry.com/html5/" target="_blank">HTML5</a>, <a href="https://developer.blackberry.com/platforms/airsdk" target="_blank">AS3/AIR</a>, <a href="https://developer.blackberry.com/java/" target="_blank">Java</a>, even the <a href="https://developer.blackberry.com/android/" target="_blank">Android runtime</a>! It is an awesome strategy, however I feel that it may be a late move on RIM's part. It sure feels refreshing compared to Apple's stubborn strategy.</p>
<p>However, it's a bit ironic that during his presentation, <a href="http://www.linkedin.com/in/suavek" target="_blank">Suavek Zajac</a> commented that he did not know if it was worth the effort to care about AS3/AIR since that platform might not have a future...</p>
<p>&nbsp;</p>
<p><strong>Native development session</strong></p>
<p>During the afternoon, two sessions were offered: native development and HTML5 development. Since I know already how to develop for the web–and that learning a new JS library shouldn't be too hard–I decided to follow the native presentation.</p>
<p>I honestly believe that Cascades is indeed a beautiful and well though out UI. It's been designed by the Swedish agency <a title="Astonishing Tribe" href="http://www.tat.se/" target="_blank">Astonishing Tribe</a>, and if I remember correctly, RIM acquired them. I found it interesting that the evangelist giving the presentation on the NDK also took the time to make sure that that core UI concepts were understood, that he was not just there to talk tech.</p>
<p><img title="RIM on efficient ergonomics" src="http://jansensan.net/images/blog/post0032-ui.jpg" alt="RIM on efficient ergonomics" width="640" height="306" /></p>
<p>In an example, a user can delete a photo within the application. Rather than having a button labeled "Cancel" like every other platform, it was labeled "Regret". I thought using good copy like this for call to actions brought a more human side to the interface. Too often are we, developers, designers and copywriters, stuck using terms that have been following us for years.</p>
<p>There was talk that the font of the overall UI could eventually be customized at the application level. This may open the door for really bad design choices. All the time that was put on designing a clean UI might be worthless if developers or designers are allowed to tinker with that. The only reason why this might be useful is for localization, where some specific characters are needed, like Japanese, Chinese, Korean, Cyrillic, and others. Otherwise, I believe the fonts should not be editable. We'll see where that choice of theirs lead.</p>
<p><img title="BB10 NDK APIs" src="http://jansensan.net/images/blog/post0032-architecture.jpg" alt="BB10 NDK APIs" width="640" height="466" /></p>
<p>Obviously, there were tons of tech talk. Zajac started with a really low level explanation of the event system–which kind of scared me by the computer science knowledge required to understand it–but went on to explain Cascades and how it was built on top of Qt. The UI has a dark theme with light blue highlights, quite slick! There seems to be a drag and drop interface builder that comes along the NDK, which reminds me of Flex Builder and XCode. The markup necessary for building such interfaces is QML, which feels like JSON. An interesting note is that JavaScript can be used directly in QML.</p>
<p>In the many examples presented, copy and labels were always hardcoded, which is a bad idea if you've ever had to localize your content. It seems that there is a way to use variables to replace those values. As I understood, it'd be written a bit like how it's done in PHP or Ant.</p>
<p>Many things come out of the box with the NDK, amongst what was mentioned, a couple caught my interest. There seems to be some sort of tweening library, and from the quick peek of the code that was shown, it felt like the concatenation of the animations had a similar syntax to how it's done in jQuery.</p>
<p>There is also an API to allow users to do in-app purchases with the credit card that is already registered to their BlackBerry account. Mind you, I believe that's the same logic that other platforms use, but since I never had to use such an API, I though it was smart to leverage user information already recorded and offload all the security issues to the company platform rather than having to deal with that at the application level.</p>
<p>When an app is installed on a BlackBerry, the app requests authorization to access different things, a bit like how Facebook does it. Having this in iOS might have avoided recent debacles where personal information was tracked without user consent. <a href="https://twitter.com/jansensan/status/223109921552613378" target="_blank">I thought this was new</a>, but it seems that BlackBerry <a href="https://twitter.com/jpinkerton/status/223110214168215554" target="_blank">had that for a while</a>.</p>
<p>The most interesting concept is probably the idea of invocation. The invocation framework allows for an app to register to some actions for all other apps. The simplest example is if someone created a clipboard app, the copy/paste functionality could register to all apps that have editable text, without having to add code to other apps. Another example is a sharing application that could allow you to share photos or text to certain network. The app could register to actions relative to text or images, so that whenever the user has a contextual menu with these elements, the actions of the sharing app could be available as well.</p>
<p>&nbsp;</p>
<p><strong>Thoughts on the new platform</strong></p>
<p><img class="alignright" style="margin-left: 16px;" title="BlackBerry 10 Dev Alpha" src="http://jansensan.net/images/blog/post0032-dev-alpha.jpg" alt="BlackBerry 10 Dev Alpha" width="320" height="428" /></p>
<p>Those who attended the event and asked for it in advance were given a Dev Alpha device to be able to develop for the BlackBerry 10 platform before it's publicly released some time at the beginning of next year.</p>
<p>So I got one too, woot!</p>
<p>I was quite surprised by how light this device is! It's practically 150% the size of the iPhone, with a huge 1280 x 720 pixels resolution. It's also exactly the same height as the Playbook, a nice little touch. Actually, it totally looks and feels like a mini Playbook.</p>
<p>But it's definitely an alpha version. The UI is clearly not ready for the device, it's just a port of the Playbook's, no button or label has been resized properly to fit the size that a finger represents on this device. The icons are not ready either, as they seemed stretched and all blocky.</p>
<p>At least, if you develop an app and add a button on screen, it shows with the proper dimensions relative to the target. For example, when I tested an app built with the AIR SDK on the Playbook, the button height was some 44 px, while on the Dev Alpha it ended up at 101 px. It's a nice touch that the UI components handle the DPI themselves.</p>
<p>I am not ready to drop my iPhone anytime soon, nor am I as enthusiastic as <a href="http://www.emiraydin.com/blackberry-10-jam-world-tour-montreal/?Date=072412" target="_blank">some</a>, but I do think that RIM did a good job with their latest OS and communication strategy towards their developers.</p>
<p>Let's keep an eye out for this platform, it might eventually be a good idea to include it in the mobile or tablet suggestions for clients, especially if their markets are not only in North America, as it seems Asia and lots of other markets are quite fond of the BlackBerry universe.</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/montreal-blackberry-10-jam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Float4 Slideshow SS12</title>
		<link>http://jansensan.net/float4-slideshow-ss12</link>
		<comments>http://jansensan.net/float4-slideshow-ss12#comments</comments>
		<pubDate>Wed, 30 May 2012 15:33:25 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Commercial Works]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[Float4]]></category>
		<category><![CDATA[Multitouch]]></category>
		<category><![CDATA[RealMotion]]></category>
		<category><![CDATA[RobotLegs]]></category>
		<category><![CDATA[TUIO]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Vimeo]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=852</guid>
		<description><![CDATA[This winter I was working on a slideshow for Float4 to showcase their portfolio inside of their installations. I had posted my designs and some images in my portfolio, but here is a short video. It's easier to grasp the multitouch logic when you see it in action!]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://player.vimeo.com/video/42988055?byline=0&amp;portrait=0&amp;color=3d75df" frameborder="0" width="640" height="360"></iframe></p>
<p>This winter I was working on a slideshow for Float4 to showcase their portfolio inside of their installations. I had posted my designs and some images in my <a href="http://jansensan.net/portfolio/?keywords=slideshow">portfolio</a>, but here is a short video. It's easier to grasp the multitouch logic when you see it in action!</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/float4-slideshow-ss12/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In development: the TUIOPlaybook</title>
		<link>http://jansensan.net/in-development-the-tuioplaybook</link>
		<comments>http://jansensan.net/in-development-the-tuioplaybook#comments</comments>
		<pubDate>Fri, 18 May 2012 12:05:28 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Personal Works]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technologies]]></category>
		<category><![CDATA[AS3Signals]]></category>
		<category><![CDATA[FDT]]></category>
		<category><![CDATA[Playbook]]></category>
		<category><![CDATA[RobotLegs]]></category>
		<category><![CDATA[TUIO]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=829</guid>
		<description><![CDATA[As I said in the last post, I am currently building a small project to be published onto the BlackBerry Playbook. I am building it in FDT 5.5, using RobotLegs, AS3Signals and TUIO. Above is a short teaser of my work in progress.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.youtube.com/watch?v=DMsRshbhszA"><img src="http://img.youtube.com/vi/DMsRshbhszA/2.jpg"></a></p>
<p><a href="http://www.youtube.com/watch?v=DMsRshbhszA">Click here to view the video on YouTube</a>.</p>

<p><br></p>
<p>As I said in the last post, I am currently building a small project to be published onto the BlackBerry Playbook. I am building it in FDT 5.5, using RobotLegs, AS3Signals and TUIO. Above is a short teaser of my work in progress.</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/in-development-the-tuioplaybook/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>News and plans for spring and summer 2012</title>
		<link>http://jansensan.net/news-ss2012</link>
		<comments>http://jansensan.net/news-ss2012#comments</comments>
		<pubDate>Wed, 02 May 2012 02:43:35 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Commercial Works]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Personal Works]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=808</guid>
		<description><![CDATA[Summer is almost at our doors, on the calendar at least. It's been a while since I wrote, I have been busy: I've traveled, I've been coding, and I've been trying out a couple of different things. Let me bring you up to date. &#160; Flash Gaming Summit 2012 In February, GAMES@CODAME held a contest [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Sunny Cali" src="http://jansensan.net/images/blog/post0030-sunny-cali-2.jpg" alt="Sunny Cali" width="640" height="240" /></p>
<p>Summer is almost at our doors, on the calendar at least. It's been a while since I wrote, I have been busy: I've traveled, I've been coding, and I've been trying out a couple of different things. Let me bring you up to date.</p>
<p>&nbsp;</p>
<p><strong>Flash Gaming Summit 2012</strong></p>
<p><img class="alignnone" title="Flash Gaming Summit 2012 Speakers" src="http://jansensan.net/images/blog/post0030-speakers.jpg" alt="Flash Gaming Summit 2012 Speakers" width="640" height="360" /></p>
<p>In February, <a href="https://twitter.com/GAMESatCODAME" target="_blank">GAMES@CODAME</a> held a <a href="https://plus.google.com/109609915073582817987/posts/QQxVsaJGuY8" target="_blank">contest</a> on their Google Plus page to win a ticket to the <a title="Flash Gaming Summit" href="http://www.flashgamingsummit.com/" target="_blank">Flash Gaming Summit 2012</a> in March in San Francisco. So after a <a href="https://twitter.com/#!/GAMESatCODAME/status/170677075169124353" target="_blank">tight race</a>, I ended up <a href="https://twitter.com/#!/jansensan/status/170874782018060288" target="_blank">winning the ticket</a>! As I said <a href="http://jansensan.net/leaving-sid-lee">before</a>, video games are something towards which I would like to move, and meeting game devs and hearing them speak of their craft could not have been a better blessing.</p>
<p>I managed to meet with animators, entrepreneurs, devs and all sorts of good people. Some talks were really good, while some others were basically just rants. I personally wished that some of them would have been more technical than business oriented. On that angle, Iain Lobb delivered.</p>
<p>Almost as a fanboy, I made sure that I would meet some public figures in the game devs business, so I chatted a bit with <a href="http://twitter.com/thibault_imbert" target="_blank">Thibault Imbert</a>, <a href="http://twitter.com/brunofonzi" target="_blank">Bruno Fonzi</a>, <a href="http://twitter.com/iainlobb" target="_blank">Iain Lobb</a>, and my compatriot <a href="http://twitter.com/untoldent" target="_blank">Ryan Creighton</a>.</p>
<p>Later in the day, <a href="http://www.kongregate.com/" target="_blank">Kongregate</a> held a party at their offices, where I met other cool devs. When I spoke to <a href="twitter.com/robnet" target="_blank">Rob Bateman</a>, who had earlier given a quite interesting speech in favor of open source, I had to find a way to brag about my Away3D tutorials. By the way Rob, I'm still interested in writing tutorials for Away3D!</p>
<p>The next day, I was also lucky enough to be invited to visit a game dev studio not far outside of San Francisco. It's quite refreshing to see a team of devs and artists really work together, I hadn't felt a relationship this tight when I was working in an advertising agency.</p>
<p>&nbsp;</p>
<p><strong>Working with Float4</strong></p>
<p><img class="alignnone" title="Float4's Slideshow" src="http://jansensan.net/images/blog/post0030-slideshow.jpg" alt="Float4's Slideshow" width="640" height="360" /></p>
<p>As you might have understood from some of my tweets and posts, I have been working with <a href="http://float4.com/" target="_blank">Float4</a> in Montréal since January. They specialize in video mapping and interactive surfaces, both with HD resolution or higher. It's quite nice to be able to use high quality graphics rather than being restrained to the small dimensions of the web.</p>
<p>Float4 offers a software, RealMotion, that has many purposes, one of which is to display Flash content. So I mostly have been working in ActionScript 3 for their projects. As Stage3D came to be, we did some tests to see if it would be possible to use within the context of RealMotion. To explain shortly, RealMotion does not incorporate the Flash Player directly. An instance of the Flash Player is launched on a thread, and RealMotion reads the visual output created and displays it on a texture. With Stage3D, that became impossible, since the render is actually done on the GPU directly, and there is no other way to get the render but to try and intercept the visuals directly from the graphic card. When I passed by the Flash Gaming Summit, I asked Thibaut Imbert if he had an idea of how to do this, he referred to PIX, a GPU profiler, but it didn't turn out to be of use on a Windows machine. If you have any suggestion, it would be welcome!</p>
<p>Discovering how to handle multitouch was quite new to me, as I was not used to the possibility that many UI elements could be used at the same time on the same screen. Also, I have been writing for installations where neither a mouse nor a touch screen was used, but rather lasers. In this setup, lasers are scanning a surface in order to determine where the user or users touch.</p>
<p>It may seem like it would not affect how to code, but it's actually quite important! While on a desktop and on a mobile surface it's important to listen to the "up" event (mouse up, touch up), it's not quite logical to do so with lasers, since users would not expect to lift their hand to trigger an action. Therefore, a touch down event acts as a click, and triggers something right away.</p>
<p>In the case of a list–like the iPhone contact list–it's not logical to open the contact as soon as it's touched, since it may be required to scroll. That's why on these device, it's the up event that triggers an action. With lasers, I thought it would be best to introduce the logic of holding the position for a while to launch an action. A timer would start and once a certain amount of time is passed, the action is triggered.</p>
<p>RealMotion communicates with Flash via the <a href="http://www.tuio.org/" target="_blank">TUIO</a> protocol, and its AS3 library, <a href="http://bubblebird.at/tuioflash/tuio-as3-library/" target="_blank">TUIO AS3</a>. The library is open source and quite easy to integrate. Rather than using mouse events, the library comes with its own custom TUIO touch events. What is also quite nice is the guy who manages the library is quite open, listens to comments and adapts accordingly.</p>
<p>But how does one test multitouch during development? It does take time to deploy to the installation every time, and let's be honest, it's not always available to the developer. Luckily, it's possible to install an <a href="http://code.google.com/p/tuiopad/" target="_blank">iPhone app</a> and an <a href="http://code.google.com/p/tuiodroid/" target="_blank">Android app</a> that can turn your device into a multitouch controller for your project. Simply start up the app before you launch your AS3 project, and then they are connect via TCP.</p>
<p>As for projects, I have been working on an update and a localization of a <a href="http://www.flickr.com/photos/float4/sets/72157628191250141/" target="_blank">project for the Canadian government</a> that needed to be displayed in Davos. I hope to obtain some images and footage to add to my portfolio. I also have been working on a slideshow that showcases Float4's portfolio with different AS3 APIs (Vimeo, Flickr, Twitter). You can see a screenshot of that project above this section, I will soon add screenshots to my portfolio. I also have been working on a library that can communicate with RealMotion, so that Float4 can provide clients who want to develop their own content with an API.</p>
<p>&nbsp;</p>
<p><strong>An iPhone app on its way</strong></p>
<p><img class="alignnone" title="QRC" src="http://jansensan.net/images/blog/post0030-qrc.jpg" alt="QRC" width="640" height="240" /></p>
<p>For some reason, I decided to go back to try and learn Objective-C. Since there is no better way to learn something than having an actual project, I will soon release my first iOS app! I finally understood how to link visuals to the code, and how to add and remove event handlers. Despite a lot of idiosyncrasies, XCode is a good IDE for the job. The code completion is marvellous, the interface is Apple-like (ie: fine tuned to the bone), but some features for quick coding and ease are missing. I may try and work more in that environment in the future.</p>
<p>&nbsp;</p>
<p><strong>A new toy</strong></p>
<p><img class="alignnone" title="BlackBerry Playbook" src="http://jansensan.net/images/blog/post0030-playbook.jpg" alt="BlackBerry Playbook" width="640" height="360" /></p>
<p>During March, BlackBerry had a 50% off deal on their PlayBook tablet. I never really felt the need to own a tablet, and I thought the iPad was way too big and expensive. After attending the Flash Gaming Summit though, I thought that tablets could be an awesome target for games, and that there is no better way to understand how a device works than own and use one.</p>
<p>To my surprise, BlackBerry offers an awesome <a href="https://bdsc.webapps.blackberry.com/air/api" target="_blank">AIR SDK</a> to develop for the PlayBook with their own UI. Smart! I had some <a href="http://bugs.powerflasher.com/jira/browse/FDT-2692" target="_blank">issues</a> while trying to run it on FDT, but <a href="http://supportforums.blackberry.com/t5/Adobe-AIR-Development/FDT-officially-supported-by-the-BlackBerry-10-SDK/td-p/1695615" target="_blank">a recent post</a> on the BlackBerry forums brings some good news for the future.</p>
<p>I think that I may try to create a TUIO controller app for the PlayBook as my first attempt!</p>
<p>&nbsp;</p>
<p><strong>Going back to hacking</strong></p>
<p><img class="alignnone" title="Circuit Bending Workshop" src="http://jansensan.net/images/blog/post0030-electronics.jpg" alt="Circuit Bending Workshop" width="640" height="160" /></p>
<p>In the spirit of exploring many things digital and analog, I decided to go back to hacking electronics, as I have done for <a href="http://jansensan.net/portfolio/?keywords=tangible" target="_blank">school projects</a> before.</p>
<p>First, I will attend a <a href="http://www.facebook.com/events/276359105786770/" target="_blank">circuit bending workshop</a> given at the <a href="http://www.easternbloc.ca/" target="_blank">Eastern Bloc</a> in Montréal, and see where that takes me. I hope I will play with my <a href="http://www.arduino.cc" target="_blank">Arduino</a> again. I've also been quite interested into looking into the <a href="http://www.raspberrypi.org/" target="_blank">Raspberry Pi</a>, a more than affordable open source computer.</p>
<p>&nbsp;</p>
<p><strong>It may get cloudy</strong></p>
<p><img class="alignnone" title="Cloudy" src="http://jansensan.net/images/blog/post0030-cloudy-2.jpg" alt="Cloudy" width="640" height="240" /></p>
<p>Finally, I thought I should leave you with another tease. I've been doodling and thinking of this little game where a cloud has to water plants and make sure to avoid the sun to not evaporate. The full gameplay is not yet defined, and as you can see I am tackling more than one project at a time. I think this project could be a good excuse to look more into <a href="http://haxe.org/" target="_blank">haXe</a> and <a href="http://www.haxenme.org/" target="_blank">NME</a>.</p>
<p>What have you been up to?</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/news-ss2012/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How to fully fit an Away3D plane in the viewport</title>
		<link>http://jansensan.net/how-to-fully-fit-away3d-plane-in-viewport</link>
		<comments>http://jansensan.net/how-to-fully-fit-away3d-plane-in-viewport#comments</comments>
		<pubDate>Mon, 06 Feb 2012 00:50:12 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Away3D]]></category>
		<category><![CDATA[Stage3D]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=756</guid>
		<description><![CDATA[There has been a lot of people who played with Away3D and built awesome things. A lot of said awesome things were built by people who know, or know someone that knows 3D modeling, which is why the quality has been so awesome. However, it may not always be necessary to build a full 3D [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Escher - Relativity (Detail)" src="http://jansensan.net/images/blog/post0029-escher-header.jpg" alt="Escher - Relativity (Detail)" width="640" height="220" /></p>
<p>There has been a lot of people who played with <a title="Away3D" href="http://away3d.com/" target="_blank">Away3D</a> and built awesome things. A lot of said awesome things were built by people who know, or know someone that knows 3D modeling, which is why the quality has been so awesome. However, it may not always be necessary to build a full 3D world, sometimes a project may simply require some 3D elements over a 2D background. But how do you place an image behind all sorts of 3D objects if Away3D's <code><a title="Away3D View3D source" href="https://github.com/away3d/away3d-core-fp11/blob/master/src/away3d/containers/View3D.as" target="_blank">View3D</a></code> has a black background? I will try and explain the process in this article. Warning: matrices and trigonometry ahead!</p>
<p>&nbsp;</p>
<p><strong>Build it and they will come</strong></p>
<p>Usually, if you want to place an image and make it fit your document dimensions, you simply stretch the image accordingly. In 3D however, it is not as simple, as the world dimensions are not necessarily measured in pixels. While working with the guys from <a title="Float4 Interactive" href="http://float4.com/" target="_blank">Float4</a>, I came to understand that meters are oftentimes used as measurement unit. With that in mind, we cannot directly use the dimensions of our document.</p>
<p>So let's say we want to place an image in the 3D world and make it fill the viewport (the visual space taken by Away3D). At first, we would need an image, and a plane onto which we would like to place the image. As <a title="Apply a texture on a cube in Away3D 4.0" href="http://jansensan.net/apply-a-texture-on-a-cube-in-away3d-4-0" target="_self">I wrote previously</a>, materials applied onto shapes need to be in dimensions that are a power of 2, so will will need to rescale our image. A <code><a title="AS3 Matrix documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Matrix.html" target="_blank">Matrix</a></code> will fulfill this need.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> const <span style="color: #0066CC;">WIDTH</span>:uint = <span style="color: #cc66cc;">640</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> const <span style="color: #0066CC;">HEIGHT</span>:uint = <span style="color: #cc66cc;">640</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> const MATERIAL_WIDTH:uint = <span style="color: #cc66cc;">1024</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> const MATERIAL_HEIGHT:uint = <span style="color: #cc66cc;">1024</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">&quot;assets/images/escher-relativity.png&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> const EscherImageClass:<span style="color: #000000; font-weight: bold;">Class</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _imageData:BitmapData;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _matrix:Matrix;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _material:BitmapMaterial;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _plane:Plane;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _view3D:View3D;</div></li></ol></pre>
</blockquote>
<p><code>WIDTH</code> and <code>HEIGHT</code> represent the dimensions of my document, and also the dimensions of the image. The <code>MATERIAL_WIDTH</code> and <code>MATERIAL_HEIGHT</code> represent the dimensions needed for the material, dimensions that are a power of two. Here I will be using an image from <a title="M. C. Escher on Wikipedia" href="http://en.wikipedia.org/wiki/M._C._Escher" target="_blank">Escher</a>, obtained from Wikipedia. There is no need for a <code><a title="AS3 Bitmap documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Bitmap.html" target="_blank">Bitmap</a></code> per se, but we will need the image's <code><a title="AS3 BitmapData documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html" target="_blank">BitmapData</a></code>, hence the <code>_imageData</code> variable.</p>
<p>Let's do this!</p>
<p>Normally, I resize the material dimensions to a value higher than what I need to display; first the material is stretched up, and then visually fitted to the original dimensions of the image. If we were to scale the material to smaller dimensions than that of the image, the plane would stretch up the material afterwards when displaying the image, resulting in possible loss of smoothness or detail.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_matrix = <span style="color: #000000; font-weight: bold;">new</span> Matrix<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_matrix.<span style="color: #006600;">scale</span><span style="color: #66cc66;">&#40;</span>MATERIAL_WIDTH / <span style="color: #0066CC;">WIDTH</span>, MATERIAL_HEIGHT / <span style="color: #0066CC;">HEIGHT</span><span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
</blockquote>
<p>Let's draw an instance of the Escher image into the<code>_imageData</code>. This is where <code>_matrix</code> comes in handy. I wonder what pushed Adobe's engineers to make an architectural choice where they thought users would use a <code><a title="AS3 ColorTransform documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/ColorTransform.html" target="_blank">ColorTransform</a></code>, a <code><a title="AS3 BlendMode documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BlendMode.html" target="_blank">BlendMode</a></code> or a clipping <code><a title="AS3 Rectangle documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Rectangle.html" target="_blank">Rectangle</a></code> more often than a flag to smooth the drawing. I mean, putting the flag as a last argument? Anywho, let's add a lot of <code>null</code> parameters...</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_imageData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span>MATERIAL_WIDTH, MATERIAL_HEIGHT<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_imageData.<span style="color: #006600;">draw</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> EscherImageClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, _matrix, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
</blockquote>
<p>Next, create the material. As seen <a title="Apply a texture on a cube in Away3D 4.0" href="http://jansensan.net/apply-a-texture-on-a-cube-in-away3d-4-0" target="_blank">previously</a>, let's use a simple trick to assign whether or not the material is mipmapped.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_material = <span style="color: #000000; font-weight: bold;">new</span> BitmapMaterial<span style="color: #66cc66;">&#40;</span>_imageData, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_material.<span style="color: #006600;">mipmap</span> = <span style="color: #66cc66;">&#40;</span>_imageData.<span style="color: #0066CC;">width</span> == _imageData.<span style="color: #0066CC;">height</span><span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
</blockquote>
<p>Apply the material to the plane, add the plane to the <code><a title="Away3D View3D source" href="https://github.com/away3d/away3d-core-fp11/blob/master/src/away3d/containers/View3D.as" target="_blank">View3D</a></code>, and then add the view to the display list.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane = <span style="color: #000000; font-weight: bold;">new</span> Plane<span style="color: #66cc66;">&#40;</span>_material<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_view3D = <span style="color: #000000; font-weight: bold;">new</span> View3D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_view3D.<span style="color: #006600;">scene</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>_plane<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">addChild<span style="color: #66cc66;">&#40;</span>_view3D<span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
</blockquote>
<p>Do not forget to listen to <code>Event.ENTER_FRAME</code> and call the <code><a title="Away3D View3D.render() documentation" href="http://away3d.com/livedocs/away3d-core-fp11/away3d/containers/View3D.html#render()" target="_blank">View3D.render()</a></code> method at every update.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ENTER_FRAME</span>, updateHandler<span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
</blockquote>
<p>Run it, and what do we get?...</p>
<p>Nothing.</p>
<p>Uh?</p>
<p>By default, the plane is added at (0, 0, 0), so it should be visible...</p>
<p>It is, it turns out that an API choice—which may make sense in a 3D world, but that I do not understand—puts the plane with its face up on instantiation. What this means is when it is created, we see its side, which has no thickness. Just change the <code>yUp</code> parameter to <code>false</code>, so the new plane will then face the camera upon creation.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane.<span style="color: #006600;">yUp</span> = <span style="color: #000000; font-weight: bold;">false</span>;</div></li></ol></pre>
</blockquote>
<p>We should get something like this.</p>
<p><img class="alignnone" title="Plane is too close, image is cropped by viewport" src="http://jansensan.net/images/blog/post0029-escher-too-big.jpg" alt="Plane is too close, image is cropped by viewport" width="640" height="640" /></p>
<p>If we compare the image and this result, we notice that the image's edges are cropped, which means the plane is too close. Below is a diagram explaining this visually.</p>
<p><img class="alignnone" title="Diagram - too big, outside of viewport" src="http://jansensan.net/images/blog/post0029-too-big-diagram.jpg" alt="Diagram - too big, outside of viewport" width="640" height="272" /></p>
<p>Imagine a pyramid drawn from the camera at its top with an angle that is the camera's <a title="Field of view on Wikipedia" href="http://en.wikipedia.org/wiki/Field_of_view" target="_blank">field of view</a>, up until a certain point. From the camera's point of view, there is always a certain frame that is visible, that is the viewport. However, that pyramid is not infinite, actually what the camera sees is not even a pyramid. The <a title="Viewing frustum on Wikipedia" href="http://en.wikipedia.org/wiki/Viewing_frustum" target="_blank">viewing frustum</a>, what is visible within a 3D world, is an area from a certain threshold (the near plane) to another one (the far plane), that's what is visible within a 3D world. What happens with the code above is that the plane is bigger than the frustum, thus being cut.</p>
<p>Below is what we want to achieve:</p>
<p><img class="alignnone" title="Diagram - Plane fits into the viewport" src="http://jansensan.net/images/blog/post0029-viewport-diagram.jpg" alt="Diagram - Plane fits into the viewport" width="640" height="240" /></p>
<p>&nbsp;</p>
<p><strong>SOH-CAH-TOA</strong></p>
<p>This is where the fun begins! How do we fit our plane into our viewport? It is possible to simply move the plane on the z axis and eventually position the plane properly to fit our need. But what if the dimensions change? We'd be back onto square one. This problem requires good ol' trigonometry, and the pythagorean theorem.</p>
<p>You may wonder what this title means. It's a mnemonic trick that's been given to me back in high school on how to remember the rules of trigonometry:</p>
<blockquote><p><strong>S</strong>ine of an angle = <strong>O</strong>pposite side / <strong>H</strong>ypothenuse</p>
<p><strong>C</strong>osine of an angle = <strong>A</strong>djacent side / <strong>H</strong>ypothenuse</p>
<p><strong>T</strong>angent of an angle = <strong>O</strong>pposite side / <strong>A</strong>djacent side</p></blockquote>
<p>Then let's consider this as a trigonometry problem, illustrated below. We have a camera, the <code><a title="Away3d Camera3D source" href="https://github.com/away3d/away3d-core-fp11/blob/master/src/away3d/cameras/Camera3D.as" target="_blank">Camera3D</a></code>, which is located at (0, 0, -500) by default. Look at the sources to confirm, it is the case with Away3D, but it may be different in other 3D engines. We have a plane with a position yet undefined, but we do want to make sure that its fits perfectly into the viewport.</p>
<p><img class="alignnone" title="Diagram - trigonometry and pythagorean theorem" src="http://jansensan.net/images/blog/post0029-z-diagram.jpg" alt="Diagram - trigonometry and pythagorean theorem" width="640" height="240" /></p>
<p>Where does that 60° angle in the illustration above come from? If we take a look at the <code><a title="Away3D Camera3D source" href="https://github.com/away3d/away3d-core-fp11/blob/master/src/away3d/cameras/Camera3D.as" target="_blank">Camera3D</a></code> constructor, we find that it uses a <code><a title="Away3D PerspectiveLens source" href="https://github.com/away3d/away3d-core-fp11/blob/master/src/away3d/cameras/lenses/PerspectiveLens.as" target="_blank">PerspectiveLens</a></code> by default. In that lens constructor, we can see the default field of view is 60, which is in degrees. It's too bad we need to look at the source to obtain this, it would have been simpler to use a getter to be able to check it, but there is none.</p>
<p>Good, we have an angle, we can calculate dimensions and positions. Let's set an arbitrary z for the plane, we'll see further that it doesn't matter.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> angleY:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">60</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> cameraZ:<span style="color: #0066CC;">int</span> = _view3D.<span style="color: #0066CC;">camera</span>.<span style="color: #006600;">z</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> planeZ:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">500</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> distFromCamToPlane:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">abs</span><span style="color: #66cc66;">&#40;</span>cameraZ<span style="color: #66cc66;">&#41;</span> + planeZ;</div></li></ol></pre>
</blockquote>
<p>Since the field of view is vertical, let's measure the height of our plane first. Let's not forget that the field of view covers the whole height, but in order to work with rectangle triangles, we will use only half of that angle. We know the angle, we know the distance from the camera to the plane (the adjacent side), but we do not know the opposite side, so let's use the tangent. The <code><a title="AS3 Math.tan() documentation" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Math.html#tan()" target="_blank">Math.tan()</a></code> takes radians, so just make sure to convert those degrees to radians.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> planeHeight:<span style="color: #0066CC;">int</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">tan</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">PI</span> / <span style="color: #cc66cc;">180</span><span style="color: #66cc66;">&#41;</span> * <span style="color: #66cc66;">&#40;</span>angleY * <span style="color: #cc66cc;">0.5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> * distFromCamToPlane;</div></li></ol></pre>
</blockquote>
<p>Since this represents only half of the height, let's correct it for what we need further.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">planeHeight *= <span style="color: #cc66cc;">2</span>;</div></li></ol></pre>
</blockquote>
<p>To obtain the width of our plane, simply apply the aspect ratio of the image. In this case the image is a square, but it may very well be any kind of rectangle.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> aspectRatio:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">WIDTH</span> / <span style="color: #0066CC;">HEIGHT</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> planeWidth:<span style="color: #0066CC;">int</span> = planeHeight * aspectRatio;</div></li></ol></pre>
</blockquote>
<p>And now we are ready to create our plane with the proper dimensions and position.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane = <span style="color: #000000; font-weight: bold;">new</span> Plane<span style="color: #66cc66;">&#40;</span>_material, planeWidth, planeHeight<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane.<span style="color: #006600;">yUp</span> = <span style="color: #000000; font-weight: bold;">false</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane.<span style="color: #006600;">z</span> = planeZ;</div></li></ol></pre>
</blockquote>
<p>Let's take a look at the whole process at once.</p>
<blockquote>
<pre class="actionscript"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// get the scale to apply to the image</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_matrix = <span style="color: #000000; font-weight: bold;">new</span> Matrix<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_matrix.<span style="color: #006600;">scale</span><span style="color: #66cc66;">&#40;</span>MATERIAL_WIDTH / <span style="color: #0066CC;">WIDTH</span>, MATERIAL_HEIGHT / <span style="color: #0066CC;">HEIGHT</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// create the image data</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_imageData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span>MATERIAL_WIDTH, MATERIAL_HEIGHT<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_imageData.<span style="color: #006600;">draw</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> EscherImageClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, _matrix, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// create the material</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_material = <span style="color: #000000; font-weight: bold;">new</span> BitmapMaterial<span style="color: #66cc66;">&#40;</span>_imageData, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_material.<span style="color: #006600;">mipmap</span> = <span style="color: #66cc66;">&#40;</span>_imageData.<span style="color: #0066CC;">width</span> == _imageData.<span style="color: #0066CC;">height</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// create the view</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_view3D = <span style="color: #000000; font-weight: bold;">new</span> View3D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// camera values</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// see away3d.camerasCamera3D's default lens' field of view</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// in away3d.cameras.lenses.PerspectiveLens</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// it turns out that the field of view is vertical</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> angleY:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">60</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> cameraZ:<span style="color: #0066CC;">int</span> = _view3D.<span style="color: #0066CC;">camera</span>.<span style="color: #006600;">z</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// this position is arbitrary as we will see further</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// useful to calculate the distance between the camera and the plane</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> planeZ:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">500</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> distFromCamToPlane:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">abs</span><span style="color: #66cc66;">&#40;</span>cameraZ<span style="color: #66cc66;">&#41;</span> + planeZ;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// since the field of view is a vertical angle, calculate the height of the plane first</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// use pythagorean theorem to calculate</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// tip for trigonometry: soh-cah-toa</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// toa: tan(angle) = oppositeSide / adjacentSide</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> planeHeight:<span style="color: #0066CC;">int</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">tan</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">PI</span> / <span style="color: #cc66cc;">180</span><span style="color: #66cc66;">&#41;</span> * <span style="color: #66cc66;">&#40;</span>angleY * <span style="color: #cc66cc;">0.5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> * distFromCamToPlane;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// and since it was for a rectangle triangle, thus half the size, double the length</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">planeHeight *= <span style="color: #cc66cc;">2</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// useful for resizing the image</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> aspectRatio:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">WIDTH</span> / <span style="color: #0066CC;">HEIGHT</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// use the aspect ratio to calulcate the width of the plane</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> planeWidth:<span style="color: #0066CC;">int</span> = planeHeight * aspectRatio;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// create the plane</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane = <span style="color: #000000; font-weight: bold;">new</span> Plane<span style="color: #66cc66;">&#40;</span>_material, planeWidth, planeHeight<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane.<span style="color: #006600;">yUp</span> = <span style="color: #000000; font-weight: bold;">false</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_plane.<span style="color: #006600;">z</span> = planeZ;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// add 3D objects to the scene</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_view3D.<span style="color: #006600;">scene</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>_plane<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// add the away3d view to the display list</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">addChild<span style="color: #66cc66;">&#40;</span>_view3D<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// listen to the updates</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ENTER_FRAME</span>, updateHandler<span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
</blockquote>
<p>This should produce a result like <a href="http://jansensan.net/experiments/fit-away3d-plane-fully-in-viewport/" target="_blank">this</a>, where the image fits perfectly in the viewport.</p>
<p><img class="alignnone" title="Plane fits viewport perfectly" src="http://jansensan.net/images/blog/post0029-full-view.jpg" alt="Plane fits viewport perfectly" width="640" height="640" /></p>
<p>For additional fun, I added an option to click to rotate it, so that it demonstrates that it is indeed 3D.</p>
<p>&nbsp;</p>
<p><strong>Sources</strong></p>
<p>As I always do in my tutorials, you can download the <a title="Tutorial sources" href="http://bit.ly/plane-sources">sources</a>. This project has been built for Flash Player 11+ with FDT. You may need to adapt the Flex SDK.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/how-to-fully-fit-away3d-plane-in-viewport/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to improve localization</title>
		<link>http://jansensan.net/how-to-improve-localization</link>
		<comments>http://jansensan.net/how-to-improve-localization#comments</comments>
		<pubDate>Wed, 02 Nov 2011 18:19:24 +0000</pubDate>
		<dc:creator>mat janson blanchet</dc:creator>
				<category><![CDATA[Localization]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://jansensan.net/?p=294</guid>
		<description><![CDATA[I've been meaning to write about this for a while. Even though it is not specifically about development, user experience is something that creative developers should take into account when developing websites, games or other interactive experiences. Let's look at a couple of different ways of offering the user localized content, and try to analyze whether [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Hendrick van Cleve - The Construction of the Tower of Babel" src="http://jansensan.net/images/blog/post0028-babel.jpg" alt="Hendrick van Cleve - The Construction of the Tower of Babel" width="640" height="360" /></p>
<p>I've been meaning to write about this for a while. Even though it is not specifically about development, user experience is something that creative developers should take into account when developing websites, games or other interactive experiences. Let's look at a couple of different ways of offering the user localized content, and try to analyze whether these options fall flat on their face or offer enough flexibility to answer your client's and their customers's needs.</p>
<p>Clients that offer services in multiple countries require their content to be localized, and for a good reason: inhabitants of all regions of the world want to be respected and obtain content in their own language. And I agree, it's a simple matter of respect.</p>
<p>&nbsp;</p>
<p><strong>The usual suspects</strong></p>
<p>The way localization is most often achieved is by detecting the user's country automatically. This can either be done by localizing the <a title="Wikipedia - IP" href="http://en.wikipedia.org/wiki/Internet_Protocol" target="_blank">IP</a> address (<a title="IP Address Localization" href="http://ip.bd0.net/" target="_blank">see an example</a>), soon by simpler means with HTML5's geolocation (<a title="HTML5 Geolocation Demo" href="http://html5demos.com/geo" target="_blank">see an example</a>) or by asking the user to select a country.</p>
<p><a title="LaCie" href="http://www.lacie.com/" target="_blank">LaCie</a> does just that.</p>
<p><img class="aligncenter" title="LaCie's landing page" src="http://jansensan.net/images/blog/post0028-lacie.jpg" alt="LaCie's landing page" width="640" height="360" /></p>
<p>I think that this last option is lazy, both on the company's and on the developer's part. The user should not have to make such choices, especially when there are ways to make such a selection invisible.</p>
<p>What happens from there is that the website content is presented in the language relative to the country. It mostly works, but there are some situations where this logic is not sufficient. Let's take the example of some European countries, like Belgium and Greece. In Belgium, French, Dutch (<a title="Wikipedia - Flemish" href="http://en.wikipedia.org/wiki/Flemish" target="_blank">Flemish</a>) and German are the official languages. In Greece, where obviously Greek is the language, there is also need for a <a title="Wikipedia - Greek Alphabet" href="http://en.wikipedia.org/wiki/Greek_alphabet" target="_blank">specific alphabet</a>.</p>
<p>From <a title="adidas.com" href="http://adidas.com" target="_blank">adidas</a>'s country selection page, if either Greece or Belgium is chosen, the user has no choice but to visit an English website.</p>
<p><img class="aligncenter" title="adidas language selection page" src="http://jansensan.net/images/blog/post0028-adidas-01.jpg" alt="adidas language selection page" width="640" height="360" /></p>
<p>To adidas's credit, there is the option to change country at any time, the site even offers you a choice whether or not you want the cookie to remember your country selection.</p>
<p><img class="aligncenter" title="adidas asks if the chosen country is to be remembered for next time" src="http://jansensan.net/images/blog/post0028-adidas-02.jpg" alt="adidas asks if the chosen country is to be remembered for next time" width="430" height="255" /></p>
<p>Some websites, such a <a title="nike.com" href="http://www.nike.com/" target="_blank">Nike</a>'s may offer a simpler solution, only choose your language, not the country.</p>
<p><img class="aligncenter" title="Nike's website offers to choose a language, not a country" src="http://jansensan.net/images/blog/post0028-nike.jpg" alt="Nike's website offers to choose a language, not a country" width="640" height="360" /></p>
<p>All these options ask an action from the user before they can even see your products or services, and that small irritant is the first interaction they have with your website.</p>
<p>&nbsp;</p>
<p><strong>The mistaken</strong></p>
<p>In all online stores (let's not call these e-commerce no more, please?), there comes a moment where you want to write your shipping address to obtain your purchases. If you have offered your clients a multilingual website, it's just normal that the input fields should support special characters too, regardless of the language the client chose.</p>
<p>When I moved back from Amsterdam to Montréal, I had to change many addresses for many of my services, both physical and online.</p>
<p>Apple requires me to have a valid credit card in the country that I select, as their products availabilities are based on the locale. However, their form failed when I entered my address.</p>
<p><img class="aligncenter" title="Apple's address form" src="http://jansensan.net/images/blog/post0028-apple.jpg" alt="Apple's address form" width="620" height="360" />I get informed that the city, that I wrote "Montréal", contains illegal characters. Obviously, this turned out to be that I should not use the accent. This is ridiculous, the user should not be told there is something wrong when in fact there is not. How complicated is it really to handle accented characters? I mean, if you want to provide multilingual services, get your act together and do it everywhere.</p>
<p>&nbsp;</p>
<p><strong>The ignorant</strong></p>
<p>There is also the peculiar case of Urban Outfitters. The american company has oftentimes been vilified for stealing designs from indie designers or for shamelessly using native names in their product names, so what I will present here should not come as a surprise.</p>
<p>In Québec, a law states that if a business has a brick and mortar store in the province, the business is responsible to also have a French side to it's website. As mentioned in my introduction, it's a matter of respect to your clients in the locale in which you offer your products and services.</p>
<p>Urban Outfitters did not, and when legally instructed to do so, they decided to simply not offer their clients in Québec with <a title="Urban Outfitters's Québec &quot;Website&quot;" href="http://www.urbanoutfitters.com/urban/html/quebec.html" target="_blank">no access to their website whatsoever</a>. Just go to the store.</p>
<p><img class="aligncenter" title="Urban Outfitters's fuck you to Quebeckers" src="http://jansensan.net/images/blog/post0028-urban.jpg" alt="Urban Outfitters's fuck you to Quebeckers" width="640" height="360" /></p>
<p>That is one stupid way to use geolocation! You disrespect a locale and it's language, and at the same time you prevent those in the locale who can speak and read English from having access to your products. Great way to prevent sales!</p>
<p>&nbsp;</p>
<p><strong>The road ahead</strong></p>
<p>Of these different approaches I make the following conclusion and add a recommendation for multilingual website and software creators: first, indeed do geolocation to offer the most relevant content to the user. Do give options to change not only the country, but also the language. <a title="Paypal" href="https://www.paypal.com/" target="_blank">Paypal</a> is the closest to this idea. If you change your location to Canada, you can then change the language to the available languages is that country, namely French and English.</p>
<p>But here is where I want to get to with this post: why stop there? Indeed, do present the most logical languages relevant to that area, but do not block the other languages from being available, especially since you have them in the database already. I understand that it may be mostly be relevant for expats and travelers, but I strongly believe that this kind of market is growing.</p>
<p>The iTunes Store is built in order to lock you into a language depending on your country. Websites like <a title="YesAsia.com" href="http://yesasia.com/" target="_blank">YesAsia</a> are built with the idea that the content should be available to everyone, even if the clients are not from Hong Kong, Japan or Korea, where their offices are. They offer not only options for locales and languages, but a reference to the value of the currency so the customers may have a general idea of what they will pay.</p>
<p><img class="aligncenter" title="YesAsia's options" src="http://jansensan.net/images/blog/post0028-yesasia.jpg" alt="YesAsia's options" width="640" height="283" /></p>
<p>In the case of Paypal, as I said before languages are chosen by country. They have many more languages, they should offer them. I can understand that there may be issues in doing so. For example, English is not legally bounding in the Netherlands, so important options are not available, not even deleting an account. How about presenting all languages, and just like YesAsia does it, add a note that explains that whatever is said in translations, the version in the official language(s) of the locale prevail?</p>
<p>Ultimately, it's always about how much you really care about your clients. For example, Asian countries dislike it when they are presented with English text rather than localized. Ask your markets to help you make a better localized version of your products, don't just expect your clients to swallow whatever you feed them. This is the kind of stuff metrics will not really show in numbers, this is an analysis you can make from talking with your markets.</p>
]]></content:encoded>
			<wfw:commentRss>http://jansensan.net/how-to-improve-localization/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
