Phenomblue nominated for Agency of the Year

The digital agency I work for, Phenomblue, has been nominated for Agency of the Year and Most Innovated Agency Website for the iMedia Agency Awards. This is a pretty big deal, especially since I’ve had a major role in nearly everything that’s been happening at Phenomblue.

You should cast your vote, it ends November 18th.

http://www.imediaconnection.com/awards/agency2011/

Posted in General | Leave a comment

The Precocious QR Code

Seems like QR codes have been getting a really bad wrap recently. With the release of findings that only a fraction of the worldwide population even knows what a QR code is followed by the reports of “infected” codes, it may be that our favorite technological underdog has an even more uncertain future.

We should remind ourselves that new mobile technologies take a tortuously long time to permeate a significant percentage of the population. This rings especially true in the US where mobile technology adoption seems no faster than a crawl. If you look at the numbers, smartphone sales only accounted for 23.4% of all mobile phone sales in the first quarter of this year. This means that the majority of phones being sold still don’t even have the opportunity to utilize QR codes.

Don’t pass judgement on QR codes just yet. The technology is still young and not yet widely available. There are a bunch of other things that we can do help it along:

Better Advocacy

QR codes have only really been trickling into the public eye. Sure, it’s been growing fast but really only in certain areas. The biggest areas of QR use are websites (which seems contradictory), product packaging and publications (magazines, newspapers). There are a million on ways to use QR codes, let’s get creative.

Better Awareness

Advertisers are doing a piss-poor job of educating the public on how to use a QR code. I personally find it annoying and sometimes offensive when I see a graphic attempting to explain how to use that specific code, but I deal with it because the rest of the world doesn’t share the same knowledge. We need to hold the world’s hand until it catches on.

Better Tools

There are tons of QR generators and tracking tools out there, most of them being clones of each other. That’s lame and downright incestuous. Not to mention none of them address the fact QR codes are physically printed. All of the codes I’ve ever generated I’ve had to pull into Illustrator because I’m only given a tiny little PNG at web-standard resolution. Not cool.

Let’s get our act together.

One ray of hope is Phenomblue who is currently developing a QR generator, Open QR, that generates vector image QR codes, for quick and easy sizing, along with the standard traffic analytics offering. It’s not yet publicly available but, you can sign up for the beta on the Open QR website.

If we want this technology to survive and grow we need to do a better job at cultivating it.

Posted in General, Mobile | 4 Comments

Infinity Blade!

By now it seems that posting about Infinity Blade is almost an obligation, coming so late after its meteoric rise to fame. I’ve had tons of screenshots waiting, contemptuously, to be posted but their cause was lost since this very blog had been hacked. Now that I’m back in business, brace yourself for the obligatory homage.

And So It Begins…

First off, Infinity Blade is fuckin’ cool. If you haven’t played it, go drop $500 on an iPad and buy this game. Now that I’ve gotten that out of the way, let me explain it’s greatness and it’s faults.

Unreal for iOS

Infinity Blade introduced the venerable Unreal Engine to the exploding mobile gaming world. The Unreal Engine is the world-class, cutting-edge 3D engine behind some of the biggest and best game titles to date. This move into mobile, along with iD’s Rage Engine, is really telling of where gaming will be branching out to. Who knows, perhaps the future will see the fall of gaming handelds (DS, PSP, etc.) and see our mobile phones as the next generation of gaming platforms.

Polish

No, not those crazy kids from Poland, but rather the incredibly high degree of polish that this game has. The graphics are beautiful enough to rival some XBox 360 games. The audio is incredibly immersive even from just the iPad speakers. The cinematography is fantastic, drawing you in and keeping you immersed, building upon the audio. It’s an incredibly beautiful game all-around.

Storyline

The first downfall, sort of, is it’s storyline. It’s basically non-existent. But honestly, it’s only a downfall compared to it’s console brethren. This is a mobile game and is meant to be played in short stints, not marathon gaming sessions. Its simplistic storyline allows you to get to the point rather than having to remember the two dozen side quests and four story arcs you’re in the middle of. Epic is monopolizing on the fact that people use their mobile devices a certain way instead of forcing you to use it outside of your comfort zone.

Gameplay

Here’s where I’m giving Epic some really big kudos. They’ve realized that this is a touch game, and the gameplay needs to utilize that. So what did they do? They make you actually use touch gestures to play the game. There is a very minimal amount of button touching involved with the game, which is fantastic. Touch devices open up the realm of interaction to a whole to level of possibilities. Mobile app and game developers need to be keen on that and really start to push the envelope.

Physical Interaction

My main complaint is that it’s very awkward to hold the actual device and still utilize all the features of the game. I’m right-handed, so I use my right hand for fighting and my left hand for actually holding my iPad. The problem is there are buttons on the left side of the screen obviously meant to be pressed by your left hand. However, my left hand is busy holding the device, and if I move my thumb to press that button I’ll drop the iPad or have to switch hands, which is awkward and time consuming and not really something I want to do in the heat of battle. I would like to see a little more thought go into interface and physical usage.

Posted in General | Tagged , , , , , , | 1 Comment

Instant Website Game Mechanics

What are two of the biggest markets in the digital consumer world? Porn and games. One company, BigDoor, is making it super simple for anyone to integrate the more socially acceptable of those two markets to your website.

You may be asking, “Why the hell would I want to turn my website into a game?”

Good question!

Integrating this sort of passive, progressive game style into a website opens up a bunch of new avenues for visitors to connect with your website, whether they realize it or not. All of the reasons people love  games are the reasons people will love your website. Just think about it, you could be engaging more deeply with your visitors socially, egotistically and competitively just to mention a few.

Now you’re probably asking, “I’m already on top of this social media gold rush, why would I want another social connection?”

Capital question, sir!

Social media is super young despite how much acclaim it gets. It’s a wild animal, it could go anywhere, do anything. You need to stay on top of it otherwise you’re just going to get kicked off and trampled. However, no matter what its form, social media is here to stay. So, people are going to come to expect a certain level of socialness from any website be it a blog, a store, news site or a local business.

“What about all those other reasons you mentioned?”, you query.

These are a few of the reasons people love games and some of the the tools that UX designers, such as myself, use to enhance a person’s experience with website, application, software, etc. For instance, a lot of people are competitive so offering a competitive use for your website appeals to those users thus creating a higher probability of creating advocates and fans. The same thing goes for the slew of other emotional responses associated with gaming.

I’m not saying that this sort of thing is for everyone, you need to use some discretion. If it doesn’t make sense to do this sort of thing then don’t do it. You won’t see me integrating any game mechanics on this blog. While it would be cool and novel, it just doesn’t make any sense. This is a really cool tool that can be leveraged in the right circumstances, not a shiny decal that you slap on and lower the caliber of your site.

Posted in General | Tagged , , , | 1 Comment

Party in Augmented Reality

I stumbled upon this interesting little video today:

So, it’s kind of a boring video. Just a bunch of Brazilian party-goers oggling a giant screen and waving their arms in the air. Turns out this is a great use of Augmented Reality: it’s on a large scale, it’s interactive, it’s multi-user and apparently very engaging.

Seriously, what a great idea for a big-ass party (probably for some conference). Get a bunch of drunk people to wear weird shirts trying to slap invisible, psychedelic fish-alien things. It’s a recipe for awesome.

Sure, the whole AR-marker-on-a-shirt thing isn’t the newest idea, but it works really well for this application. Apparently they also have coasters with AR markers on them, so there’s that too. Although I don’t know how well a bunch of AR swag would go over here in the states. All the conference parties I’ve been to are no where near this cool.

Posted in Augmented Reality | Tagged , , , | 1 Comment

Free your Unity 3D

Why is a free version of Unity 3D such a big deal?

First off, Unity 3D kicks ass.

Secondly, the ability to build and deploy high-quality 3D applications is available to everyone for the low, low price of $0.

Thirdly, the SDK is already mature and full of great features. The 3rd party, open source libraries for Flash can’t come close to competing with it.

Fourthly, you’re bringing OpenGL and DirectX to the web browser. That beats the hell out of Flash and its slow, software only rendering.

Oh, did I mention it’s free? Flash isn’t even free, and a ton of those who use it have a pirated copy. Although, one of the few things that Flash has on Unity 3D is it’s market saturation. And there’s really no way around that.

All-in-all, I think that offering a free version of Unity 3D is gonna change the game for 3D web apps. Flash’s sluggishness has been the bottleneck of a flourishing 3D web experience. With a little luck, and community support, shit’s gonna get real.

Posted in General | 3 Comments

Color Programming in Flash

When I first thought about trying to wrap code around color values in Actionscript, years ago, I was super intimidated. I conjured up ideas that it was a world full of complex algorithms and crack-brained theories. That’s really about half true.

If your goal is some crazy results then you’re probably going to be dealing with some crazy algorithms. But otherwise the basics of it are pretty straightforward.

Note that I will not be talking about pixel bender in this post.

Color Theory

I’m not really going to talk about color theory at all. Basicaly because I don’t understand enough of it (yet) to talk in any real depth. Just not that color theory is a huge topic and thankfully you’ll only have to deal with a very tiny little part of it.

I have found that the Colour Space Conversions article can come in handy as it explains just about everything you might want to know about color.

Color in Memory

The foundation of color programming is understanding how a color is represented in code.

A color is made of 3 or more channels, each channel being 8 bits in size representing values from 0 to 255. In memory a color is stored as a single unsigned integer (uint) by arranging the bits of each channel side-by-side. So an RGB color would have a total of 24 bits (3 channels) and look something like this:

Color Channels in Memory

No, it’s not a power meter. As you can see the 8 red channel bits are the furthest to the left, then the 8 green bits and finally the 8 blue bits. And no, the bits themselves aren’t red, green or blue, they just represent those colors.

Since the bits are stored side-by-side then the color also has a number value. If all bits in a color are off (zero) then the number value is 0 (which is used to represent black). If all bits are on (one) then the number value depends on how many channels the color has (i.e. 3 channels = 16777215). This max value is used to represent white.

There are two different color spaces in Flash/Flex: RGB and ARGB

RGB is just like the example above with a red channel, green channel and blue channel. This is called a 24 bit color and is pretty standard.

ARGB is like RGB but has an alpha channel. This is called a 32 bit color (because of the extra channel).

Color in Syntax

The most common way for defining a color in code is by using the hex syntax:

// 24 bit colors
var black24:uint = 0x000000;
var white24:uint = 0xffffff;
 
// 32 bit colors
var black32:uint = 0x00000000;
var white32:uint = 0xffffffff;

Just like a hex code in HTML except the hash (#) is replaces by a 0x. Notice that a 32 bit color has two extra values for the alpha channel.

Since a color is also an integer value you could use integers to define your colors:

// 24 bit colors
var black24:uint = 0;
var white24:uint = 16777215;
 
// 32 bit colors
var black32:uint = 0;
var white32:uint = 4294967295;

Color in Code

Now that we know how colors are stored, lets talk about how to tear a color apart to extract it’s different channels. Since the channels are stored side-by-side in an unsigned integer we have to do some bitwise operations to get their values.

If you don’t know what bitwise operations are I would highly advise looking into them. They’re kinda confusing at first but they can be a huge boost to your code.

Here’s the code for grabbing channel values from a color:

// for 32 bit colors
var alpha32:int = color32 >> 24;
var red32:int = color32 >> 16 & 0xff;
var green32:int = color32 >> 8 & 0xff;
var blue32:int = color32 & 0xff
 
// for 24 bit colors
var red24:int = color24 >> 16;
var green24:int = color24 >> 8 & 0xff;
var blue24:int = color24 & 0xff;

The method is this:

  1. Shift the bits to the right by the size of a channel (8) multiplied by number of preceeding channels
  2. Bitwise AND by value 255 (binary 1111, hex 0xff)  to clear any channel bits to the left of desired channel

The resulting channel values will be between 0 and 255.

Now that we can get channel values, how do we stitch them back together to form a cohesive color? More bitwise action!

// for 32 bit colors
var color32:uint = alpha32 << 24 | red32 << 16 | green32 << 8 | blue32;
 
// for 24 bit colors
var color24:uint = red24 << 16 | green24 << 8 | blue24;

The method:

  1. Shift the channel value to the left by the size of a channel (8) multiplied by the number of preceeding channels
  2. Bitwise OR each shifted channel value in order (RGB or ARGB);

Conclusion

That’s about it for the basics. There’s a bajillion things you can do once you know how to tear apart and restitch colors.

Posted in Actionscript | Tagged , , , | 2 Comments

Create an Over-The-Shoulder Camera in Away3D

The Backstory

This tutorial is an accident. No really, a total accident. I was putting together a totally different tutorial when I thought it would be cool to throw Boba Fett in it and explore stuff. So, that unfinished tutorial gave rise to this tutorial.

The Description

I’m not actually sure if it’s called an Over-The-Shoulder camera, but if you’ve ever played any modern 3D adventure game (i.e. Tomb Raider, World of Warcraft, Fable, etc) your camera is usually following behind your character and looking over their shoulder.

I’m sure there are multiple ways to implement an Over-The-Shoulder camera and although this method is far from perfect it is pretty simple.

The Setup

You don’t need anything special. There are really only two basics necessary, a subject (I’m using Boba Fett) and a trusty Camera3D.

The How-To

Please Note: The code snippets here won’t compile if they’re pasted in an actionscript file. You’ll need to refer to the full source code so see how everything fits together.

The first thing you’ll need to do is create Boba. If you’re not sure how to do this go see my MD2 tutorial.

Next we want our camera to follow Boba when ever he moves around. Solutions for this can be complex or surprisingly simple. I like simple, so I just threw Boba and my camera in an ObjectContainer3D.

this.bobaGroup = new ObjectContainer3D();
this.bobaGroup.addChild(this.bobaModel);
this.bobaGroup.addChild(this.view.camera);
this.view.scene.addChild(this.bobaGroup);

So, instead of interacting with the Boba model, you interact with the group and the camera will always be along for the ride.

Now we just need to adjust the cameras position within the group, so we add this line after the camera is added to the group:

this.view.camera.position = new Number3D(75, 300, -1000);

At this point we now have a camera that will always follow Boba Fett around and it positioned behind his right shoulder. Now all we have to do is add in some logic for moving him around:

protected function move():void
{
	if(this.keys[87]) this.bobaGroup.moveForward(10);	// w
	if(this.keys[65]) this.bobaGroup.moveLeft(10);		// a
	if(this.keys[83]) this.bobaGroup.moveBackward(10);	// s
	if(this.keys[68]) this.bobaGroup.moveRight(10);		// d
}
 
private function onEnterFrame(e:Event):void
{
	this.move();
	this.view.render();
}

Now he should move move forward, backward, left and right and the camera should be following along. Albeit, he looks a little odd without any animations but that’s an entirely different beast so we’re not going to worry about it in this tutorial.

The tricky part is using the mouse to look around. We basically have to treat the camera like a TargetCamera3D but have it look at a point in space rather than an actual model.

protected function look():void
{
	var amt:Number;
	var percent:Number;
 
	// left-right camera movement
	if(this.stage.mouseX != this.lastMouseX)
	{
		amt = this.stage.mouseX - this.lastMouseX;
		percent = amt / this.stage.stageWidth;
		this.bobaGroup.rotationY += percent * 360;
		this.lastMouseX = this.stage.mouseX;
	}
 
	// up-down camera movement
	if(this.stage.mouseY != this.lastMouseY)
	{
		amt = this.stage.mouseY - this.lastMouseY;
		this.view.camera.y += amt * 2;
		this.lastMouseY = this.stage.mouseY;
		this.view.camera.lookAt(new Number3D(75, 250));
	}
}
 
private function onEnterFrame(e:Event):void
{
	if(this.mouseDown) this.look();
	this.move();
 
	this.view.render();
}

The camera only moves if it’s vertical movement, horizontal rotation is applied to the group (which is used for turning). The trick to making this work is the lookAt call after moving the camera vertically, this ensures that the camrea is always looking at the right spot in space.

The Example

The Code

Download the code for this example here. Keep in mind that this was built using Flash 10, so if you’re using Eclipse or Flex Builder then you’ll have to change some stuff in your project before it will compile.

Posted in Away3D | Tagged , , | 4 Comments